SeatGeek Scraper - Events, Venues & Ticket Listings
Pricing
from $2.20 / 1,000 result written to datasets
SeatGeek Scraper - Events, Venues & Ticket Listings
Extract SeatGeek events, performers, venues and individual ticket listings across the US and Canada. Get dates, seat locations, prices and deal scores, billed per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 result written to datasets
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
51
Total users
27
Monthly active users
9.2 hours
Issues response
18 hours ago
Last modified
Categories
Security
Limited permissionsShare
SeatGeek Scraper
Extract SeatGeek events, performers, venues and ticket listings across the US and Canada as rows you can export.
- Event dates, venue details, price ranges and ticket counts.
- Individual ticket listings with seat locations, prices and deal scores.
- Keyword search and discovery of performers, venues and categories.
- Pay for delivered rows: $3.00 per 1,000 rows on the Free plan, plus a start fee.
What does SeatGeek Scraper do?
SeatGeek Scraper collects information from seatgeek.com for event research and ticket-price comparisons. Each dataset row represents one entity or ticket listing, not a whole inventory hidden inside one row.
- Browse events: choose
city,performer,venue,categoryorsports. - Select an event: use
eventwith an event URL or ID. - Search: use
searchfor matching events, performers and venues. - Discover: use
discoverfor a selected entity type. - Ticket listings:
includeListingsis off by default. Each listing is a separately billed row; event details are copied onto it. - Optional detail:
includeSeatMapadds available map information;includeRawretains original entity data. Both are off by default.
What data can you extract from SeatGeek?
Event and discovery rows
These rows use rowType: "event", including discovered entities. Check type to distinguish an event, performer, venue, taxonomy or performer section. Fields depend on the selected entity.
| Field | Description | Example |
|---|---|---|
id | Event or entity identifier | 17123456 |
title | Event title or entity name | New York Knicks vs. Boston Celtics |
type | Event category or entity type | nba, performer |
datetimeLocal | Start time at the venue | 2026-11-20T19:30:00 |
datetimeUtc | Start time in UTC | 2026-11-21T00:30:00Z |
venueName | Venue name | Madison Square Garden |
venueCity | Venue city | New York |
venueCountry | Venue country | US |
lowestPrice | Lowest reported event price | 85 |
listingCount | Reported listings, not delivered rows | 342 |
performerNames | Performing acts or teams | ["New York Knicks"] |
url | SeatGeek page | https://seatgeek.com/events/17123456 |
slug | Discovery identifier for later input | new-york-yankees |
numUpcomingEvents | Upcoming count, when available | 12 |
score | SeatGeek popularity score | 0.82 |
Ticket-listing rows
These rows use rowType: "listing". Event dates, venue details and the event URL accompany each listing.
| Field | Description | Example |
|---|---|---|
listingId | Ticket listing identifier; also id | example-listing-001 |
eventId | Parent event identifier | 17123456 |
section | Seating section | 101 |
row | Seat row label | 12 |
seats | Seat numbers, if supplied | ["1", "2"] |
quantity | Tickets available in this listing | 2 |
splitQuantities | Allowed purchase quantities | [2] |
price | Price excluding fees | 180 |
priceWithFees | Price including fees | 214.25 |
dealScore | SeatGeek listing value score | 82.4 |
deliveryMethod | Ticket delivery method | mobile_transfer |
inventoryCurrency | Currency information from the source | USD |
inventoryComplete | Whether the collected inventory was complete | true |
inventoryUnfilteredTotal | Inventory count before filters | 342 |
seatGeometryStatus | Seat-to-map join: matched, partial, unmatched, no_seat_numbers | matched |
seatGeometrySource | Which join path matched: primary, spatial_key or suffix | spatial_key |
rawFields | Original fields for this listing | {"id":"example-listing-001"} |
An inventory total is not a promise that every listing is in your dataset: filters and maxResults still apply.
How to scrape SeatGeek
- Open SeatGeek Scraper in Apify Console.
- Fill one target field and leave
modeonauto. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Open the dataset and download the rows.
Empty input starts an example run using city: "nyc" and at most 3 rows. Normal pricing applies; this is not a free preview. One filled target selects its matching mode automatically. Use explicit mode for sports or discover.
City
Enter a city slug such as nyc, chicago or toronto. Optionally select a cityTab.
Performer
Enter performerSlug to list a team's or act's events.
Venue
Enter venueSlug to list events at that venue.
Event
Paste eventUrl or enter numeric eventId. Turn on includeListings for individual ticket rows instead of event metadata.
Category
Enter categorySlug, such as mlb-tickets, to browse that category.
Sports
Set mode: "sports". With no category, the Actor uses the sports listing.
Search
Enter query for mixed event, performer and venue matches. With includeListings, only matching events are used to collect ticket rows.
Discover
Set mode: "discover" and choose discoverType. query is optional. Use returned IDs or slugs as inputs for later runs.
With discoverType: "events", city scopes the event list to that city and dateFrom/dateTo bound the date window — all three filter server-side via SeatGeek's public API.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | auto or a mode described above | auto |
city | City slug | Example: nyc |
performerSlug | Act or team slug | Empty |
venueSlug | Venue slug | Empty |
eventUrl | SeatGeek event URL ending in an event number | Empty |
eventId | Numeric event ID, at least 5 digits | Empty |
startUrls | List of SeatGeek page URLs | Empty |
detailUrls | List of event URLs | Empty |
listingIds | List of event IDs, not ticket listing IDs | Empty |
categorySlug | Category slug | Empty |
query | Search keyword or discovery filter | Empty |
discoverType | performers, venues, taxonomies, events, recommendations, performerSections | performers |
dateFrom | Earliest event date for discoverType: "events", YYYY-MM-DD | Empty |
dateTo | Latest event date for discoverType: "events", YYYY-MM-DD | Empty |
performerId | Numeric ID for performerSections | Empty |
maxResults | Rows per input, from 1 to 500 | 70; form example 3 |
maxPages | Catalog pages to inspect, from 1 to 50 | 1 |
includeListings | Return individual ticket listings | false |
cityTab | concerts, sports, theater, festivals, comedy, family, nightlife | Empty |
minDealScore | Minimum listing score, from 0 to 100 | Empty |
listingFilters | Price, quantity, section, marketplace, delivery or sorting filters | Empty |
includeSeatMap | Include seating-map info; seats join mapkeys via spatial section keys too | false |
enrichDetails | Venue address and organization details; no extra phone lookup | true |
includeRaw | Retain original event/entity data | false |
trackChanges | Complete-inventory comparisons; skipped for ticket-listing rows | false |
alertWebhookUrl | Alert destination when a complete tracking comparison exists | Empty |
eventHints | Old event IDs mapped to title, venueId, datetimeUtc | Empty |
Examples, one per mode. Replace the illustrative event ID with a current one.
City
{"city":"nyc","cityTab":"concerts","maxResults":3}
Performer
{"performerSlug":"new-york-yankees","maxResults":3}
Venue
{"venueSlug":"madison-square-garden","maxResults":3}
Event
{"eventId":"17123456","includeListings":true,"maxResults":3}
Category
{"categorySlug":"mlb-tickets","maxResults":3}
Sports
{"mode":"sports","maxResults":3}
Search
{"query":"boston celtics","maxResults":3}
Discover
{"mode":"discover","discoverType":"venues","query":"madison square garden","maxResults":3}
maxItems and limit are aliases for the per-input row limit, maxResults. keyword maps to query; urls maps to startUrls. Close misspellings are corrected; other unknown fields are ignored with a note. The INPUT_REPORT record in the default key-value store records inferred, corrected, filled and ignored fields.
Invalid target input stops before any row charge with INVALID_INPUT: <field> — <how to fix>. Invalid filters may instead be ignored, so check INPUT_REPORT. Use one target family per run to avoid competing mode choices.
listingFilters accepts minPrice, maxPrice including fees, quantity, sections, markets, deliveryMethods, and sort set to price, priceDesc or dealScore. Quantity must match an available purchase split.
Output example
Illustrative ticket-listing row, not a current offer:
{"rowType": "listing","id": "example-listing-001","listingId": "example-listing-001","eventId": "17123456","title": "New York Knicks vs. Boston Celtics","datetimeUtc": "2026-11-21T00:30:00Z","venueName": "Madison Square Garden","section": "101","row": "12","quantity": 2,"price": 180,"priceWithFees": 214.25,"dealScore": 82.4,"url": "https://seatgeek.com/events/17123456"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Large row details may be stored in the run's key-value store: inventoryStorage lists the attachment records and decoding instructions.
Why use this SeatGeek scraper?
- Row-based billing: failed pages do not become charged result rows; the start fee is separate.
- Partial delivery: available partial results can be delivered after a collection stops or times out. Rows already in the dataset remain accessible; an abrupt run stop can prevent undelivered rows from reaching it.
- Visible problems: input errors identify what to fix; run records retain warnings.
- Source values: missing seat details and contacts are not invented.
- Several inputs: submit multiple URLs or event IDs in one run.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape SeatGeek?
The Actor uses pay-per-event pricing. Platform usage is included in these prices. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. At the default 1024 MB, the start fee is $0.005.
| Apify plan | Start fee at 1024 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.002 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxResults applies to each listed URL or event ID; a single city, performer, venue, category, search or discovery target counts as one input. The default is 70; larger requests are collected in parts of 70. Event/entity and listing rows count toward the same input limit.
Free Apify plan runs are capped at 200 rows, with a developer-set allowance of 10 runs of this Actor. The whole run stops at Maximum cost per run (maxTotalChargeUsd in the API). Limits do not guarantee enough matching data exists.
Example: three event IDs with maxResults: 5 deliver 15 listing rows. On the Free plan at 1024 MB, the cost is 15 × $0.003 + $0.005 = $0.050. Zero delivered rows incur no row charges, but the start fee still applies.
What happens when the run timeout is too short
If collection needs longer than your chosen timeout, the Actor can pause with the status message "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." The run temporarily shows ABORTED.
When results are ready, the same run resumes, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped rather than delivered or charged again. No manual restart is needed for this pause.
- Automatic pausing is limited to at most 3 times per run. Keep the default timeout of 3600 seconds to reduce interruptions.
- Synchronous endpoints
run-syncandrun-sync-get-dataset-itemswait at most 300 seconds and can return an empty dataset while the run is paused. For longer work, start asynchronously and read the dataset afterSUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
In Claude, ChatGPT, Cursor, VS Code or another client supporting remote MCP servers, add:
https://mcp.apify.com?tools=lentic_clockss/seatgeek-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; the agent reads rows using get-dataset-items.
For clients without remote support, run npx @apify/actors-mcp-server --tools lentic_clockss/seatgeek-scraper with APIFY_TOKEN set.
Example prompt: "Find three upcoming events in New York using city nyc. Return titles, dates, venues and lowest prices."
Apify API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/seatgeek-scraper").call(run_input={"city": "nyc", "maxResults": 3})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/seatgeek-scraper').call({ city: 'nyc', maxResults: 3 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP calls, send the input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~seatgeek-scraper/runs, with your token in the Authorization: Bearer header. Read completed results using GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or webhooks. Apify Schedules can start recurring runs.
FAQ
Is it legal to scrape SeatGeek?
This Actor collects public data. You are responsible for checking SeatGeek's terms and applicable data-protection law. Processing personal data requires a lawful basis; public visibility alone does not establish one.
Why did my run end as ABORTED?
Read the status message. The automatic pause described above can temporarily show ABORTED; not every aborted run is waiting to resume. A manual abort or other failure needs separate investigation.
How many results can I get?
maxResults accepts 1–500 per input. Available matches, maxPages, the Free-plan allowance and your spending cap can reduce delivery. Start with 3 rows before increasing the limit.
Why are some fields empty?
Availability varies by event and entity. Venue phones and emails are returned as empty arrays; no named box-office contact is supplied. Missing seats are not guessed.
Do I need a SeatGeek API key?
No SeatGeek API key is required as input. Calling the Actor through the Apify API requires your Apify token.
How do I track price changes?
Schedule runs and compare listingId and priceWithFees yourself. Built-in trackChanges is skipped for listing-row runs; alertWebhookUrl does not enable tracking of partial inventories. A missing listing is not proof of a sale.
What if there are no matching events?
A confirmed empty result can finish successfully with zero rows. Collection failures are different and are reported as errors. Neither case creates billable placeholder rows.
Does it support Canadian events?
Use Canadian city slugs such as toronto, montreal or vancouver. Read the returned currency information rather than assuming every amount is in US dollars.
Limitations
- Coverage is for SeatGeek's US and Canadian catalog, not every ticket marketplace or country.
- Inventory, prices and event availability can change between runs; completeness does not imply a guaranteed purchase price.
- Discovery surfaces, maps and seat geometry depend on source availability. General-admission tickets may have no individual seat geometry; listings without seat numbers report
seatGeometryStatus: "no_seat_numbers". eventHintsmay identify a replacement for an unavailable event, but matching is probabilistic. Ambiguous candidates are not substituted; checkeventResolution.- Normal output uses separate ticket rows, not nested full inventories or per-section summary arrays.
Related scrapers
More event and ticketing scrapers from the same publisher:
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.