Musement APIlastminute.musement.com ↗
Search tours, tickets, and attractions on lastminute.musement.com. Get activity details, availability dates, and per-day prices via 3 structured endpoints.
What is the Musement API?
The lastminute.musement.com API exposes 3 endpoints covering search, detail, and availability for tours, tickets, and attraction experiences listed on the Italian lastminute.com experiences site. Use search_activities to find activities by destination or name with filters for category, language, and cancellation policy, then get_activity to retrieve full descriptions, highlights, included items, and venue coordinates, and get_activity_dates to pull a day-by-day price calendar.
curl -X GET 'https://api.parse.bot/scraper/5a5741b0-4d89-4b8b-b5ac-7d899e4e7819/search_activities?query=Roma' \ -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-musement-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: Musement SDK — search activities, drill into details and dates."""
from parse_apis.lastminute_musement_com_api import Musement, SortOrder, InputNotFound
client = Musement()
# Search for top-rated activities in Roma, capped at 5 results.
for summary in client.activity_summaries.search(query="Roma", sort=SortOrder.RATING, limit=5):
print(summary.title, summary.retail_price.value, summary.retail_price.currency)
# Drill down: take the first result and navigate to its full detail.
summary = client.activity_summaries.search(query="Roma", limit=1).first()
if summary is not None:
activity = summary.details()
print(activity.title, activity.about[:120])
print("Highlights:", activity.highlights)
print("Included:", activity.included)
print("Reviews:", activity.reviews_number, "avg", activity.reviews_avg)
# List the next 10 available booking dates for this activity.
for date in activity.dates.list(limit=10):
print(date.day, "sold_out" if date.sold_out else date.retail_price.value, date.retail_price.currency)
# Point lookup by an id discovered from the search above.
if summary is not None:
try:
detail = client.activities.get(activity_id=summary.activity_id)
print(detail.title, detail.city, detail.country)
for venue in detail.venues:
print(" ", venue.name, venue.address)
except InputNotFound:
print("Activity no longer available")
print("exercised: activity_summaries.search / details / activities.get / dates.list")
Searches activities and experiences by free text (a city, attraction, or experience name) and returns one page of activity summaries with the site's total match count. Results are paginated by offset and limit: omit offset to start at 0; limit defaults to 20 and is capped at 100; has_more tells whether a further page exists at offset+limit. Optional filters narrow results by category code (as emitted in activities[*].categories[*].code), ticket feature code, activity language code, availability date window, and adult price range; filters are applied by the site and an unknown filter value yields an empty result rather than an error. Prices are in EUR, text is Italian. A query with no matches returns total 0 and an empty activities list.
| Param | Type | Description |
|---|---|---|
| sort | string | Result ordering. |
| limit | integer | Number of activities per page, 1 to 100 (values above 100 are clamped). |
| queryrequired | string | Free-text search: a destination, attraction, or experience name (e.g. a city name). |
| offset | integer | Zero-based index of the first activity to return; add limit to walk to the next page. |
| date_to | string | End of availability window, ISO date YYYY-MM-DD. |
| feature | string | Ticket-option feature code filter; confirmed codes: free (free cancellation), istant (instant confirmation), skip (skip the line), fast (priority entrance), ADDVA_GUIDE (guided tour), ADDVA_SMALL (small group), ADDVA_MEAL (meals included), ADDVA_TOURAU (audio guide). |
| category | string | Category code filter, e.g. new-food-drink; codes come from activities[*].categories[*].code of a previous search. |
| language | string | Two-letter activity language code filter (e.g. it, en, es, fr, de). |
| date_from | string | Start of availability window, ISO date YYYY-MM-DD. Used together with date_to. |
| max_price | integer | Maximum adult price in EUR (whole euros). |
| min_price | integer | Minimum adult price in EUR (whole euros). |
{
"type": "object",
"fields": {
"limit": "integer, page size used",
"query": "echo of the search text",
"total": "integer, total matching activities on the site for this query and filters",
"offset": "integer, offset used for this page",
"has_more": "boolean, true when offset+limit is below total",
"activities": "array of activity summaries: activity_id (UUID, use with get_activity / get_activity_dates), title, description, city, country, duration (ISO 8601 duration, P0D when not specified), languages (array of language codes), features (array of Italian feature labels), categories (array of {code, name}), retail_price and original_retail_price ({value, currency}), free_cancellation, likely_to_sell_out, reviews_number, reviews_avg, cover_image_url, url (activity page on the site)"
},
"sample": {
"data": {
"limit": 3,
"query": "Roma",
"total": 515,
"offset": 0,
"has_more": true,
"activities": [
{
"url": "https://lastminute.musement.com/it/roma/ingresso-con-salto-della-linea-ai-musei-vaticani-e-alla-cappella-sistina-20598/",
"city": "Roma",
"title": "Ingresso con salto della linea ai Musei Vaticani e alla Cappella Sistina",
"country": "Italia",
"duration": "P0D",
"features": [
"Conferma istantanea",
"Salta la coda",
"Ingresso prioritario",
"Cancellazione gratuita",
"Voucher elettronico"
],
"languages": [],
"categories": [
{
"code": "new-attractions-guided-tours",
"name": "Attrazioni e tour guidati"
},
{
"code": "new-monuments",
"name": "Monumenti"
}
],
"activity_id": "dc99d6d9-8cf3-4983-968e-e503907ca029",
"description": "Approfittate dell'accesso \"skip-the-line\" per ammirare i Musei Vaticani e visitare la Cappella Sistina, una delle più grandi attrazioni di Roma.",
"reviews_avg": 4.43,
"retail_price": {
"value": 57,
"currency": "EUR"
},
"reviews_number": 1587,
"cover_image_url": "https://images.musement.com/cover/0001/87/thumb_86171_cover_header.jpeg?w=540",
"free_cancellation": false,
"likely_to_sell_out": true,
"original_retail_price": {
"value": 57,
"currency": "EUR"
}
}
]
},
"status": "success"
}
}About the Musement API
Search and Filter Activities
The search_activities endpoint accepts a free-text query — a city name, attraction, or experience keyword — and returns a paginated list of activity summaries alongside a total count of all site matches. Pagination is offset-based: pass offset and limit (up to 100 per page) to walk through result sets. Optional filters include category (codes like new-food-drink sourced from activities[*].categories[*].code in prior results), language (two-letter codes such as it, en, es), feature (e.g. free for free cancellation, istant for instant confirmation), and a date_to window. Each summary includes an activity_id UUID used by the other two endpoints.
Activity Detail
get_activity takes a single activity_id and returns the full record: title, about (long plain-text description), included and not_included arrays, highlights, meeting_point, latitude/longitude, a venues array of name-address pairs, supplier name, operational data, and an HTML info block for practical notes. The sold_out and status fields indicate current booking availability without making a separate availability call.
Availability Calendar and Prices
get_activity_dates returns an array of dates entries, each containing a day (ISO date), a sold_out flag, a retail_price object, and an original_retail_price object (both with value and currency). The window defaults to one year ahead but can be narrowed with the date_to parameter. Note that for some activities the site does not publish per-day pricing; those entries return a retail_price.value of 0.
The Musement API is a managed, monitored endpoint for lastminute.musement.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when lastminute.musement.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.musement.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 destination activity finder that queries
search_activitieswith a city name and surfaces results filtered bylanguageand cancellation policy. - Aggregate lowest available prices for a set of activities across a travel date range using
get_activity_datesand comparingretail_pricevsoriginal_retail_price. - Populate a tour detail page with
get_activityfields:included,not_included,highlights, andvenueswith map coordinates. - Monitor sold-out status changes for specific attraction tickets by polling
get_activity_datesand tracking thesold_outflag per day. - Filter experiences by
featurecodefreeto list only free-cancellation activities available in a given window. - Compare supplier offerings for a destination by collecting the
supplierfield across multipleget_activityresponses. - Detect price drops for an activity by storing historical
retail_pricevalues from repeatedget_activity_datescalls.
| 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.musement.com have an official developer API?+
What does `get_activity_dates` return, and how should I interpret a price of 0?+
day (ISO date), a sold_out boolean, and two price objects (retail_price and original_retail_price, each carrying value and currency). A retail_price.value of 0 means the site does not publish a specific per-day price for that activity — it does not indicate the activity is free.How does pagination work in `search_activities`?+
total (total matches on the site), limit (page size used, max 100), offset (starting index for this page), and has_more (true when offset + limit < total). To fetch the next page, add limit to offset and repeat the request with the same query and filters.Does the API cover reviews, ratings, or user-generated content for activities?+
Can I retrieve activities outside Italy or in languages other than Italian?+
language filter in search_activities lets you request activities offered in a specific language (e.g. en, es, de), but the underlying catalog is scoped to this regional site. Experiences from other Musement regional domains are not covered. You can fork the API on Parse and revise it to point at a different regional domain.