9.3 KiB
Holiday Travel App - Terminal Usage Guide
This guide shows you how to use the Holiday Travel App entirely from the terminal using PowerShell commands (no web browser needed).
Prerequisites
Make sure the development server is running:
cd "d:\Projects\Dev\Holiday Travel App"
npm run dev
The server will be available at http://localhost:4000
Example 1: Basic Caribbean Search
Search for flights from Ottawa to Caribbean destinations for a holiday trip:
# Create the search criteria
$searchData = @{
origin = "YOW"
destinations = @("CUN", "PUJ", "MBJ") # Cancun, Punta Cana, Montego Bay
startDate = "2025-12-15"
endDate = "2026-01-15"
tripLengthMin = 5
tripLengthMax = 9
budget = 1000
currency = "CAD"
nonStopOnly = $false
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
} | ConvertTo-Json -Depth 3
# Send the request
$response = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
# View all results
$response.results
# View just the first 5 results
$response.results | Select-Object -First 5 | Format-Table title, source, price, nights
Example 2: Budget-Friendly European Search
Looking for cheap flights to Europe with non-stop preference:
$euroSearch = @{
origin = "YYZ" # Toronto
destinations = @("LHR", "CDG", "FCO", "BCN") # London, Paris, Rome, Barcelona
startDate = "2026-06-01"
endDate = "2026-07-15"
tripLengthMin = 7
tripLengthMax = 14
budget = 800
currency = "CAD"
nonStopOnly = $true
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
} | ConvertTo-Json -Depth 3
$euroResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $euroSearch -ContentType "application/json"
# Show only deals under $750
$euroResults.results | Where-Object { $_.price -lt 750 } | Format-Table
Example 3: Quick Weekend Getaway
Short trips, flexible on destinations:
$weekendSearch = @{
origin = "YUL" # Montreal
destinations = @("NYC", "BOS", "YYZ", "YOW") # New York, Boston, Toronto, Ottawa
startDate = "2025-11-15"
endDate = "2025-12-15"
tripLengthMin = 2
tripLengthMax = 4
currency = "CAD"
nonStopOnly = $false
sources = @("Skyscanner", "GoogleFlights", "AirCanada")
} | ConvertTo-Json -Depth 3
$weekendResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $weekendSearch -ContentType "application/json"
# Display results grouped by destination
$weekendResults.results | Group-Object destination | Format-Table Count, Name
Example 4: Deal Sites Only (No Link Generation)
Only fetch from curated deal sites like YOWDeals, YYZDeals, etc.:
$dealsOnly = @{
origin = "YVR" # Vancouver
destinations = @("HNL", "LAX", "SEA") # Hawaii, LA, Seattle
startDate = "2026-02-01"
endDate = "2026-03-31"
tripLengthMin = 5
tripLengthMax = 10
sources = @("Deals") # Only deal sites
} | ConvertTo-Json -Depth 3
$dealsResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $dealsOnly -ContentType "application/json"
$dealsResults.results | Format-List
Example 5: Export Results to CSV
Save search results to a CSV file for further analysis:
$searchData = @{
origin = "YYC" # Calgary
destinations = @("LAX", "LAS", "PHX")
startDate = "2026-01-15"
endDate = "2026-02-28"
tripLengthMin = 5
tripLengthMax = 7
budget = 600
currency = "CAD"
sources = @("Skyscanner", "GoogleFlights")
} | ConvertTo-Json -Depth 3
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
# Export to CSV
$results.results | Export-Csv -Path "travel_deals_$(Get-Date -Format 'yyyy-MM-dd').csv" -NoTypeInformation
Write-Host "Results exported to travel_deals_$(Get-Date -Format 'yyyy-MM-dd').csv"
Example 6: Filter and Sort Results
Advanced filtering and sorting:
$searchData = @{
origin = "YOW"
destinations = @("MCO", "FLL", "TPA") # Orlando, Fort Lauderdale, Tampa
startDate = "2026-03-01"
endDate = "2026-04-15"
tripLengthMin = 6
tripLengthMax = 9
currency = "CAD"
sources = @("Deals", "Skyscanner", "GoogleFlights", "AirCanada")
} | ConvertTo-Json -Depth 3
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
# Filter: Only show results with prices
$withPrices = $results.results | Where-Object { $null -ne $_.price }
# Sort by price (cheapest first)
$sortedByPrice = $withPrices | Sort-Object price
# Display top 10 cheapest
$sortedByPrice | Select-Object -First 10 | Format-Table title, price, currency, nights, source
Example 7: Compare Multiple Sources
Get results and compare which source provides the most deals:
$compareSearch = @{
origin = "YEG" # Edmonton
destinations = @("YVR", "YYC", "YWG")
startDate = "2025-12-01"
endDate = "2026-01-31"
tripLengthMin = 3
tripLengthMax = 5
sources = @("Skyscanner", "GoogleFlights", "AirCanada")
} | ConvertTo-Json -Depth 3
$compareResults = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $compareSearch -ContentType "application/json"
# Count results by source
$compareResults.results | Group-Object source | Select-Object Name, Count | Sort-Object Count -Descending
Example 8: Use with cURL (Alternative to PowerShell)
If you prefer using curl in PowerShell:
curl.exe -X POST "http://localhost:4000/api/search" `
-H "Content-Type: application/json" `
-d '{
"origin": "YOW",
"destinations": ["CUN", "PUJ"],
"startDate": "2025-12-20",
"endDate": "2026-01-10",
"tripLengthMin": 7,
"tripLengthMax": 10,
"budget": 900,
"currency": "CAD",
"sources": ["Deals", "Skyscanner"]
}'
Understanding the Response
The API returns JSON with this structure:
{
"results": [
{
"id": "unique-id",
"title": "Ottawa → Cancun (7 nights)",
"source": "Skyscanner Link",
"link": "https://www.skyscanner.ca/...",
"price": 685,
"currency": "CAD",
"startDate": "2025-12-20",
"endDate": "2025-12-27",
"nights": 7,
"origin": "YOW",
"destination": "CUN",
"stops": null,
"score": 9815
}
]
}
Available Airport Codes (Examples)
- Canada: YOW (Ottawa), YYZ (Toronto), YUL (Montreal), YVR (Vancouver), YYC (Calgary), YEG (Edmonton)
- USA: NYC (New York), LAX (Los Angeles), MIA (Miami), ORD (Chicago), SEA (Seattle)
- Caribbean: CUN (Cancun), PUJ (Punta Cana), MBJ (Montego Bay), NAS (Nassau)
- Europe: LHR (London), CDG (Paris), FCO (Rome), BCN (Barcelona), AMS (Amsterdam)
Troubleshooting
Server not responding?
# Check if server is running
Get-Process -Name node -ErrorAction SilentlyContinue
# Restart the server if needed
cd "d:\Projects\Dev\Holiday Travel App"
npm run dev
Invalid date format?
- Dates must be in
YYYY-MM-DDformat (e.g., "2025-12-31")
No results returned?
- Try removing budget constraints
- Set
nonStopOnlyto$false - Expand the date range
- Add more destination options
Tips for Best Results
- Multiple Destinations: Add 3-5 destination codes for more options
- Flexible Dates: Wider date ranges (30-60 days) yield more results
- Trip Length Range: Use a range (e.g., 5-9 nights) instead of exact days
- Mix Sources: Enable all sources for comprehensive results
- Budget Buffer: Set budget 10-15% higher than your actual limit
- Off-Peak Travel: Search for shoulder seasons for better deals
Automation Example
Create a scheduled task to search daily and email results:
# search_and_notify.ps1
$searchData = @{
origin = "YOW"
destinations = @("CUN", "PUJ", "MBJ")
startDate = "2026-01-15"
endDate = "2026-02-28"
tripLengthMin = 7
tripLengthMax = 10
budget = 800
currency = "CAD"
sources = @("Deals")
} | ConvertTo-Json -Depth 3
$results = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
# Get deals under $750
$goodDeals = $results.results | Where-Object { $_.price -lt 750 }
if ($goodDeals.Count -gt 0) {
$goodDeals | Export-Csv -Path "good_deals.csv" -NoTypeInformation
Write-Host "Found $($goodDeals.Count) deals under $750!"
# Add email notification here if needed
}
Run with Task Scheduler:
$trigger = New-ScheduledTaskTrigger -Daily -At 9am
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\path\to\search_and_notify.ps1"
Register-ScheduledTask -TaskName "DailyTravelDeals" -Trigger $trigger -Action $action
Docker Usage
If using Docker instead of local dev server:
# Build and run
docker compose up -d
# Then use the same API calls as above
$searchData = @{ ... } | ConvertTo-Json -Depth 3
$response = Invoke-RestMethod -Uri "http://localhost:4000/api/search" -Method POST -Body $searchData -ContentType "application/json"
Enjoy finding your next holiday deal from the command line! 🏖️✈️