Ticketmaster France & Spain Scraper
Pricing
from $0.80 / 1,000 results
Ticketmaster France & Spain Scraper
Scrapes event details, venue info, and artist data from ticketmaster.fr and ticketmaster.es by category.
Pricing
from $0.80 / 1,000 results
Rating
5.0
(1)
Developer
Techforce Global
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
0
Monthly active users
14 days ago
Last modified
Categories
Share
Ticketmaster Event Scraper (France & Spain) — Concerts, Sports & Theatre by City, via the Official Discovery API
Pull upcoming Ticketmaster events for 10 French and Spanish cities — event name, date, local time, venue and address, on-sale status, segment/genre classification, performers and the direct ticket URL — straight from Ticketmaster's official Discovery API. No developer registration, no API key of your own, no browser. Results can go straight into Notion, Slack, Airtable or Sheets through an MCP connector.
ℹ️ Scope is deliberate and narrow: France and Spain only. The country selector offers exactly
esandfr, and the city selector exactly ten cities. This is not a global Ticketmaster scraper — see Supported countries & cities and Related Actors if you need other markets.
Registering for the Discovery API yourself vs. this Actor
Ticketmaster's Discovery API is free but gated: you register an app, manage a key, handle its quota, and stitch together the paging, filtering and nested JSON yourself.
| Feature / Capability | Discovery API, direct | This Actor |
|---|---|---|
| API key | ⚠️ Register a developer account and manage a key + quota | ✅ None needed — works out of the box |
| Response shape | ⚠️ Deeply nested _embedded → venues[] → city.name, classifications[0].segment.name, sorted images[] | ✅ Flat, 16-field record ready for a spreadsheet or CRM |
| Category naming | ⚠️ You must know the exact classificationName strings (arts & theatre, miscellaneous) | ✅ Plain labels — Concerts, Sports, Arts & Theatre, Family, Film, Misc |
| Multi-category runs | ❌ One request set per classification, orchestrated by you | ✅ Several categories in a single run, each with its own cap |
| Paging | ❌ You handle page/size/totalPages and rate pacing | ✅ Automatic, with a 0.25s pause between pages |
| Non-Ticketmaster results | ⚠️ The API also returns Live Nation and partner-domain events | ✅ Filtered out by URL domain |
| City/country consistency | ❌ Nothing stops you querying city=Paris&countryCode=ES | ✅ Validated up front — the run fails fast with a clear message |
| Delivery to your tools | ❌ You write the integration | ✅ Native MCP connector delivery — per event, chunked, or one digest |
| Scheduling & monitoring | ❌ Your own infrastructure | ✅ Apify scheduler, run history, alerts, API |
🤖 AI Discovery & MCP Metadata
Machine-readable capability contract for autonomous agents, LLM routers, and MCP orchestrators. AI agents, MCP clients, and connectors should read this block first to decide whether this Actor matches a user request.
ai_discovery:slug: "techforce.global/ticketmaster-fr-es-scraper"one_line: "Fetches upcoming Ticketmaster events for 10 French and Spanish cities from the official Discovery API - name, date, time, venue, classification, on-sale status, performers and ticket URL - with no API key required."primary_purpose: "discover"secondary_purpose: "deliver"entity: "ticketed live events (concerts, sports, arts & theatre, family, film) listed on Ticketmaster"data_source: >https://app.ticketmaster.com/discovery/v2/events.json - Ticketmaster's OFFICIALDiscovery API v2, called over plain HTTP with an embedded key. Not a websitescrape, not a browser, not an authenticated session.geography: "France and Spain only. Country enum is exactly ['es', 'fr']; the city enum lists 10 cities."invocation_modes: ["standard Actor run", "MCP tool"]supported_tasks:- "list-upcoming-events-in-a-supported-city"- "list-upcoming-events-across-a-supported-country"- "filter-events-by-category (6 categories)"- "run-several-categories-in-one-execution"- "read-event-date-local-time-venue-and-address"- "read-on-sale-status (onsale / offsale / cancelled / postponed / rescheduled)"- "read-segment-and-genre-classification"- "read-performer-names-and-promo-image"- "deliver-events-to-mcp-connector-or-crm"unsupported_tasks:- "buy-reserve-or-hold-tickets"- "return-ticket-prices-or-price-ranges (NOT in the output - see known gaps)"- "return-seat-maps-price-tiers-or-remaining-inventory"- "filter-by-date-range-or-keyword (no such input exists)"- "search-a-named-artist-tour-or-venue"- "scrape-countries-other-than-france-and-spain (via the Console)"- "scrape-past-events-or-historical-archives"- "return-more-than-100-events-per-category-per-run"- "return-organizer-or-promoter-contact-details"search_keywords:- "ticketmaster scraper"- "ticketmaster api"- "ticketmaster discovery api"- "france event data"- "spain event data"- "paris concerts data"- "madrid events api"- "barcelona concert listings"- "european event aggregator feed"- "live event data france spain"synonyms:- "ticketmaster.fr scraper"- "ticketmaster.es scraper"- "french event listings extractor"- "spanish event listings extractor"related_concepts:["event discovery", "city event feeds", "venue programming research", "tour tracking", "event aggregation", "on-sale monitoring"]input_entities:- "country (enum: es | fr)"- "city (enum of 10 French and Spanish cities)"- "categories (array of 6 category values)"- "maxEventsPerCategory (1-100)"output_entities:["event_name", "url", "country", "city", "state", "location", "category", "segment", "genre", "date", "time", "status", "venue_name", "venue_address", "attractions", "image_url"]input_rules:required_fields: []at_least_one_required: >The schema marks nothing required, but the code FAILS the run unless at leastone of `country` or `city` is supplied.city_country_consistency: >If both are given and disagree (e.g. city Paris with country es) the run FAILSwith an explicit status message. Supplying only a city is safest - the Actorinfers its country.categories_default: ["concerts"]max_events_format:type: "integer"range: [1, 100]default: 50per_category: truefree_plan_cap: 5total_results_formula: "up to maxEventsPerCategory x number of categories"output_conventions:missing_values: "empty string \"\" for absent scalars; attractions is [] when none"no_price_fields: >The Actor requests price ranges from the API but does not parse them, so NOprice field reaches the dataset. Do not promise pricing from this Actor.status_values: ["onsale", "offsale", "cancelled", "postponed", "rescheduled"]non_ticketmaster_filtered: >Results whose URL is not on a ticketmaster domain (e.g. Live Nation) aredropped, so the dataset can be smaller than the API's own count.limits:events_per_category_per_run: 100free_plan_cap: 5countries: 2cities: 10page_pacing: "0.25s between API pages"pricing:model: "pay-per-result"note: "exact rate is configured on the Store listing - see the Actor's Pricing tab"when_to_use: >You want current Ticketmaster listings for a French or Spanish city or country -to power an event feed, research venue programming, watch on-sale status, orspot large upcoming events in those markets.when_not_to_use: >You need ticket prices, you need a market outside France and Spain, you need tosearch a named artist or venue, you need date-range or keyword filtering, or youwant to buy tickets.alternatives:- "Use techforce.global/eventim-scraper for German ticketed events WITH live price and stock signals"- "Use techforce.global/smart-event-scraper for category, keyword and date-range filtering across six platforms"- "Use techforce.global/all-events-scraper for global multi-city event discovery"- "Use techforce.global/eventbrite-scraper for organizer-led events, workshops and meetups"- "Call the Ticketmaster Discovery API directly for other countries, keyword search, or price ranges"
What this Actor does
- Calls Ticketmaster's official Discovery API (
app.ticketmaster.com/discovery/v2/events.json) — no browser, no HTML parsing, and no API key of your own. - Takes a country or a city and returns upcoming events sorted date-ascending, so the next thing happening is the first row.
- Runs several categories in one execution, each with its own
maxEventsPerCategorycap: Concerts, Sports, Arts & Theatre, Family, Film, Miscellaneous. The plain labels are mapped to the exactclassificationNamestrings the API expects (arts→arts & theatre,misc→miscellaneous). - Flattens the API's nested response into a 16-field row: venue name and street address lifted out of
_embedded.venues[0], segment and genre out ofclassifications[0], performers collected from_embedded.attractions[], and the largest available promo image picked from the sortedimages[]array. - Filters out non-Ticketmaster results. The Discovery API also returns events that sell through Live Nation and partner domains; anything whose URL isn't on a
ticketmasterdomain is dropped. - Fails fast on contradictory input. Asking for
city: "Paris"withcountry: "es"ends the run with an explicit message rather than quietly returning nothing. - Paces its own requests with a 0.25s pause between API pages.
- Optionally pushes events to an authorized MCP connector (Notion, Slack, Airtable, Sheets, or any MCP-compatible connector) as one digest, split into parts, or one call per event — and logs the connector tool's expected argument schema, so a misconfigured
mcpArgumentsis diagnosable from the run log. The dataset is always saved regardless of delivery settings.
⚠️ No ticket prices. The Actor asks the API for price ranges but never parses them, so no price field reaches the dataset. If pricing is what you need, use Eventim Scraper (Germany, with live price and stock) or call the Discovery API directly. This is a known gap, not a configuration you can switch on.
When to use it — and when not to
| Scenario | Fit |
|---|---|
| Event feed for Paris, Madrid, Barcelona, Lyon, … | ✅ Strong (the core use case) |
| Country-wide sweep of France or Spain | ✅ Strong — omit city, set country |
| Multi-category run (concerts + sports + theatre) in one execution | ✅ Strong |
| Venue programming research in a supported city | ✅ Strong — venue_name + venue_address |
| Watching on-sale / postponed / cancelled status on a schedule | ✅ Strong — status field |
| Segment/genre breakdown of a city's listings | ✅ Strong — segment + genre |
| Feeding events into Notion / Airtable / Slack | ✅ Strong (deliveryMode) |
| Ticket prices or price ranges | ❌ Not in the output — see the callout above |
| Buying, reserving or holding tickets | ❌ Read-only |
| Any market outside France and Spain | ❌ Console enums are es/fr and 10 cities only |
| Searching a named artist, tour or venue | ❌ No keyword input — filter the dataset afterwards |
| Date-range filtering ("this weekend") | ❌ No date input — results are date-ascending; filter afterwards |
| Seat maps, price tiers, tickets remaining | ❌ Not returned |
| Past events / historical archives | ❌ Upcoming events only |
| More than 100 events per category per run | ⚠️ Hard cap of 100 per category |
⚡ Execution Rules (Avoid Common Agent Failures)
- The schema marks nothing required, but the run fails without
countryorcity. Supply at least one, or the run endsFAILEDwith❌ Provide at least a country or a city. - A city/country mismatch is a hard failure, not an empty result.
city: "Paris"withcountry: "es"ends with❌ 'Paris' is in 'fr', but selected country is 'es'.Supplying only the city is safest — the Actor infers its country automatically. - France and Spain only. The Console offers
es/frand ten cities. Anything else is out of scope. maxEventsPerCategoryis per category, not per run. Three categories at 50 each is up to 150 records. Range is1–100; free Apify plans are capped at 5 per category.- There is no price field. The API is asked for price ranges and the response is discarded before the record is built. Don't promise pricing from this Actor.
- There is no keyword, artist, venue or date filter. You get the city/country feed for the chosen categories, date-ascending. Filter the dataset afterwards.
- Category values are the six schema keys —
concerts,sports,arts,family,film,misc— not the API's classification strings. Sending"music"or"arts & theatre"passes straight through to the API unmapped and may behave unexpectedly. - Fewer results than you asked for is normal. The city genuinely has fewer events, or non-Ticketmaster results were filtered out. There is no total-match count in the output.
- Missing values are empty strings
"", notnull—state,time,venue_address,genreandimage_urlare all commonly empty.attractionsis[]when there are no listed performers. dateandtimeare the venue's local date and time, as separate fields, with no timezone offset. Don't concatenate them into an instant without knowing the venue's zone.statusis the on-sale state, not a data-quality flag —onsale,offsale,cancelled,postponed,rescheduled. Acancelledevent still appears in the dataset.countryin the output is the venue's country code, uppercased (ES,FR) — it can differ from what you passed if the venue record says otherwise.- An API failure ends that category quietly. A non-2xx response logs an error and breaks that category's loop; other categories continue and the run still reports
SUCCEEDED. Check the log and the item count. deliveryModedefaults tosummary, notnone— one connector call per run. Switching toperEventon a 150-event run makes 150 calls.- Use
chunkedfor large sets going to Notion. Events are packed into ~1,800-character paragraphs and grouped into ~72,000-character calls so nothing times out.
dependencies:- rule: "at least one of country or city must be supplied"on_violation: "run FAILS with '❌ Provide at least a country or a city.'"- rule: "city and country must agree when both are given"on_violation: "run FAILS naming the city's actual country - supply only the city to avoid this"- rule: "coverage is France and Spain only"on_violation: "no Console path to other markets; use a different Actor or the Discovery API directly"- rule: "maxEventsPerCategory is per category and capped at 100 (5 on free plans)"on_violation: "total volume under-estimated by a factor of the category count"- rule: "no price, keyword, artist, venue or date-range field exists"on_violation: "agents constructing those arguments get them silently ignored, or promise data that never arrives"- rule: "category values are concerts|sports|arts|family|film|misc"on_violation: "raw API classification strings pass through unmapped"- rule: "absent scalars are empty strings, not null"on_violation: "null checks pass while values are unusable"- rule: "date and time are venue-local with no offset"on_violation: "off-by-hours comparisons across time zones"- rule: "a non-2xx API response ends that category but the run still SUCCEEDS"on_violation: "a partial result set read as complete - check the log"- rule: "delivery requires mcpConnector AND mcpTool"on_violation: "delivery step is skipped with a warning; the dataset is still written in full"- rule: "mcpArguments must reference {message} for the rendered template to appear anywhere"on_violation: "message body is empty; the tool is still called"- rule: "mcpConnector only resolves when the Actor runs on the Apify platform"on_violation: "local runs log 'APIFY_MCP_PROXY_URL is not set' and skip delivery; the dataset is unaffected"authentication:actor_input: noneplatform: "Apify API token required for API / SDK / MCP invocation"target_api: "no Ticketmaster developer account or API key required from you"
📥 Input Contract
.actor/input_schema.json is authoritative — if any table on this page disagrees with the schema files, the schema files win.
Parameters
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
country | enum | ⚠️ One of country/city | "es" | es, fr | "fr" |
city | enum | ⚠️ One of country/city | none | 10 cities — see below | "Paris" |
categories | array | ⬜ No | ["concerts"] | concerts, sports, arts, family, film, misc | ["concerts","sports"] |
maxEventsPerCategory | integer | ⬜ No | 50 | 1–100; free plans capped at 5 | 100 |
⚠️ The schema declares no
requiredfields, but the code fails the run if bothcountryandcityare empty. Treat "one of the two" as required.
Supported countries & cities
| Country | Cities |
|---|---|
🇪🇸 Spain (es) | Madrid · Barcelona · Valencia · Sevilla · Zaragoza |
🇫🇷 France (fr) | Paris · Lyon · Marseille · Toulouse · Nice |
Omit city to sweep a whole country. Give only city and the Actor infers the country — the safest option, since it can't contradict itself.
Categories
| Value (send this) | Console label | Discovery API classificationName |
|---|---|---|
concerts | Concerts | music |
sports | Sports | sports |
arts | Arts & Theatre | arts & theatre |
family | Family | family |
film | Film | film |
misc | Miscellaneous | miscellaneous |
Each selected category is fetched independently and capped independently, so the run's total is up to maxEventsPerCategory × len(categories).
Examples
A city feed — the safest shape (no country to contradict)
{"city": "Paris","categories": ["concerts"],"maxEventsPerCategory": 100,"deliveryMode": "none"}
Country-wide sweep across several categories
{"country": "es","categories": ["concerts", "sports", "arts"],"maxEventsPerCategory": 100,"deliveryMode": "none"}
Everything in one city — up to 600 records
{"city": "Barcelona","categories": ["concerts", "sports", "arts", "family", "film", "misc"],"maxEventsPerCategory": 100,"deliveryMode": "none"}
Cheap validation run before a full sweep
{"city": "Madrid","categories": ["concerts"],"maxEventsPerCategory": 5,"deliveryMode": "none"}
❌ Will fail — city and country disagree
{"city": "Paris","country": "es","categories": ["concerts"]}
MCP Delivery Configuration (Optional)
Delivery pushes event data into your own tools. It never buys, reserves or contacts anything.
| Parameter | Type | Default | Description |
|---|---|---|---|
mcpConnector | string | "" | Authorized MCP connector on your Apify account (Notion, Slack, Airtable, Sheets, …). Leave empty for dataset-only runs. |
deliveryMode | enum | summary | summary (one call with every event) · chunked (split across calls) · perEvent (one call per event) · none. |
mcpTool | string | "" | Tool name on the connector: create_page, send_message, create_record, append_row. Run once with a connector selected — the log lists the available tools and the chosen tool's expected argument schema. |
mcpArguments | object | {} | Arguments passed to the tool. String leaves support {placeholders}. |
mcpMessageTemplate | string | "" | Template rendered and exposed to mcpArguments as {message}. |
Summary & chunked placeholders: {country}, {city}, {categories}, {totalEvents}, {events}, {message} — plus {part} and {partCount} in chunked mode.
Per-event placeholders: every output field — {event_name}, {url}, {country}, {city}, {state}, {location}, {category}, {segment}, {genre}, {date}, {time}, {status}, {venue_name}, {venue_address}, {image_url} — plus {message}.
A Slack digest per run:
{"city": "Madrid","categories": ["concerts", "sports"],"maxEventsPerCategory": 100,"mcpConnector": "<your-authorized-slack-connector>","deliveryMode": "summary","mcpTool": "send_message","mcpArguments": { "channel": "#events-es", "text": "{message}" },"mcpMessageTemplate": "🎟️ {totalEvents} events on sale in {city} ({categories}):\n\n{events}"}
A large set split across Notion sub-pages:
{"country": "fr","categories": ["concerts", "sports", "arts"],"maxEventsPerCategory": 100,"mcpConnector": "<your-authorized-notion-connector>","deliveryMode": "chunked","mcpTool": "notion-create-pages","mcpArguments": {"parent": { "page_id": "<your-page-id>" },"pages": [{"properties": { "title": "Ticketmaster {country} — {categories} — part {part}/{partCount}" },"content": "{events}"}]}}
One Airtable row per event:
{"city": "Barcelona","categories": ["concerts"],"maxEventsPerCategory": 100,"mcpConnector": "<your-authorized-airtable-connector>","deliveryMode": "perEvent","mcpTool": "create_record","mcpArguments": {"fields": {"Event": "{event_name}","Date": "{date}","Time": "{time}","Venue": "{venue_name}","Address": "{venue_address}","City": "{city}","Genre": "{genre}","Status": "{status}","Tickets": "{url}"}}}
📤 Output Contract & Data Structure
Storage: Apify Dataset — one JSON object per event, pushed per category as each category finishes.
Pagination: limit & offset on the dataset items endpoint.
Duplicates: one record per event per category. An event classified under two selected categories can appear twice — dedupe on url.
Event record — 16 fields
| Field | Type | Empty value | Meaning |
|---|---|---|---|
event_name | string | "" | Event title as listed on Ticketmaster |
url | string | "" | Direct Ticketmaster ticket page — use as the dedupe key |
country | string | "" | Venue's country code, uppercased (ES, FR) |
city | string | "" | Venue's city, falling back to the requested city |
state | string | ⚠️ often "" | Region/state name where the API provides one |
location | string | "" | city, state, COUNTRY joined — convenient single-line display |
category | string | "" | The category you requested (concerts, sports, …) |
segment | string | "" | Ticketmaster's top-level classification (Music, Sports, …) |
genre | string | ⚠️ can be "" | Genre within the segment (Rock, Football, …) |
date | string | "" | Venue-local start date, YYYY-MM-DD |
time | string | ⚠️ often "" | Venue-local start time, HH:MM:SS — no timezone offset |
status | string | "" | onsale · offsale · cancelled · postponed · rescheduled |
venue_name | string | "" | Venue name |
venue_address | string | ⚠️ often "" | Street address line 1 only |
attractions | array of string | [] | Performer / attraction names |
image_url | string | "" | Largest available promo image URL |
⚠️ No price fields, by omission. The Actor sends
includePriceRanges=yesto the API but never reads the response's price data, so nothing about pricing reaches the dataset. There is also no event ID, no on-sale start date, no timezone, and no ticket-availability count.
Example dataset item
{"event_name": "Coldplay - Music Of The Spheres World Tour","url": "https://www.ticketmaster.es/event/coldplay-estadi-olimpic-barcelona/12345","country": "ES","city": "Barcelona","state": "Barcelona","location": "Barcelona, Barcelona, ES","category": "concerts","segment": "Music","genre": "Rock","date": "2026-07-15","time": "21:00:00","status": "onsale","venue_name": "Estadi Olímpic Lluís Companys","venue_address": "Passeig Olímpic, 15-17","attractions": ["Coldplay"],"image_url": "https://s1.ticketm.net/dam/a/abc/example-source-16_9.jpg"}
Working with the output
from collections import Counter# `status` is the on-sale state - cancelled events are still in the dataset.bookable = [e for e in items if e["status"] == "onsale"]# date and time are venue-LOCAL and separate; there is no offset to rely on.by_date = sorted(bookable, key=lambda e: (e["date"], e["time"] or "00:00:00"))print(Counter(e["genre"] or "(unclassified)" for e in items)) # programming mixprint(Counter(e["venue_name"] for e in items).most_common(5)) # busiest venues
What a successful run looks like
{"status": "SUCCEEDED","defaultDatasetId": "<datasetId>","stats": { "itemCount": 137 }}
itemCount below maxEventsPerCategory × len(categories) is normal — the city has fewer events, or non-Ticketmaster results were filtered. There is no total-match count to compare against.
itemCount: 0 with SUCCEEDED is a valid empty result. A FAILED run means input validation rejected the request. Read the log to tell the causes apart:
| Log / status message | Meaning |
|---|---|
❌ Provide at least a country or a city. (FAILED) | Both were empty |
❌ '<city>' is in '<xx>', but selected country is '<yy>'. (FAILED) | City/country mismatch |
<place> | <category> | No events found | That category genuinely matched nothing |
<place> | <category> | HTTP 4xx/5xx | The Discovery API rejected or failed that category's request — partial results |
<place> | <category> | Request failed | Network/transport error on that category |
Skipping non-TM: <url> (debug) | A partner-domain result was filtered out |
Free plan detected — capping results to 5 per category. | Free-plan cap applied |
▶️ Invocation & Integration
Lifecycle: Discover → Understand → Configure → Execute → Retrieve → Validate. Authenticate every call with Authorization: Bearer <APIFY_TOKEN>.
Apify Console
Open the Actor → Input tab → pick a City (or just a Country) → select one or more Categories → set Max events (per category) → (optional) pick an MCP connector, tool and template → Start → export from the Dataset tab (JSON, CSV, Excel, XML). The With images view gives you a visual listing.
Model Context Protocol (MCP)
claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/ticketmaster-fr-es-scraper"
Python (apify-client)
import osfrom collections import Counterfrom apify_client import ApifyClientclient = ApifyClient(os.getenv("APIFY_TOKEN"))ACTOR = "techforce.global/ticketmaster-fr-es-scraper"run = client.actor(ACTOR).call(run_input={"city": "Paris", # city alone - it can't contradict a country"categories": ["concerts", "sports"],"maxEventsPerCategory": 100, # PER CATEGORY; free plans stop at 5"deliveryMode": "none",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(f'{len(items)} events — run status: {run["status"]}')# An event in two selected categories appears twice; url is the stable identity.unique = {e["url"]: e for e in items if e["url"]}print(f"{len(unique)} unique events")bookable = [e for e in unique.values() if e["status"] == "onsale"]for event in sorted(bookable, key=lambda e: (e["date"], e["time"] or ""))[:10]:when = f'{event["date"]} {event["time"] or ""}'.strip() # venue-LOCAL, no offsetprint(f'{when:<22} {event["event_name"][:45]}')print(f'{"":<22} {event["venue_name"]}, {event["location"]}')print(Counter(e["genre"] or "(unclassified)" for e in unique.values()))
Country sweep across all six categories:
run = client.actor(ACTOR).call(run_input={"country": "fr", # no city = whole country"categories": ["concerts", "sports", "arts", "family", "film", "misc"],"maxEventsPerCategory": 100, # up to 600 records"deliveryMode": "none",})
JavaScript / TypeScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const ACTOR = 'techforce.global/ticketmaster-fr-es-scraper';const run = await client.actor(ACTOR).call({city: 'Madrid',categories: ['concerts', 'arts'],maxEventsPerCategory: 100,deliveryMode: 'none',});const { items } = await client.dataset(run.defaultDatasetId).listItems();// Absent scalars are EMPTY STRINGS, not null - test truthiness, not `!== null`.const withVenueAddress = items.filter((e) => e.venue_address);const cancelled = items.filter((e) => e.status !== 'onsale');console.log(`${items.length} events · ${withVenueAddress.length} with an address · ${cancelled.length} not on sale`);
cURL — synchronous run (returns items directly; 300s limit)
curl -X POST \-H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"city":"Paris","categories":["concerts"],"maxEventsPerCategory":50,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~ticketmaster-fr-es-scraper/run-sync-get-dataset-items'
cURL — asynchronous with a spend cap (recommended for large runs)
# 1. Start execution with a hard spend limitcurl -X POST -H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"country":"es","categories":["concerts","sports","arts"],"maxEventsPerCategory":100,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~ticketmaster-fr-es-scraper/runs?maxTotalChargeUsd=1.00'# 2. Pollcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/actor-runs/<runId>'# 3. Retrieve when SUCCEEDEDcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json'
Scheduling & workflow tools
Because it's HTTP-only and fast, a daily Apify schedule per city is cheap. Consume the dataset from n8n, Make, Zapier or a webhook — or let mcpConnector deliver into Slack or Notion directly.
⚠️ Autonomous Agent Error Handling & Resolution Matrix
| Error Code | Detection Condition | Underlying Cause | Deterministic Agent Action |
|---|---|---|---|
AUTH_INVALID | HTTP 401 from Apify | Missing or malformed APIFY_TOKEN | Abort & Prompt User: request a valid Apify API token. |
RATE_LIMITED | HTTP 429 from Apify | Apify API rate / concurrency limits | Retry: exponential backoff (2s, 4s, 8s). |
SYNC_TIMEOUT | HTTP 408 on the sync endpoint | Run exceeded the 300s synchronous ceiling | Reconfigure: async POST /runs + polling. |
NO_LOCATION | Run FAILED: ❌ Provide at least a country or a city. | Both country and city empty | Modify Input: supply one. |
CITY_COUNTRY_MISMATCH | Run FAILED: ❌ '<city>' is in '<xx>', but selected country is '<yy>'. | Contradictory pair | Modify Input: drop country and send only city. |
UNSUPPORTED_MARKET | User wants a country other than FR/ES | Coverage is France and Spain only | Re-route: Eventim Scraper (Germany), Smart Event Scraper, or the Discovery API directly. |
PRICE_EXPECTED | Consumer looks for a price field | No price is produced — the API response's price data is discarded | Fix Expectation / Re-route: Eventim Scraper for price + stock. |
FILTER_UNSUPPORTED | Agent passes keyword, artist, venue, dateFrom, … | No such inputs exist | Re-route to Smart Event Scraper for keyword/date filtering, or filter the dataset. |
WRONG_CATEGORY_VALUE | Odd or empty results with a category set | An API classification string (music, arts & theatre) was sent instead of a schema key | Modify Input: use concerts, sports, arts, family, film, misc. |
VOLUME_UNDERESTIMATED | Far more records than expected | maxEventsPerCategory is per category | Fix Expectation: total ≈ cap × category count. |
FREE_PLAN_CAP | 5 events per category, upgrade banner in the log | Free Apify plan cap | Prompt User: upgrade for full-volume runs. |
SIZE_CLAMPED | Asked for more than 100 per category | Schema maximum is 100 | Reconfigure: split by category or city. |
EMPTY_CATEGORY | Log <place> | <category> | No events found | Nothing upcoming in that category there | Modify Input: try another category or a country-wide sweep. |
PARTIAL_RESULTS | SUCCEEDED but log shows HTTP 4xx/5xx for a category | That category's API request failed; others continued | Retry the same input; treat the set as incomplete meanwhile. |
UPSTREAM_API_ERROR | Log Request failed for a category | Network/transport error reaching the Discovery API | Retry with backoff. |
NO_TOTAL_COUNT | Agent wants to know how many events matched | Not exposed in the output | Fix Expectation: report what was returned. |
EMPTY_STRING_NOT_NULL | Null checks pass but values unusable | Absent scalars are "" | Fix Code: test truthiness. |
TZ_MISMATCH | Off-by-hours date comparisons | date/time are venue-local with no offset | Fix Code: resolve the venue's zone before converting. |
CANCELLED_INCLUDED | A cancelled event presented as bookable | status is not filtered by the Actor | Fix Code: filter status == "onsale". |
DUPLICATE_EVENTS | The same event twice | It matched two selected categories | Fix Code: dedupe on url. |
MISSING_FROM_FEED | An event on ticketmaster.es isn't in the output | Its URL was on a partner domain and got filtered, or it fell outside the cap | Reconfigure: raise the cap; otherwise expected. |
NO_SEAT_DATA | No seat map or tiers | Not returned | Fix Expectation: open url. |
DELIVERY_SKIPPED | Log no tool name was provided | mcpConnector set but mcpTool empty | Modify Input: set mcpTool; the dataset is already saved. |
DELIVERY_TOOL_UNKNOWN | Log Tool 'x' is not available on this connector | Wrong tool name for that connector | Modify Input: pick a name from the Available tools: list in the same log line. |
DELIVERY_ARGS_INVALID | Connector rejects the arguments | mcpArguments doesn't match the tool's schema | Read the log: the line Connector [<tool>] expects arguments matching this schema: prints the exact shape. |
DELIVERY_EMPTY | Connector called, body empty | mcpArguments omitted the {message} placeholder | Modify Input: map {message} inside mcpArguments. |
DELIVERY_FLOOD | Hundreds of connector calls | deliveryMode was set to perEvent | Reconfigure: use summary or chunked. |
MCP_PROXY_MISSING | Log APIFY_MCP_PROXY_URL is not set | Running locally instead of on the platform | Reconfigure: apify push and run on the platform. |
CHARGE_LIMIT | Run aborted before all categories finished | maxTotalChargeUsd spend threshold reached | Prompt User: confirm a higher spend cap. |
⚠️ Verify before publishing: the Apify HTTP status rows (
401,408,429) reflect standard platform behavior. Every Ticketmaster-side row, quoted failure message and field condition is taken from this Actor's source. Re-confirm the platform rows if you depend on them for automated retry logic.
🗣️ Natural Language → Actor Mapping
| User says | Intent | Constructed Actor input |
|---|---|---|
| "What concerts are on in Paris?" | City discovery | {"city":"Paris","categories":["concerts"],"maxEventsPerCategory":100} |
| "Show me everything happening in Madrid" | Full city sweep | {"city":"Madrid","categories":["concerts","sports","arts","family","film","misc"],"maxEventsPerCategory":100} |
| "Upcoming events across Spain" | Country sweep | {"country":"es","categories":["concerts"],"maxEventsPerCategory":100} |
| "Football and other sport in Barcelona" | Category filter | {"city":"Barcelona","categories":["sports"],"maxEventsPerCategory":100} |
| "Theatre listings in Lyon" | Category filter | {"city":"Lyon","categories":["arts"],"maxEventsPerCategory":100} |
| "Family-friendly things to do in Nice" | Category filter | {"city":"Nice","categories":["family"],"maxEventsPerCategory":100} |
| "Which venues are busiest in Seville?" | Venue research | {"city":"Sevilla",...} then group on venue_name |
| "Anything cancelled or postponed?" | Status check | run, then filter status != "onsale" |
| "Track new on-sales in Toulouse daily" | Monitoring | schedule {"city":"Toulouse",...} and diff on url |
| "Push the Madrid feed into Notion" | Delivery | {"mcpConnector":"notion","deliveryMode":"chunked","mcpTool":"notion-create-pages"} |
| "Post today's Paris events to Slack" | Digest delivery | {"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message"} |
| "How much are the tickets?" | Pricing | ❌ No price field — ➡️ Eventim Scraper for price + stock |
| "When is Coldplay playing?" | Artist search | ⚠️ No keyword input — run the city and filter event_name/attractions |
| "Events this weekend only" | Date filter | ⚠️ No date input — results are date-ascending; filter date afterwards |
| "Same for Berlin / London / New York" | Other markets | ❌ France and Spain only |
| "Book me two tickets" | Transaction | ❌ Read-only — open url |
| "How many seats are left?" | Inventory | ❌ Not returned |
| "Get me the promoter's contact" | Contact data | ❌ Not returned |
Should NOT route here: ticket prices or price ranges · buying, reserving or holding tickets · any market outside France and Spain · named-artist, tour or venue search · date-range or keyword filtering at the source · seat maps, price tiers or remaining inventory · past events and historical archives · promoter or organizer contact details · more than 100 events per category per run.
🧭 Agent Execution & Routing Logic
[Input User Query]│▼1. Is the market FRANCE or SPAIN? NO → Route elsewhere│ YES (Eventim = Germany w/ prices,│ Smart Event Scraper = 6 platforms,▼ All Events = global)2. Does the user want PRICES? YES → Abort/re-route: this Actor│ NO returns NO price field at all▼3. Buy / reserve / seat map / inventory? YES → Abort. Read-only. Hand them `url`│ NO▼4. Keyword, artist, venue or DATE-RANGE filter needed at the source?│ YES → Route to Smart Event Scraper, or run unfiltered here and filter the dataset▼5. Pick the location shape — PREFER CITY ALONE:├── city only → safest; the Actor infers the country, no contradiction possible├── country only → whole-country sweep└── city AND country → they MUST agree, or the run FAILS▼6. Choose categories from the SIX SCHEMA KEYS(concerts | sports | arts | family | film | misc — not API classification strings)▼7. Set maxEventsPerCategory ≤ 100 (default 50, free plans 5)│ ⚠️ PER CATEGORY: total ≈ cap × category count. Six categories at 100 = 600 records▼8. Deliver to a connector? YES → mcpConnector + mcpTool + {message}│ summary (1 call) / chunked (large sets) / perEvent (1 per event!)│ NO → set deliveryMode "none" (it defaults to summary)▼[Execute]│├──► SUCCEEDED, items > 0 ──► handle the data contract:│ absent scalars are "" not null → test truthiness│ date + time are venue-LOCAL, no offset → resolve the zone before converting│ status may be cancelled/postponed → filter to "onsale" if presenting as bookable│ an event in two categories appears twice → dedupe on `url`│ log shows "HTTP 4xx/5xx" for a category? → the set is PARTIAL│├──► SUCCEEDED, items == 0 ──► "No events found" per category: nothing upcoming there.│ Widen the categories, or sweep the whole country│└──► FAILED ──────────────► READ THE STATUS MESSAGE:"Provide at least a country or a city" → supply one"'<city>' is in '<xx>'..." → drop `country`, send only `city`
💰 Cost Control & Pricing Transparency
Pay-per-result: you are charged per event returned, with no monthly subscription. The exact rate is on the Actor's Pricing tab in the Apify Store.
Free Apify plans are capped at 5 events per category, so you can validate a city/category combination for a handful of results before a full sweep.
Autonomous spend caps: pass maxTotalChargeUsd as a query parameter on the run endpoint for a hard per-execution ceiling.
⚠️ Verify before publishing: this repo contains no
.actor/pay_per_event.jsonand the code makes noActor.charge()calls, so billing is configured entirely on the Store listing. Confirm the live pricing model and rate before publishing.
The cap multiplies by category — the one thing to watch. maxEventsPerCategory is per category, so:
| Categories selected | maxEventsPerCategory | Maximum records |
|---|---|---|
| 1 (concerts) | 50 (default) | 50 |
| 1 (concerts) | 100 | 100 |
| 3 (concerts, sports, arts) | 100 | 300 |
| 6 (all) | 100 | 600 |
| Any | 5 (free plan) | 5 × category count |
Platform usage is billed on top, and it's low here: this Actor is HTTP-only with no browser, and a 100-event category is a single API request plus a 0.25s pause. Runs finish in seconds and use very little compute.
Cost levers:
- Trim the category list. Each extra category multiplies the result count — and the bill.
- Validate at
maxEventsPerCategory: 5before committing to a 600-record sweep. - Prefer a city over a country sweep when you only care about one market.
- Dedupe on
urlbefore charging your own downstream systems — an event in two selected categories is billed twice here. - Prefer
summary/chunkeddelivery overperEvent— 1 connector call instead of hundreds. - Cap the spend with
maxTotalChargeUsdon any agent-driven run.
🔍 Companion machine-readable files
| File | Purpose |
|---|---|
.actor/actor.json | Identity, title, description, version, build tag, and the input / output / dataset schema references |
.actor/input_schema.json | Authoritative typed input contract — country and city enums, the 6-category enum, maxEventsPerCategory (1–100), and the 5 delivery fields |
.actor/dataset_schema.json | Two Console Output views — Overview (event, date, status, venue, classification, performers) and With images |
.actor/output_schema.json | Declares where results are stored |
my_actor/main.py | Discovery API querying, category mapping, paging, non-Ticketmaster filtering, record flattening, input validation, MCP delivery |
my_actor/connector.py | MCP connector session handling through the Apify MCP Proxy, including the tool input schemas it logs |
Note: this Actor has no pay_per_event.json and makes no Actor.charge() calls — billing is configured entirely on the Store listing.
If any table on this page disagrees with the schema files, the schema files win.
🛠️ Troubleshooting
| # | Symptom you see | Most likely cause | Fix |
|---|---|---|---|
| 1 | Run FAILED: Provide at least a country or a city | Both were empty — the schema marks neither required, but the code needs one | Supply city (preferred) or country. |
| 2 | Run FAILED: '<city>' is in '<xx>', but selected country is '<yy>' | Contradictory pair | Drop country and send only city. |
| 3 | Far more records than expected | maxEventsPerCategory is per category | Total ≈ cap × category count. Trim categories. |
| 4 | Exactly 5 per category | Free Apify plan cap | Upgrade; the log prints the upgrade banner. |
| 5 | Asked for 500 per category, got 100 | Schema maximum is 100 | Split across cities or categories. |
| 6 | 0 items, log No events found | Nothing upcoming in that category/city | Widen categories, or sweep the country. |
| 7 | Fewer results than the cap | Fewer events exist, or partner-domain results were filtered | Expected — there's no total-match count. |
| 8 | An event on ticketmaster.es is missing | Its URL was on a partner domain (Live Nation etc.) and was filtered out | By design. Check the debug log for Skipping non-TM. |
| 9 | Results stop mid-run for one category | Log shows HTTP 4xx/5xx — that category's request failed | Retry; treat the set as partial. Other categories still ran. |
| 10 | No price anywhere | The Actor requests price ranges but never parses them | Known gap. Use Eventim Scraper for prices. |
| 11 | Null checks never fire | Absent scalars are empty strings "" | Test truthiness, not is None. |
| 12 | time is empty | Not every event publishes a start time | Expected. Use date alone. |
| 13 | venue_address or state empty | The API doesn't always populate them | Expected; location is the safer display field. |
| 14 | Dates seem shifted by hours | date/time are venue-local with no offset | Resolve the venue's timezone before converting. |
| 15 | A cancelled event shown as bookable | The Actor doesn't filter status | Filter status == "onsale". |
| 16 | The same event twice | It matched two selected categories | Dedupe on url. |
| 17 | No keyword/artist/date filter available | Those inputs don't exist | Filter the dataset, or use Smart Event Scraper. |
| 18 | Wanted Germany / UK / US | Coverage is France and Spain only | Out of scope for this Actor. |
| 19 | Hundreds of connector calls | deliveryMode: "perEvent" | Switch to summary or chunked. |
| 20 | Notion / Airtable timed out | One call carrying every event is too large | Use deliveryMode: "chunked". |
| 21 | Connector rejected the arguments | mcpArguments doesn't match the tool's schema | Read the Connector [<tool>] expects arguments matching this schema: log line. |
| 22 | Slack / Notion received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 23 | Connector fired but the body is empty | mcpArguments did not reference {message} | Map {message} and populate mcpMessageTemplate. |
| 24 | Log APIFY_MCP_PROXY_URL is not set | You ran locally; connectors only resolve on the platform | Deploy with apify push and run on the platform. |
| 25 | HTTP 408 on run-sync-get-dataset-items | The synchronous endpoint has a hard 300-second ceiling | Use async POST /runs → poll → fetch. |
| 26 | HTTP 401 / 403 from Apify | Missing, expired or malformed APIFY_TOKEN | Regenerate in Apify Console → Settings → API & Integrations. |
| 27 | HTTP 429 from Apify | Apify account concurrency / rate limits | Retry with exponential backoff (2s → 4s → 8s). |
Known gaps
- No ticket prices.
includePriceRanges=yesis sent to the API, but the price data in the response is never read, so no price field is produced. This is the single most-requested field the Actor doesn't deliver. - France and Spain only. Two countries, ten cities. No Console path to other Ticketmaster markets.
- No keyword, artist, venue or date-range filter, and no event ID, on-sale start date, timezone or availability count in the output.
- A failed category is silent in the run status. The run still reports
SUCCEEDED; only the log reveals a partial result set.
Diagnostic checklist before opening an issue
- Baseline run.
{"city":"Madrid","categories":["concerts"],"maxEventsPerCategory":5,"deliveryMode":"none"}— Madrid concerts is a dense feed. - Items returned? If yes, the pipeline is fine and your earlier city/category combination was simply thin.
- Run FAILED? Read the status message — it names either the missing location or the city/country contradiction exactly.
- Scan the log per category. Each category logs its own line;
HTTP 4xx/5xxon one means that category's data is missing while others succeeded. - Confirm the counting model. Unexpected volume is almost always
maxEventsPerCategorybeing per-category rather than per-run.
If the issue survives all five steps, open an Issues ticket on the Actor page (or email support) with the run ID and the exact input JSON.
❓ FAQ
Setup & scope
Do I need a Ticketmaster API key?
No. The Actor calls the Discovery API with a key already built in, so there's no developer registration or quota for you to manage.
Is this scraping the Ticketmaster website?
No — it calls Ticketmaster's official Discovery API over plain HTTP. No browser, no HTML parsing, which is why it's fast, cheap, and stable against site redesigns.
Which countries and cities work?
France and Spain only: Madrid, Barcelona, Valencia, Sevilla and Zaragoza in Spain; Paris, Lyon, Marseille, Toulouse and Nice in France. Anything else is out of scope.
Can I plug it into Claude, Cursor, or a LangChain agent?
Yes — it is a native MCP tool:
claude mcp add --transport http apify "https://mcp.apify.com?tools=techforce.global/ticketmaster-fr-es-scraper"
Input behaviour
Should I pass a country, a city, or both?
Prefer the city alone. The Actor infers its country, so there's nothing to contradict. Pass country alone for a whole-country sweep. Passing both means they must agree — otherwise the run fails.
Why did my run fail instead of returning nothing?
Two input problems are hard failures by design: no location at all, and a city/country pair that disagrees. Both print an explicit status message, which is far more useful than an empty dataset.
Is maxEventsPerCategory per run or per category?
Per category. Six categories at 100 each is up to 600 records — and 600 billable results.
Can I search for a specific artist or a date range?
Not at the source — there's no keyword or date input. Run the city feed and filter on event_name / attractions / date, or use Smart Event Scraper which does filter by keyword and date range.
Output
Why is there no ticket price?
The Actor asks the API for price ranges but doesn't parse them, so nothing about pricing reaches the dataset. For live prices and stock, use Eventim Scraper (Germany).
Why are some fields empty strings instead of null?
That's the Actor's convention for absent scalars. state, time, venue_address, genre and image_url are the ones most often empty.
Are date and time in UTC?
No — they're the venue's local date and time, in separate fields, with no offset. Resolve the venue's timezone before comparing across markets.
What does status mean?
The on-sale state: onsale, offsale, cancelled, postponed, rescheduled. The Actor does not filter these out, so filter to onsale if you're presenting events as bookable.
Why does the same event appear twice?
It matched two of your selected categories. Dedupe on url.
Why is an event I can see on ticketmaster.es missing?
Its ticket URL was probably on a partner domain (Live Nation or similar), which the Actor filters out deliberately, or it fell outside your per-category cap.
Pricing
How is this billed?
Pay-per-result — charged per event returned, no monthly subscription. The current rate is on the Actor's Pricing tab. Apify platform usage is billed separately and is low, since there's no browser.
How do I keep a run cheap?
Fewer categories, a city rather than a country, and validate at maxEventsPerCategory: 5 first.
How do I guarantee an agent never overspends?
Pass maxTotalChargeUsd as a query parameter on the run endpoint.
🔗 Related Actors
Event data, by source and market
Pick by which market and which platform you need — and note that this Actor is the only one here without price data.
| Actor | Source | Market | Prices? | Why pick it over this one |
|---|---|---|---|---|
| This Actor | Ticketmaster Discovery API | France & Spain | ❌ No | The only coverage of Ticketmaster's FR/ES feed, key-free and HTTP-fast |
| Eventim Scraper | eventim.de | Germany | ✅ Entry price + in-stock | You need live commercial signals, not just listings |
| Smart Event Scraper | 6 platforms | Global | ⚠️ Varies | ✅ Category, keyword and date-range filters — the filtering this Actor has none of |
| All Events Scraper | allevents.in | Global | ⚠️ Varies | Multi-city discovery well beyond FR/ES |
| Eventbrite Scraper | eventbrite.com | Global | ⚠️ Varies | Organizer-led events, workshops, meetups, free events |
| District.in Event Scraper | district.in | India | ⚠️ Starting price | Indian city event feeds |
| Events Eye Scraper | eventseye.com | Global | ❌ No | Trade shows, B2B exhibitions, conferences |
⭐ Need filters or prices? Two clear upgrades. For category, keyword or date-range filtering, use Smart Event Scraper — one run, six platforms, standardised output. For ticket prices and availability, use Eventim Scraper, which returns an entry price and an
inStockboolean per event.Come back to this Actor when the market is France or Spain — it's the only one covering Ticketmaster's own FR/ES feed, and it needs no API key.
Enrichment & downstream pipeline
| Actor | Use it for |
|---|---|
| Google Maps Business Leads & Sales Intelligence | Venue contact details — email, phone, website — which this Actor never returns |
| Hospitality Lead Scraper | Bars, hotels and restaurants near a venue, for event-driven local outreach |
| Website Contact Scraper | Contact details from a venue's or promoter's own website |
| Advanced Website Crawling Actor | Crawl a venue's own site alongside the Ticketmaster listing |
Suggested pipeline patterns
📅 City event feed
Daily schedule per city → deliveryMode: "chunked" into Notion → a self-maintaining "what's on in Paris" page.
🔔 On-sale / cancellation monitor
Schedule per city → diff on url + status → alert to Slack when something goes on sale, or gets cancelled or postponed.
🏟️ Venue programming research
Run all six categories for a city → group on venue_name → see which venues are busiest and what they book.
🎯 Event-driven local sales Large upcoming events in a city → Google Maps Business Leads or Hospitality Lead Scraper for nearby venues → pitch catering, transport or accommodation ahead of the date.
🌍 Multi-market European feed This Actor (FR/ES) + Eventim Scraper (DE) + Eventbrite Scraper (long tail) → dedupe on event name + date + venue.
Browse all Actors by Techforce Global at apify.com/techforce.global.
🔐 Compliance & Data Privacy
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Ticketmaster, Live Nation Entertainment, or any venue, artist or promoter named in its output. All trademarks are the property of their respective owners.
It reads publicly available event listings from Ticketmaster's own official Discovery API. It does not log in, does not accept credentials, and never buys, reserves or holds tickets.
The output is commercial event data, not personal data — event titles, venues, dates, classifications and public URLs. Performer names in attractions are stage and act names published commercially, so privacy exposure is minimal compared with a contact-data scraper. Three things still apply:
- Use of the Discovery API is governed by Ticketmaster's developer terms. Because the API key ships with the Actor, you are relying on its terms of use — including attribution and redistribution conditions — every time you run it. Review them before republishing the data commercially: https://developer.ticketmaster.com/support/terms-of-use/
- Listings and on-sale status are volatile and time-stamped by the run, not by Ticketmaster. Republishing them as current — in an app, a newsletter or an aggregator — means committing to a refresh cadence. Consumer-protection and price-transparency rules in France (Code de la consommation) and Spain (Ley General para la Defensa de los Consumidores y Usuarios) apply to how you present event and ticket information; always attribute the source and link through to
url. - Automated ticket purchasing is regulated, and this Actor doesn't do it. France and Spain both restrict automated purchasing and unauthorised resale of tickets. This Actor is strictly read-only; if you build resale or bulk-purchase tooling downstream, that's your compliance obligation.
You remain responsible for ensuring your use complies with Ticketmaster's API terms and terms of service, applicable data-protection law (GDPR / UK GDPR / CCPA), and consumer-protection and ticketing rules in the markets you operate in.
🆘 Support & Custom Pipeline Engineering
Need additional Ticketmaster markets, price ranges wired into the output, keyword or date-range filtering, scheduled on-sale monitoring with change detection, or a full event-intelligence pipeline?
- Email: bhavin.shah@techforceglobal.com
- Custom Enterprise Integrations: Book a 15-Minute Technical Consultation
- Maintained by: Techforce Global — Specialists in High-Performance Web Scrapers and Agentic Workflows.
Made with ❤️ by Techforce Global Specialists in High-Performance Web Scrapers and AI Automation.
🏷️ Structured data for search & AI discovery
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "Ticketmaster Event Scraper (France & Spain) — Concerts, Sports & Theatre by City","applicationCategory": "BusinessApplication","operatingSystem": "Cloud (Apify platform)","description": "Fetches upcoming Ticketmaster events for ten French and Spanish cities from Ticketmaster's official Discovery API — event name, venue-local date and time, venue name and address, on-sale status, segment and genre classification, performer names, promo image and the direct ticket URL — across six categories, with no Ticketmaster API key required. HTTP-only with no browser, and optional delivery into Notion, Slack, Airtable, Google Sheets or any authorized MCP connector. Note: ticket prices are not included in the output.","url": "https://apify.com/techforce.global/ticketmaster-fr-es-scraper","offers": {"@type": "Offer","priceCurrency": "USD","description": "Pay-per-result, charged per event returned. The current rate is listed on the Actor's Pricing tab."}}