Ticketmaster France & Spain Scraper avatar

Ticketmaster France & Spain Scraper

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Ticketmaster France & Spain Scraper

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

Techforce Global

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

0

Monthly active users

14 days ago

Last modified

Share

Ticketmaster Event Scraper (France & Spain) — Concerts, Sports & Theatre by City, via the Official Discovery API

Apify Actor MCP Ready Source Coverage No API key

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 es and fr, 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 / CapabilityDiscovery API, directThis Actor
API key⚠️ Register a developer account and manage a key + quotaNone needed — works out of the box
Response shape⚠️ Deeply nested _embeddedvenues[]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 eventsFiltered 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 OFFICIAL
Discovery API v2, called over plain HTTP with an embedded key. Not a website
scrape, 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 least
one of `country` or `city` is supplied.
city_country_consistency: >
If both are given and disagree (e.g. city Paris with country es) the run FAILS
with an explicit status message. Supplying only a city is safest - the Actor
infers its country.
categories_default: ["concerts"]
max_events_format:
type: "integer"
range: [1, 100]
default: 50
per_category: true
free_plan_cap: 5
total_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 NO
price 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) are
dropped, so the dataset can be smaller than the API's own count.
limits:
events_per_category_per_run: 100
free_plan_cap: 5
countries: 2
cities: 10
page_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, or
spot large upcoming events in those markets.
when_not_to_use: >
You need ticket prices, you need a market outside France and Spain, you need to
search a named artist or venue, you need date-range or keyword filtering, or you
want 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 maxEventsPerCategory cap: Concerts, Sports, Arts & Theatre, Family, Film, Miscellaneous. The plain labels are mapped to the exact classificationName strings the API expects (artsarts & theatre, miscmiscellaneous).
  • 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 of classifications[0], performers collected from _embedded.attractions[], and the largest available promo image picked from the sorted images[] 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 ticketmaster domain is dropped.
  • Fails fast on contradictory input. Asking for city: "Paris" with country: "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 mcpArguments is 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

ScenarioFit
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 rangesNot 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)

  1. The schema marks nothing required, but the run fails without country or city. Supply at least one, or the run ends FAILED with ❌ Provide at least a country or a city.
  2. A city/country mismatch is a hard failure, not an empty result. city: "Paris" with country: "es" ends with ❌ 'Paris' is in 'fr', but selected country is 'es'. Supplying only the city is safest — the Actor infers its country automatically.
  3. France and Spain only. The Console offers es/fr and ten cities. Anything else is out of scope.
  4. maxEventsPerCategory is per category, not per run. Three categories at 50 each is up to 150 records. Range is 1100; free Apify plans are capped at 5 per category.
  5. 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.
  6. 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.
  7. Category values are the six schema keysconcerts, sports, arts, family, film, miscnot the API's classification strings. Sending "music" or "arts & theatre" passes straight through to the API unmapped and may behave unexpectedly.
  8. 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.
  9. Missing values are empty strings "", not nullstate, time, venue_address, genre and image_url are all commonly empty. attractions is [] when there are no listed performers.
  10. date and time are 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.
  11. status is the on-sale state, not a data-quality flagonsale, offsale, cancelled, postponed, rescheduled. A cancelled event still appears in the dataset.
  12. country in the output is the venue's country code, uppercased (ES, FR) — it can differ from what you passed if the venue record says otherwise.
  13. 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.
  14. deliveryMode defaults to summary, not none — one connector call per run. Switching to perEvent on a 150-event run makes 150 calls.
  15. Use chunked for 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: none
platform: "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

FieldTypeRequiredDefaultAllowed Values / FormatExample
countryenum⚠️ One of country/city"es"es, fr"fr"
cityenum⚠️ One of country/citynone10 cities — see below"Paris"
categoriesarray⬜ No["concerts"]concerts, sports, arts, family, film, misc["concerts","sports"]
maxEventsPerCategoryinteger⬜ No501100; free plans capped at 5100

⚠️ The schema declares no required fields, but the code fails the run if both country and city are empty. Treat "one of the two" as required.

Supported countries & cities

CountryCities
🇪🇸 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 labelDiscovery API classificationName
concertsConcertsmusic
sportsSportssports
artsArts & Theatrearts & theatre
familyFamilyfamily
filmFilmfilm
miscMiscellaneousmiscellaneous

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.

ParameterTypeDefaultDescription
mcpConnectorstring""Authorized MCP connector on your Apify account (Notion, Slack, Airtable, Sheets, …). Leave empty for dataset-only runs.
deliveryModeenumsummarysummary (one call with every event) · chunked (split across calls) · perEvent (one call per event) · none.
mcpToolstring""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.
mcpArgumentsobject{}Arguments passed to the tool. String leaves support {placeholders}.
mcpMessageTemplatestring""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

FieldTypeEmpty valueMeaning
event_namestring""Event title as listed on Ticketmaster
urlstring""Direct Ticketmaster ticket page — use as the dedupe key
countrystring""Venue's country code, uppercased (ES, FR)
citystring""Venue's city, falling back to the requested city
statestring⚠️ often ""Region/state name where the API provides one
locationstring""city, state, COUNTRY joined — convenient single-line display
categorystring""The category you requested (concerts, sports, …)
segmentstring""Ticketmaster's top-level classification (Music, Sports, …)
genrestring⚠️ can be ""Genre within the segment (Rock, Football, …)
datestring""Venue-local start date, YYYY-MM-DD
timestring⚠️ often ""Venue-local start time, HH:MM:SSno timezone offset
statusstring""onsale · offsale · cancelled · postponed · rescheduled
venue_namestring""Venue name
venue_addressstring⚠️ often ""Street address line 1 only
attractionsarray of string[]Performer / attraction names
image_urlstring""Largest available promo image URL

⚠️ No price fields, by omission. The Actor sends includePriceRanges=yes to 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 mix
print(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 messageMeaning
❌ 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 foundThat category genuinely matched nothing
<place> | <category> | HTTP 4xx/5xxThe Discovery API rejected or failed that category's request — partial results
<place> | <category> | Request failedNetwork/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 os
from collections import Counter
from apify_client import ApifyClient
client = 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().items
print(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 offset
print(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'
# 1. Start execution with a hard spend limit
curl -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. Poll
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/actor-runs/<runId>'
# 3. Retrieve when SUCCEEDED
curl -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 CodeDetection ConditionUnderlying CauseDeterministic Agent Action
AUTH_INVALIDHTTP 401 from ApifyMissing or malformed APIFY_TOKENAbort & Prompt User: request a valid Apify API token.
RATE_LIMITEDHTTP 429 from ApifyApify API rate / concurrency limitsRetry: exponential backoff (2s, 4s, 8s).
SYNC_TIMEOUTHTTP 408 on the sync endpointRun exceeded the 300s synchronous ceilingReconfigure: async POST /runs + polling.
NO_LOCATIONRun FAILED: ❌ Provide at least a country or a city.Both country and city emptyModify Input: supply one.
CITY_COUNTRY_MISMATCHRun FAILED: ❌ '<city>' is in '<xx>', but selected country is '<yy>'.Contradictory pairModify Input: drop country and send only city.
UNSUPPORTED_MARKETUser wants a country other than FR/ESCoverage is France and Spain onlyRe-route: Eventim Scraper (Germany), Smart Event Scraper, or the Discovery API directly.
PRICE_EXPECTEDConsumer looks for a price fieldNo price is produced — the API response's price data is discardedFix Expectation / Re-route: Eventim Scraper for price + stock.
FILTER_UNSUPPORTEDAgent passes keyword, artist, venue, dateFrom, …No such inputs existRe-route to Smart Event Scraper for keyword/date filtering, or filter the dataset.
WRONG_CATEGORY_VALUEOdd or empty results with a category setAn API classification string (music, arts & theatre) was sent instead of a schema keyModify Input: use concerts, sports, arts, family, film, misc.
VOLUME_UNDERESTIMATEDFar more records than expectedmaxEventsPerCategory is per categoryFix Expectation: total ≈ cap × category count.
FREE_PLAN_CAP5 events per category, upgrade banner in the logFree Apify plan capPrompt User: upgrade for full-volume runs.
SIZE_CLAMPEDAsked for more than 100 per categorySchema maximum is 100Reconfigure: split by category or city.
EMPTY_CATEGORYLog <place> | <category> | No events foundNothing upcoming in that category thereModify Input: try another category or a country-wide sweep.
PARTIAL_RESULTSSUCCEEDED but log shows HTTP 4xx/5xx for a categoryThat category's API request failed; others continuedRetry the same input; treat the set as incomplete meanwhile.
UPSTREAM_API_ERRORLog Request failed for a categoryNetwork/transport error reaching the Discovery APIRetry with backoff.
NO_TOTAL_COUNTAgent wants to know how many events matchedNot exposed in the outputFix Expectation: report what was returned.
EMPTY_STRING_NOT_NULLNull checks pass but values unusableAbsent scalars are ""Fix Code: test truthiness.
TZ_MISMATCHOff-by-hours date comparisonsdate/time are venue-local with no offsetFix Code: resolve the venue's zone before converting.
CANCELLED_INCLUDEDA cancelled event presented as bookablestatus is not filtered by the ActorFix Code: filter status == "onsale".
DUPLICATE_EVENTSThe same event twiceIt matched two selected categoriesFix Code: dedupe on url.
MISSING_FROM_FEEDAn event on ticketmaster.es isn't in the outputIts URL was on a partner domain and got filtered, or it fell outside the capReconfigure: raise the cap; otherwise expected.
NO_SEAT_DATANo seat map or tiersNot returnedFix Expectation: open url.
DELIVERY_SKIPPEDLog no tool name was providedmcpConnector set but mcpTool emptyModify Input: set mcpTool; the dataset is already saved.
DELIVERY_TOOL_UNKNOWNLog Tool 'x' is not available on this connectorWrong tool name for that connectorModify Input: pick a name from the Available tools: list in the same log line.
DELIVERY_ARGS_INVALIDConnector rejects the argumentsmcpArguments doesn't match the tool's schemaRead the log: the line Connector [<tool>] expects arguments matching this schema: prints the exact shape.
DELIVERY_EMPTYConnector called, body emptymcpArguments omitted the {message} placeholderModify Input: map {message} inside mcpArguments.
DELIVERY_FLOODHundreds of connector callsdeliveryMode was set to perEventReconfigure: use summary or chunked.
MCP_PROXY_MISSINGLog APIFY_MCP_PROXY_URL is not setRunning locally instead of on the platformReconfigure: apify push and run on the platform.
CHARGE_LIMITRun aborted before all categories finishedmaxTotalChargeUsd spend threshold reachedPrompt 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 saysIntentConstructed 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 checkrun, then filter status != "onsale"
"Track new on-sales in Toulouse daily"Monitoringschedule {"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?"PricingNo 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.json and the code makes no Actor.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 selectedmaxEventsPerCategoryMaximum records
1 (concerts)50 (default)50
1 (concerts)100100
3 (concerts, sports, arts)100300
6 (all)100600
Any5 (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: 5 before committing to a 600-record sweep.
  • Prefer a city over a country sweep when you only care about one market.
  • Dedupe on url before charging your own downstream systems — an event in two selected categories is billed twice here.
  • Prefer summary/chunked delivery over perEvent — 1 connector call instead of hundreds.
  • Cap the spend with maxTotalChargeUsd on any agent-driven run.

🔍 Companion machine-readable files

FilePurpose
.actor/actor.jsonIdentity, title, description, version, build tag, and the input / output / dataset schema references
.actor/input_schema.jsonAuthoritative typed input contract — country and city enums, the 6-category enum, maxEventsPerCategory (1–100), and the 5 delivery fields
.actor/dataset_schema.jsonTwo Console Output views — Overview (event, date, status, venue, classification, performers) and With images
.actor/output_schema.jsonDeclares where results are stored
my_actor/main.pyDiscovery API querying, category mapping, paging, non-Ticketmaster filtering, record flattening, input validation, MCP delivery
my_actor/connector.pyMCP 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 seeMost likely causeFix
1Run FAILED: Provide at least a country or a cityBoth were empty — the schema marks neither required, but the code needs oneSupply city (preferred) or country.
2Run FAILED: '<city>' is in '<xx>', but selected country is '<yy>'Contradictory pairDrop country and send only city.
3Far more records than expectedmaxEventsPerCategory is per categoryTotal ≈ cap × category count. Trim categories.
4Exactly 5 per categoryFree Apify plan capUpgrade; the log prints the upgrade banner.
5Asked for 500 per category, got 100Schema maximum is 100Split across cities or categories.
60 items, log No events foundNothing upcoming in that category/cityWiden categories, or sweep the country.
7Fewer results than the capFewer events exist, or partner-domain results were filteredExpected — there's no total-match count.
8An event on ticketmaster.es is missingIts URL was on a partner domain (Live Nation etc.) and was filtered outBy design. Check the debug log for Skipping non-TM.
9Results stop mid-run for one categoryLog shows HTTP 4xx/5xx — that category's request failedRetry; treat the set as partial. Other categories still ran.
10No price anywhereThe Actor requests price ranges but never parses themKnown gap. Use Eventim Scraper for prices.
11Null checks never fireAbsent scalars are empty strings ""Test truthiness, not is None.
12time is emptyNot every event publishes a start timeExpected. Use date alone.
13venue_address or state emptyThe API doesn't always populate themExpected; location is the safer display field.
14Dates seem shifted by hoursdate/time are venue-local with no offsetResolve the venue's timezone before converting.
15A cancelled event shown as bookableThe Actor doesn't filter statusFilter status == "onsale".
16The same event twiceIt matched two selected categoriesDedupe on url.
17No keyword/artist/date filter availableThose inputs don't existFilter the dataset, or use Smart Event Scraper.
18Wanted Germany / UK / USCoverage is France and Spain onlyOut of scope for this Actor.
19Hundreds of connector callsdeliveryMode: "perEvent"Switch to summary or chunked.
20Notion / Airtable timed outOne call carrying every event is too largeUse deliveryMode: "chunked".
21Connector rejected the argumentsmcpArguments doesn't match the tool's schemaRead the Connector [<tool>] expects arguments matching this schema: log line.
22Slack / Notion received nothingDelivery needs both mcpConnector and mcpToolSet both. The dataset is still written in full.
23Connector fired but the body is emptymcpArguments did not reference {message}Map {message} and populate mcpMessageTemplate.
24Log APIFY_MCP_PROXY_URL is not setYou ran locally; connectors only resolve on the platformDeploy with apify push and run on the platform.
25HTTP 408 on run-sync-get-dataset-itemsThe synchronous endpoint has a hard 300-second ceilingUse async POST /runs → poll → fetch.
26HTTP 401 / 403 from ApifyMissing, expired or malformed APIFY_TOKENRegenerate in Apify Console → Settings → API & Integrations.
27HTTP 429 from ApifyApify account concurrency / rate limitsRetry with exponential backoff (2s → 4s → 8s).

Known gaps

  • No ticket prices. includePriceRanges=yes is 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

  1. Baseline run. {"city":"Madrid","categories":["concerts"],"maxEventsPerCategory":5,"deliveryMode":"none"} — Madrid concerts is a dense feed.
  2. Items returned? If yes, the pipeline is fine and your earlier city/category combination was simply thin.
  3. Run FAILED? Read the status message — it names either the missing location or the city/country contradiction exactly.
  4. Scan the log per category. Each category logs its own line; HTTP 4xx/5xx on one means that category's data is missing while others succeeded.
  5. Confirm the counting model. Unexpected volume is almost always maxEventsPerCategory being 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.


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.

ActorSourceMarketPrices?Why pick it over this one
This ActorTicketmaster Discovery APIFrance & Spain❌ NoThe only coverage of Ticketmaster's FR/ES feed, key-free and HTTP-fast
Eventim Scrapereventim.deGermanyEntry price + in-stockYou need live commercial signals, not just listings
Smart Event Scraper6 platformsGlobal⚠️ VariesCategory, keyword and date-range filters — the filtering this Actor has none of
All Events Scraperallevents.inGlobal⚠️ VariesMulti-city discovery well beyond FR/ES
Eventbrite Scrapereventbrite.comGlobal⚠️ VariesOrganizer-led events, workshops, meetups, free events
District.in Event Scraperdistrict.inIndia⚠️ Starting priceIndian city event feeds
Events Eye Scrapereventseye.comGlobal❌ NoTrade 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 inStock boolean 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

ActorUse it for
Google Maps Business Leads & Sales IntelligenceVenue contact details — email, phone, website — which this Actor never returns
Hospitality Lead ScraperBars, hotels and restaurants near a venue, for event-driven local outreach
Website Contact ScraperContact details from a venue's or promoter's own website
Advanced Website Crawling ActorCrawl 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?


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."
}
}