Pricing
from $0.01 / 1,000 results
Personalized Tourist Planner
The Personalized Tourist Planner is an Apify Actor that generates customized multi-day travel itineraries for Indian destinations. It combines real-time data scraping with AI-powered optimization to create personalized trip plans based on user preferences.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
6
Total users
1
Monthly active users
6 months ago
Last modified
Share
Personalized Tourist Planner - Quick Start Guide
Overview
The Personalized Tourist Planner is an Apify Actor that generates customized multi-day travel itineraries for Indian destinations. It combines real-time data scraping with AI-powered optimization to create personalized trip plans based on user preferences.
Key Features
β
Dynamic Input-Based: Generates output entirely from user inputs - no hardcoded data
β
Real-Time Integration: Fetches live weather, attractions, accommodations, and fuel data
β
AI Optimization: Uses Claude 3.5 Sonnet or GPT-4o to create intelligent itineraries
β
Cost Estimation: Calculates accurate trip costs with Β±10% accuracy
β
Intelligent Routing: Suggests attractions based on distance, type, and preferences
β
Risk Assessment: Identifies weather risks, EV charging availability, safety concerns
Quick Start (Local Development)
1. Prerequisites
- Node.js 20+ (LTS)
- npm 9+
- Optional: Anthropic API key for Claude integration
- Optional: OpenAI API key for GPT-4o integration
2. Installation
# Install dependenciesnpminstall# Build TypeScript to JavaScriptnpm run build# OR run in development with ts-node (watches TypeScript)npm run dev
3. Provide Input
The actor reads input from sample-input.json in development mode, or from Apify's input UI in production.
sample-input.json Example:
{"startLocation":"Bengaluru, Karnataka","placeTypes":["hills","nature","historical"],"budget":75000,"durationDays":7,"groupSize":5,"vehicleType":"XUV700","preferences":["EV charging","fine dining","adventure activities"],"maxDistanceKm":400,"llmProvider":"anthropic","verbose":true}
4. Run the Actor
Development Mode (with ts-node, auto-loads sample-input.json):
$npm run dev
Production Mode (compiled JavaScript):
$npm start
Input Schema
All inputs are validated according to input_schema.json:
| Parameter | Type | Required | Range | Description |
|---|---|---|---|---|
startLocation | string | β Yes | - | City and state (e.g., "Bengaluru, Karnataka") |
placeTypes | array | β Yes | 1+ items | Types: beaches, hills, temples, historical, wildlife, shopping, nature |
budget | number | β Yes | βΉ10K-500K | Total trip budget in rupees |
durationDays | number | β Yes | 1-30 | Trip duration in days |
groupSize | number | β No | 1-20 | Number of travelers (default: 1) |
vehicleType | string | β No | Sedan, SUV, EV, XUV700, Creta, etc. | Vehicle type (default: sedan) |
preferences | array | β No | gym stops, EV charging, luxury hotels, etc. | Travel preferences |
maxDistanceKm | number | β No | 50-1000 | Exploration radius from start (default: 500) |
llmProvider | string | β No | anthropic, openai | AI model to use (default: anthropic) |
verbose | boolean | β No | true/false | Enable detailed logging (default: false) |
Output Schema
The actor returns a comprehensive itinerary object with:
{success:boolean;startLocation:{name:string;latitude:number;longitude:number;};totalCost:number;costBreakdown:{fuel:number;stay:number;food:number;attractions:number;misc:number;};costEstimateAccuracy:string;itinerary:Array<{day:number;places:string[];distance:number;cost:number;activities:string;accommodation:string;meals:string[];}>;attractions:Array<{name:string;type:string;location:string;lat:number;lon:number;description:string;entryFee:number;openingHours:string;distanceFromStart:number;}>;accommodations:Array<{location:string;name:string;type:string;category:string;pricePerNight:number;rating:string;amenities:string[];}>;transportation:{vehicleType:string;totalDistanceKm:number;fuelNeeded:number;fuelCostEstimate:number;mileage:number;chargingStops:string[];};risks:string[];recommendations:string[];maps:Array<{destination:string;url:string;}>;generatedAt:string;llmModel?:string;error?:string;}
Development Workflow
Running with Custom Input
Create a new JSON file with your inputs:
cat> my-trip.json <<'EOF'{"startLocation": "Mysore, Karnataka","placeTypes": ["historical", "shopping"],"budget": 50000,"durationDays": 3,"groupSize": 2,"vehicleType": "sedan"}EOF
Then modify src/main.ts to load from this file in dev mode, or deploy to Apify and use the UI.
Building and Testing
# Build TypeScriptnpm run build# Check for lint errorsnpm run lint# Run compiled versionnpm start
Deployment to Apify
-
Install Apify CLI:
$npminstall-g apify-cli -
Initialize/login:
$apify login -
Push to Apify:
$apify push -
The actor will be deployed with:
- Input schema from
input_schema.json - Output schema from
.actor/output_schema.json - Actor specification from
.actor/actor.json
- Input schema from
Environment Variables
For LLM integration, set these environment variables:
# For Anthropic ClaudeexportANTHROPIC_API_KEY="your-anthropic-key"# For OpenAI GPT-4oexportOPENAI_API_KEY="your-openai-key"
Without these, the actor will generate a fallback itinerary based on available attractions.
Project Structure
Tourplanner/βββ .actor/β βββ actor.json # Actor specification v1β βββ output_schema.json # Output schema definitionβββ src/β βββ main.ts # Actor entry point (10-step workflow)β βββ types/β β βββ itinerary.ts # TypeScript interfacesβ βββ utils/β βββ geocoder.ts # Nominatim location geocodingβ βββ weather.ts # Open-Meteo weather APIβ βββ scraper.ts # Attractions/accommodations databaseβ βββ costCalculator.ts # Trip cost estimationβ βββ llm.ts # Claude/GPT-4o integrationβββ dist/ # Compiled JavaScript (generated)βββ input_schema.json # Input validation schemaβββ sample-input.json # Example input for testingβββ package.json # npm configurationβββ tsconfig.json # TypeScript configurationβββ .eslintrc.json # ESLint rules
Data Sources
The actor integrates with these free and premium APIs:
| Source | Purpose | API | Status |
|---|---|---|---|
| Nominatim | Location geocoding | Free, no auth required | β Active |
| Open-Meteo | Weather forecasting | Free, no auth required | β Active |
| Internal Database | Attractions/accommodations | Pre-loaded in code | β Active |
| Anthropic | AI itinerary generation | Requires API key | β Optional |
| OpenAI | AI itinerary generation | Requires API key | β Optional |
Example Usage
Scenario: Week-long Bangalore to Mysore/Coorg trip
Input:
{"startLocation":"Bengaluru, Karnataka","placeTypes":["hills","nature","historical"],"budget":100000,"durationDays":7,"groupSize":4,"vehicleType":"XUV700","preferences":["EV charging","adventure activities","fine dining"],"maxDistanceKm":300,"llmProvider":"anthropic"}
Output Highlights:
- β Start: Bengaluru geocoded to exact coordinates
- β Attractions: Mysore Palace, Nandi Hills, Jog Falls, Bandipur identified
- β Weather: 7-day forecast with temperature and rain risk
- β Cost: βΉ87,500 estimated (fuel: βΉ15K, stay: βΉ35K, food: βΉ25K, attractions: βΉ10K, misc: βΉ2.5K)
- β Route: 8 EV charging stops along optimal path
- β Accommodations: Mysore Heritage Inn, Coorg Coffee Estate Homestay
- β Itinerary: Day-by-day breakdown with places, activities, meals
- β Maps: Google Maps links to all attractions
Troubleshooting
"No input provided" Error
- Dev mode: Ensure
sample-input.jsonexists in project root - Production: Make sure input_schema.json is valid and provided via Apify UI
"LLM generation failed" Warning
- Set ANTHROPIC_API_KEY or OPENAI_API_KEY environment variables
- Actor continues with fallback itinerary if LLM fails
- Not critical - all other data is still generated
"0 accommodations found"
- Check that your start location matches a city in the accommodations database
- Database includes: Bengaluru, Mysore, Coorg
- Extend maxDistanceKm to search in neighboring cities
TypeScript Compilation Errors
- Run
npm installto ensure all dependencies are present - Run
npm run buildto check for type errors - ESLint:
npm run lintto identify code quality issues
API Rate Limits
- Nominatim: 1 request/second (built-in delay)
- Open-Meteo: 10,000 requests/day (typically no limit in practice)
- Anthropic: Depends on subscription (rate-limited per account)
- OpenAI: Depends on subscription (rate-limited per account)
Performance Characteristics
- Geocoding: 2-5 seconds per location
- Weather: 1-2 seconds
- Attractions/accommodations: <1 second (database lookups)
- LLM Generation: 10-30 seconds (Claude/GPT-4o depending on request size)
- Total Runtime: 20-40 seconds (without LLM) to 30-70 seconds (with LLM)
Support & Issues
For issues or feature requests, check the documentation in:
README.md- Full project documentationDEPLOYMENT.md- Production deployment guideINTEGRATION.md- Integration with other systemsPROJECT_SUMMARY.md- Technical architecture
Version: 1.0.0
Last Updated: 11 December 2025
Status: Production Ready β
