Saga APIsaga.co.uk ↗
Search and retrieve Saga UK holiday excursions with destination filters, pricing, flight details, meal info, and excursion counts via 3 structured endpoints.
What is the Saga API?
The Saga UK Holidays API gives developers structured access to holiday excursion listings from saga.co.uk across 3 endpoints. Use search_excursions to query holidays by destination, sort order, and passenger count, returning paginated results with full pricing, flight, and accommodation data. get_excursion_details retrieves per-listing metadata including departure points, meals, pace, and promotion details by product code.
curl -X GET 'https://api.parse.bot/scraper/5d2201b0-91b3-49b3-a526-b8b52619db87/search_excursions?page=1&sort_by=DepartureDate&per_page=5&passengers=2&holiday_type=Escorted+Tours' \ -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 saga-co-uk-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.
"""Walkthrough: Saga Holidays SDK — search excursions, browse destinations, drill into details."""
from parse_apis.saga_holidays_excursions_api import SagaHolidays, Sort, HolidayType, ExcursionNotFound
client = SagaHolidays()
# Discover available destinations and price range.
catalogue = client.destinationcatalogues.get()
print(catalogue.total_holidays, catalogue.min_price, catalogue.max_price)
for dest in catalogue.destinations[:3]:
print(dest.name, dest.count)
# Search for escorted tours sorted by price, capped at 5 results total.
for excursion in client.excursions.search(holiday_type=HolidayType.ESCORTED_TOURS, sort_by=Sort.PRICE, limit=5):
print(excursion.name, excursion.code, excursion.pricing.group_price, excursion.departure.duration_days)
# Drill into a single excursion from search results.
first = client.excursions.search(destination="Spain", limit=1).first()
if first:
print(first.name, first.destinations, first.metadata.number_of_excursions)
# Fetch full details by product code with error handling.
try:
detail = client.excursions.get(code="SECAH")
print(detail.name, detail.departure.board_basis, detail.pricing.currency)
except ExcursionNotFound as exc:
print(f"Excursion not found: {exc.code}")
print("exercised: destinationcatalogues.get / excursions.search / excursions.get / ExcursionNotFound catch")
Search for holiday excursions with optional destination and holiday-type filters. Returns paginated listings with full details including pricing, flights, accommodation, and excursion counts. Pagination is page-based; each result carries enough detail for display without a separate detail fetch, though get_excursion_details can retrieve a single item by code. Sorted by departure date or price.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| sort_by | string | Sort order for results. |
| per_page | integer | Results per page (max 50). |
| passengers | integer | Number of passengers (1-4). |
| destination | string | Filter by destination name (e.g. 'Spain', 'Italy', 'Japan'). Use get_destinations to see available options. Empty string returns all destinations. |
| holiday_type | string | Filter by holiday type. Empty string returns all types. |
{
"type": "object",
"fields": {
"page": "integer, current page number",
"total": "integer, total number of matching results",
"results": "array of excursion objects with id, name, code, url, destinations, holiday_types, images, departure, pricing, promotions, and metadata",
"per_page": "integer, results per page",
"total_pages": "integer, total number of pages"
}
}About the Saga API
What the API covers
The API surfaces holiday excursion listings from Saga's tour and hotel-stay catalogue. get_destinations returns every bookable destination name alongside a holiday count per destination and the global min/max price range in GBP — useful for building filter UIs or validating destination strings before running a search.
Searching and filtering excursions
search_excursions accepts destination (e.g. 'Japan', 'Spain'), holiday_type ('Escorted Tours' or 'Hotel Stays'), passengers (1–4), sort_by ('DepartureDate' or 'Price'), and pagination controls page and per_page (max 50). Responses include total, total_pages, and an array of result objects each carrying id, code, name, url, destinations, images, departure, pricing, and promotions.
Excursion detail fields
get_excursion_details takes a code (e.g. 'SECAH') and optional passengers count. The response expands the listing into a metadata object covering accommodation_summary, departure_points, meals, number_of_excursions, pace, and board_basis. Pricing is broken out into group_price, single_price, was (original) prices, insurance_price, and currency. The departure object includes date, duration_days, nights, flights, and booking_status. Active promotions are listed with name, description, and value.
Data scope and freshness
All three endpoints reflect the live Saga holiday catalogue. Prices are denominated in GBP. The promotions array on detail and search results lets you surface active offers without a separate request.
The Saga API is a managed, monitored endpoint for saga.co.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when saga.co.uk 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 saga.co.uk 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 destination price-comparison tool using min/max prices from
get_destinationsand per-listinggroup_pricefromsearch_excursions. - Display escorted tour listings filtered by destination and sorted by departure date for a travel aggregator.
- Show single-traveller pricing alongside group pricing using the
single_pricefield fromget_excursion_details. - Surface active promotions for specific holidays by reading the
promotionsarray fromget_excursion_details. - Generate a destination catalogue with holiday counts and price ranges using
get_destinationsfor a travel landing page. - Filter holidays by meal type and excursion count using
mealsandnumber_of_excursionsfrom the detail metadata. - Alert users when a holiday is available for 1–4 passengers by checking
booking_statusand adjusting thepassengersparam.
| 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 Saga have an official public developer API?+
What does `get_excursion_details` return beyond what appears in search results?+
get_excursion_details adds fields not present in search results: accommodation_summary, departure_points, meals, number_of_excursions, pace, board_basis, insurance_price, and the full flights object inside departure. Search results carry enough to list and compare; the detail endpoint carries enough to build a full product page.Can I filter search results by departure date range or price range?+
search_excursions endpoint supports sorting by DepartureDate or Price and filtering by destination, holiday_type, and passengers, but does not currently accept a departure date range or explicit min/max price as filter parameters. You can use get_destinations to get the global price bounds. To add date-range or price-range filtering, you can fork this API on Parse and revise the endpoint to include those parameters.Does the API cover Saga cruise holidays or insurance products?+
How should I get valid destination names for the `destination` filter?+
get_destinations first. It returns an array of objects each with a name string and a count of available holidays. Pass the name value directly as the destination parameter in search_excursions. Using an unlisted name will return zero results.