lastminute APIlastminute.com ↗
Search lastminute.com's UK Last Minute Deals feed for flight + hotel packages. Filter by departure airport, stay length, hotel stars, and traveller count. Prices in GBP.
What is the lastminute API?
The lastminute.com API exposes 1 endpoint — search_deals — that returns live flight + hotel package deals from the UK Last Minute Deals feed, with prices quoted in GBP per person. Each deal record includes the hotel name, destination label, destination code, departure dates, stay length, star rating, and price, letting you query across multiple departure airports and filter by night range and hotel quality in a single call.
curl -X GET 'https://api.parse.bot/scraper/993649ff-68dc-4568-aff4-d633cff8c869/search_deals?sort=recommended&origin=LON&departure_to=2026-12-11&departure_from=2026-10-12' \ -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 lastminute-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.
"""Walkthrough: lastminute.com deals SDK — browse flash-sale holiday packages."""
from parse_apis.lastminute_com_api import LastMinute, DealSort, InputFormatInvalid
client = LastMinute()
# Browse top recommended all-inclusive flash-sale deals departing from London.
for deal in client.deals.search(
origin="LON",
flash_sales_only=True,
sort=DealSort.RECOMMENDED,
limit=5,
):
print(
f"{deal.hotel_name} — {deal.destination}, "
f"{deal.nights}n from {deal.price_display} pp, "
f"expires {deal.deal_expires_at}"
)
# Find the cheapest 5-star deal for at least a week.
long_stay = client.deals.search(
sort=DealSort.PRICE,
hotel_stars="5",
min_nights=7,
limit=1,
).first()
if long_stay is not None:
print(
f"\nBest 5★ week+: {long_stay.hotel_name}, "
f"{long_stay.destination} — {long_stay.departure_date}, "
f"{long_stay.nights} nights, {long_stay.price_from} {long_stay.currency}/pp"
)
# Demonstrate typed error handling for a malformed input.
try:
client.deals.search(departure_from="not-a-date", limit=1).first()
except InputFormatInvalid as exc:
print(f"\nExpected validation error: {exc.message}")
print("\nexercised: deals.search (paginated + .first()) / DealSort / InputFormatInvalid")
Returns the current flight + hotel package deals from lastminute.com's Last Minute Deals feed (UK site, prices in GBP per person) matching the departure airport(s), departure window, stay length, hotel star rating and traveller count. One row per deal (a hotel + departure date + stay length with a 'from' price per person and, for flash-sale deals, an expiry timestamp). Results are returned in a single call ordered by the chosen sort (site 'recommended' order or lowest price first); the feed is not paginated and the largest page the scraper requests is 100 deals, with has_more reporting whether the feed said more exist. A valid search with no matching offers returns an empty deals array. Dates must be ISO YYYY-MM-DD; malformed dates, airport codes or star lists are rejected as stale_input before any request. The site rejects a well-formed but unacceptable value (a past or impossible date, an unknown destination code) with a 400 that is passed through as upstream_error.
| Param | Type | Description |
|---|---|---|
| sort | string | Result ordering: the site's recommended order or lowest price first. |
| limit | integer | Maximum number of deals to return in the single call, clamped to 100. |
| adults | integer | Number of adult travellers (1-9); the per-person price is based on this occupancy. |
| origin | string | Comma-separated departure airport/city IATA codes, e.g. LON or LON,MAN (uppercase 3-letter codes). |
| max_nights | integer | Maximum stay length in nights (>= min_nights). |
| min_nights | integer | Minimum stay length in nights (>= 1). |
| destination | string | Destination filter as the site's destination code; A means all destinations. Accepted forms confirmed: a tag code such as TAG_TENERIFE or a numeric destination_id as returned in results. A code the site does not recognise is rejected by the site (upstream_error). |
| hotel_stars | string | Comma-separated hotel star ratings to include, digits 1-5, e.g. 4,5. |
| departure_to | string | Latest departure date, ISO YYYY-MM-DD. Omitted = 60 days from today. |
| departure_from | string | Earliest departure date, ISO YYYY-MM-DD. Omitted = today. |
| flash_sales_only | boolean | true restricts results to time-limited Last Minute flash-sale deals (which carry deal_expires_at); false also includes regular package offers, where deal_expires_at may be null. |
{
"type": "object",
"fields": {
"count": "number of deals returned",
"deals": "array of deal records: hotel_name, destination (label), destination_id (site destination code usable as the destination input), origin (departure city label), accommodation_type, hotel_stars (integer), review_score / review_count / review_source (TripAdvisor rating), meal_plan (site code e.g. allInclusive, roomOnly), departure_date (ISO), nights, price_from (number, per person, in currency), price_display, currency, price_basis, deal_expires_at (ISO timestamp or null when the offer is not a flash sale), product_type, booking_url (site page for this deal)",
"has_more": "whether the feed reported more deals beyond the returned page",
"fallback_origin_used": "true when the site substituted a different departure airport because the requested one had no deals"
},
"sample": {
"data": {
"count": 1,
"deals": [
{
"nights": 4,
"origin": "London",
"currency": "GBP",
"meal_plan": "allInclusive",
"hotel_name": "Sol Lanzarote",
"price_from": 302,
"booking_url": "https://www.lastminute.com/s/tsx/400883?pageType=hotelDetail&searchMode=DP&highlightHotelId=400883&businessProfileId=HOLIDAYSLASTMINUTECOUK&departureIntervals=20261208-20261212&adults=2&origin=LON¤cy=GBP&destination=136864&dateFrom=2026-12-08&dateTo=2026-12-12",
"destination": "Lanzarote, Spain",
"hotel_stars": 4,
"price_basis": "perPerson",
"product_type": "flightPlusHotel",
"review_count": 7988,
"review_score": 4,
"price_display": "£302",
"review_source": "tripAdvisor",
"departure_date": "2026-12-08",
"destination_id": "136864",
"deal_expires_at": "2026-10-14T23:59:59+00:00",
"accommodation_type": "HOTELS"
}
],
"has_more": false,
"fallback_origin_used": false
},
"status": "success"
}
}About the lastminute API
What the API covers
The search_deals endpoint queries lastminute.com's UK Last Minute Deals feed and returns package offers that bundle a return flight with a hotel stay. Every record in the deals array includes hotel_name, a human-readable destination label, a destination_id that can be fed back into the destination parameter for focused queries, plus pricing, dates, and stay details. The count field tells you how many deals the call returned, and has_more signals whether the feed contained additional results beyond your limit (capped at 100).
Filtering and sorting
The origin parameter accepts comma-separated IATA codes (e.g. LON or LON,MAN), so you can aggregate deals across multiple departure airports in one request. Stay length is bounded with min_nights and max_nights. Hotel quality narrows via hotel_stars as a comma-separated list of digits (3,4,5). The adults parameter (1–9) sets occupancy, which affects the per-person price returned. Sort order switches between the site's recommended ranking and lowest-price-first. If the requested departure airport has no deals, the fallback_origin_used field is set to true so you know the origin was substituted.
Coverage notes
All prices are in GBP and the feed reflects the UK version of lastminute.com. The destination filter accepts the site's own destination codes; passing A returns all destinations. Because this is a last-minute deals feed, the inventory is short-horizon and rotates frequently — results will differ across calls as deals sell out or new ones are added.
The lastminute API is a managed, monitored endpoint for lastminute.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when lastminute.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 lastminute.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 deal-alert tool that monitors GBP price drops for specific departure airports using
originandhotel_starsfilters. - Aggregate last-minute package deals across LON, MAN, and BHX in a single
search_dealscall for a multi-airport comparison widget. - Power a budget travel dashboard that surfaces the cheapest 4- and 5-star packages by sorting on lowest price first.
- Track destination popularity by counting how often each
destination_idappears in the deals feed over time. - Populate a travel newsletter with this week's top deals filtered to a specific stay length using
min_nightsandmax_nights. - Feed a chatbot that answers 'what can I book this weekend from London?' using live deal data from the
search_dealsendpoint. - Monitor
has_moreto detect when the feed is unusually deep, signalling a high-inventory period or flash sale.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does lastminute.com have an official developer API?+
What does a single deal record in the `deals` array actually contain?+
hotel_name, a destination label (human-readable place name), a destination_id (the site's own code, reusable as the destination input parameter), along with pricing per person in GBP, departure date, and stay details. The fallback_origin_used flag at the response level indicates whether the origin airport was substituted by the feed.Can I retrieve hotel-only or flight-only deals?+
search_deals endpoint covers flight + hotel package deals only — these are the bundled offers in the Last Minute Deals feed. Standalone hotel search or flight-only results are not exposed. You can fork this API on Parse and revise it to add an endpoint targeting hotel-only or flight-only inventory.What happens if my requested departure airport has no deals?+
fallback_origin_used to true in the response, indicating the feed substituted a different departure airport because the requested one had no matching deals at that time. You should check this field when origin accuracy matters for your use case.