Skyscanner APIskyscanner.com ↗
Search Skyscanner flights, airports, and price calendars via API. Get itineraries, booking agent prices, daily/monthly fare grids, and place IDs.
What is the Skyscanner API?
The Skyscanner API provides 4 endpoints covering flight search, airport/city lookup, and fare calendars. The search_flights endpoint returns full itineraries with per-leg segment data, carrier details, pricing options from multiple booking agents, and direct booking URLs. Companion endpoints deliver daily cheapest prices across ~12 months and monthly fare summaries — giving developers the core building blocks for flight discovery and price-tracking applications.
curl -X GET 'https://api.parse.bot/scraper/f1fc6c1e-f28b-4354-8ec8-eed3deed11d3/search_places?query=London&locale=en-US&market=US' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace skyscanner-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Skyscanner Flights API — find cheapest flights and compare prices across dates."""
from parse_apis.skyscanner_flights_api import (
Skyscanner, CabinClass, TripType, InvalidDateFormat
)
client = Skyscanner()
# Resolve a city to get its sky ID and geo ID for price calendars.
place = client.places.search(query="New York", limit=1).first()
if place:
print(f"Resolved: {place.name} → sky_id={place.place_id}, geo_id={place.geo_id}")
# Search flights from New York to London on a future date.
for flight in client.flights.search(
origin="New York",
destination="London",
date="2026-07-15",
cabin_class=CabinClass.ECONOMY,
limit=3,
):
leg = flight.legs[0]
print(f"{flight.formatted_price} {leg.origin.code}→{leg.destination.code} "
f"{leg.duration_minutes}min {leg.carriers[0]}")
# Get daily price calendar for a route (uses sky IDs).
for price in client.dailyprices.list(origin="NYCA", destination="LOND", limit=5):
print(f" {price.day}: ${price.price:.0f} ({price.group})")
# Get monthly price calendar using geo IDs from search_places.
for mp in client.monthlyprices.list(
origin_id="27537542",
destination_id="27544008",
trip_type=TripType.ONE_WAY,
limit=3,
):
print(f" {mp.year}-{mp.month:02d}: ${mp.price:.0f} ({mp.price_category})")
# Handle a typed error for bad input.
try:
client.flights.search(
origin="Paris", destination="Tokyo", date="not-a-date", limit=1
).first()
except InvalidDateFormat as exc:
print(f"Caught InvalidDateFormat: {exc}")
print("Exercised: places.search / flights.search / dailyprices.list / monthlyprices.list")
Search for airports and cities by name. Returns place IDs (sky IDs and geo IDs) needed for other endpoints. Use this to resolve city/airport names to IDs before searching flights or prices.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Search query (city name, airport name, or IATA code) |
| locale | string | Locale for results |
| market | string | Market/country code |
{
"type": "object",
"fields": {
"query": "string — the search query used",
"total": "integer — number of places returned",
"locale": "string — locale used",
"market": "string — market used",
"places": "array of place objects with place_id, name, iata_code, city_id, city_name, country_id, country_name, geo_id, geo_container_id, location, display_name"
},
"sample": {
"data": {
"query": "London",
"total": 10,
"locale": "en-US",
"market": "US",
"places": [
{
"name": "London",
"geo_id": "27544008",
"city_id": "LOND",
"location": "51.5041174139,-0.0943465343",
"place_id": "LOND",
"city_name": "London",
"iata_code": "LON",
"country_id": "UK",
"country_name": "United Kingdom",
"display_name": "London|England|United Kingdom",
"geo_container_id": "27544008"
}
]
},
"status": "success"
}
}About the Skyscanner API
Place Resolution and Airport Search
Before querying flights or price calendars, use search_places to resolve city names, airport names, or IATA codes into Skyscanner-specific identifiers. The endpoint returns place_id (sky ID), geo_id, geo_container_id, iata_code, and full city_name / country_name fields. Two different ID formats matter downstream: sky IDs (e.g., NYCA, LOND) feed into the daily price calendar, while geo IDs feed into the monthly price calendar.
Flight Search
search_flights accepts a date, origin, destination, adults, cabin_class (ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST), and currency. Results include an array of flights objects, each carrying a price, formatted_price, score, tags, is_self_transfer flag, and a legs array with full segment data. The pricing_options field on each flight lists individual booking agents with their prices and booking URLs. The filter_stats response object summarizes total_results, min_duration, max_duration, available airports, carriers, and stop_prices — useful for building filter UIs. Round-trip searches are supported via the return_date field.
Price Calendars
get_price_calendar_daily returns a prices array of {day, group, price} objects covering roughly the next 12 months for a given route. Each entry references a price_groups tier (e.g., cheap, medium, expensive) defined in the same response. This endpoint uses sky IDs for origin and destination.
get_price_calendar_monthly returns monthly_prices as {year, month, currency, price, price_category} objects. It accepts origin_id and destination_id as geo IDs from search_places, and supports trip_type (one_way or return) and a direct_only boolean filter.
The Skyscanner API is a managed, monitored endpoint for skyscanner.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when skyscanner.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official skyscanner.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a fare alert system using daily price calendar data to notify users when prices on a route drop below a threshold
- Populate a flight search UI with itineraries, carrier names, and per-agent booking URLs from search_flights
- Render a month-by-month fare grid for flexible travelers using get_price_calendar_monthly price_category labels
- Autocomplete airport and city inputs by querying search_places with partial name or IATA code strings
- Compare cheapest one-way vs. round-trip fares on a route using the trip_type parameter in get_price_calendar_monthly
- Track price trends across cabin classes by running search_flights repeatedly with different cabin_class values
- Resolve geo IDs for a list of cities in bulk via search_places before feeding them into price calendar queries
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Skyscanner have an official developer API?+
What does search_flights return beyond a price?+
price and formatted_price, a score, a tags array, an is_self_transfer boolean, and a legs array with per-segment carrier and routing details. The pricing_options field lists individual booking agents with their own prices and booking URLs. The top-level filter_stats object also provides aggregate data like min_duration, max_duration, carriers, and stop-count pricing.Why do the daily and monthly calendar endpoints use different ID formats?+
get_price_calendar_daily uses Skyscanner sky IDs (e.g., NYCA, LOND) which are returned as place_id by search_places. get_price_calendar_monthly uses geo IDs, returned as geo_id by the same endpoint. Running search_places first gives you both values in a single response, so you can feed the correct ID to each calendar endpoint.Does the API return hotel, car rental, or multi-city flight data?+
How fresh are the price calendar results?+
get_price_calendar_daily covers approximately the next 12 months and reflects prices available at query time. Prices on Skyscanner are dynamic and can change frequently, so a cached or stored result may not reflect the current fare. Querying the endpoint fresh for time-sensitive use cases is advisable.