Vivid Seats Events & Ticket Listings Scraper
Pricing
Pay per event
Vivid Seats Events & Ticket Listings Scraper
ποΈ Extract public Vivid Seats event schedules and live ticket inventory with venue details, prices, sections, rows, quantities, deal scores, perks, and snapshot timestamps.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Extract public Vivid Seats event schedules and live resale-ticket inventory into clean, typed datasets.
Use performer pages, search/category pages, event URLs, or production IDs to collect:
- ποΈ event names, dates, categories, and performers
- π venue names, addresses, coordinates, time zones, and capacities
- π listing counts, ticket counts, and price summaries
- πΊ sections, rows, available quantities, and listing IDs
- π΅ base, all-in, and localized ticket prices
- β deal scores, badges, perks, and delivery notes
The Actor uses an anonymous browser session to clear Vivid Seats' JavaScript challenge, then queries the public data calls used by the website. No Vivid Seats login or API key is required.
What does this Vivid Seats scraper do?
The scraper turns current Vivid Seats event and ticket inventory into structured JSON.
It supports two related workflows:
- Discover events attached to a performer, team, tournament, search, or category page.
- Snapshot the live ticket listings attached to selected production IDs.
Events and listings are saved separately, so analysts can join them by productionId without mixing different record shapes.
Who is it for?
Ticket brokers
Monitor price, quantity, section, and row changes for selected events.
Resale-pricing teams
Build time-series snapshots of minimum prices, deal scores, and inventory depth.
Event discovery products
Import upcoming dates, venues, performers, and source URLs into calendars or catalogs.
Market analysts
Compare supply and price distributions across events, venues, categories, and dates.
Data engineers
Schedule a stable extraction job and send the named datasets to a warehouse or dashboard.
Why use this Actor?
- β No Vivid Seats account or private API credential
- β Event discovery and listing extraction in one run
- β Stable normalized numeric fields instead of opaque website keys
- β Separate Events and Ticket Listings datasets
- β Direct production-ID mode for repeated snapshots
- β Optional currencies and Apify Proxy sessions
- β Configurable limits for predictable run size
- β Fail-closed validation for unsupported URLs and empty extraction
Supported Vivid Seats inputs
Use one or more of these inputs:
- Performer URL, such as a team, artist, or tournament page
- Event URL containing
/production/<id> - Search or category URL that displays links to event productions
- Numeric production ID copied from a Vivid Seats event URL
All URLs must use the vividseats.com domain.
At least one URL or production ID is required.
Quick start
- Open the Actor input page.
- Paste a Vivid Seats performer or event URL.
- Keep
includeListingsenabled for ticket-level output. - Choose low event and listing limits for the first run.
- Select a currency.
- Click Start.
- Open the Events and Ticket Listings datasets.
Example event-discovery input:
{"startUrls": [{"url": "https://www.vividseats.com/big-12-mens-basketball-tournament-tickets--sports-ncaa-basketball/performer/81"}],"includeListings": false,"maxEvents": 10,"currency": "USD"}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | sample performer | Vivid Seats performer, search/category, or production URLs |
productionIds | array | [] | Direct production IDs for inventory snapshots |
includeListings | boolean | true | Save listing-level ticket records |
maxEvents | integer | 10 | Maximum event records across inputs |
maxListingsPerEvent | integer | 20 | Maximum ticket listings for each event |
currency | string | USD | USD, CAD, EUR, GBP, or AUD |
navigationTimeoutSecs | integer | 45 | Browser navigation timeout |
proxyConfiguration | object | none | Optional Apify Proxy settings |
Keep limits low when validating a new target or proxy configuration.
Output datasets
The Actor declares two named datasets.
Events
One row per Vivid Seats production.
Ticket Listings
One row per current ticket listing.
This design makes CSV exports and database imports easier than a mixed dataset with a recordType discriminator.
Both datasets can be joined with productionId.
Event data fields
| Field | Meaning |
|---|---|
productionId | Stable Vivid Seats event/production ID |
name | Event name |
localDate | Event date in venue time zone |
utcDate | Event date in UTC |
category | Main event category |
subcategory | More specific category |
venue | Venue identity, location, coordinates, time zone, and capacity |
minPrice | Lowest current base price |
maxPrice | Highest current base price |
averagePrice | Average current base price |
medianPrice | Median current base price |
minAllInPrice | Lowest all-in price when supplied |
maxAllInPrice | Highest all-in price when supplied |
listingCount | Number of active listings |
ticketCount | Total ticket inventory |
lastPricingRefresh | Source pricing-refresh timestamp |
performers | Performer IDs and names |
sourceUrl | Canonical Vivid Seats event URL |
scrapedAt | Snapshot timestamp |
Ticket listing data fields
| Field | Meaning |
|---|---|
productionId | Parent event ID |
productionName | Parent event name |
listingId | Stable listing identifier |
section | Venue section |
row | Seat row when disclosed |
quantity | Available ticket quantity |
pricePerTicket | Base price per ticket |
allInPricePerTicket | All-in price returned by Vivid Seats |
localizedPrice | Localized price when supplied |
dealScore | Vivid Seats deal score |
deliveryMethod | Delivery type |
notes | Listing or entry notes |
badges | Price or quality badges |
perks | Listing perks, such as seated together |
instantDelivery | Whether instant delivery is indicated |
sourceUrl | Parent event URL |
scrapedAt | Snapshot timestamp |
Example output
{"productionId": 7216792,"productionName": "Big 12 Mens Basketball Tournament - All Sessions","listingId": "VB16083850183","section": "Upper Level 201","row": "16","quantity": 2,"allInPricePerTicket": 417.48,"dealScore": 8.7,"perks": ["Seated Together"],"instantDelivery": false,"sourceUrl": "https://www.vividseats.com/.../production/7216792","scrapedAt": "2026-07-21T03:13:46.771Z"}
Inventory and prices change continuously. Example values are illustrative snapshots, not availability guarantees.
How much does it cost to scrape Vivid Seats tickets?
The Actor uses pay-per-event pricing:
- A small one-time Actor start fee covers browser session startup.
- Each event or ticket-listing record saved is one charged item.
- Apify subscription tiers receive decreasing per-record prices.
Your final cost depends on the number of events and listings returned.
Use event-only mode when you need discovery without listing details.
Use maxListingsPerEvent to put a clear ceiling on listing output.
The Apify Console displays the current prices before each run.
Recurring ticket price monitoring
For a stable monitoring workflow:
- Save the production IDs you care about.
- Run the Actor on a schedule.
- Enable listings and choose a representative listing limit.
- Export both datasets to your warehouse.
- Add
scrapedAtto your time-series key. - Compare price, inventory, and listing-level changes between snapshots.
Refreshing production IDs is recommended because completed events and expired inventory stop returning records.
Tips for reliable runs
- Start with one performer or production ID.
- Prefer direct production IDs for repeated inventory monitoring.
- Keep browser concurrency conservative by using one Actor run per target batch.
- Use an Apify residential proxy if your current network receives a Vivid Seats challenge.
- Avoid very large listing caps until you confirm normal inventory depth.
- Schedule snapshots at a cadence appropriate for the event, not every minute by default.
Proxy and anti-bot behavior
Vivid Seats uses an Akamai JavaScript challenge.
The Actor launches Chromium, blocks heavy static resources, clears the anonymous challenge, and reuses that browser session for public Hermes JSON calls.
A proxy is optional when anonymous access works from the Actor's network.
If a challenge remains uncleared, configure Apify Proxy with a residential group and retry using a fresh run.
The Actor fails instead of returning an empty success when total extraction fails.
Apify API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/vivid-seats-events-tickets-scraper').call({productionIds: ['7216792'],includeListings: true,maxEvents: 1,maxListingsPerEvent: 50,currency: 'USD'});console.log(run.status, run.id);
Apify API with Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/vivid-seats-events-tickets-scraper').call(run_input={'productionIds': ['7216792'],'includeListings': True,'maxEvents': 1,'maxListingsPerEvent': 50,'currency': 'USD',})print(run['status'], run['id'])
Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~vivid-seats-events-tickets-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"productionIds": ["7216792"],"includeListings": true,"maxEvents": 1,"maxListingsPerEvent": 50,"currency": "USD"}'
MCP integration
Connect the Actor to AI assistants through Apify MCP.
Claude Code setup
$claude mcp add --transport http apify "https://mcp.apify.com/?tools=automation-lab/vivid-seats-events-tickets-scraper"
Claude Desktop setup
Add the server to Claude Desktop's MCP configuration.
Cursor setup
Use the same HTTP server URL in Cursor's MCP settings.
VS Code setup
Add the server to your VS Code MCP configuration or compatible extension.
Claude Desktop, Cursor, and VS Code can use this configuration shape:
{"mcpServers": {"apify-vivid-seats": {"url": "https://mcp.apify.com/?tools=automation-lab/vivid-seats-events-tickets-scraper"}}}
Example prompts:
- βExtract the next 10 events for this Vivid Seats performer URL.β
- βSnapshot up to 100 ticket listings for production 7216792.β
- βCompare sections and all-in prices from today's listing dataset.β
Use MCP outputs as current marketplace observations, not promises of future ticket availability.
Integrations
Google Sheets
Send scheduled event and listing snapshots to separate worksheets and join on productionId.
Slack
Trigger an alert when minimum price drops below a threshold or ticket count changes sharply.
Webhooks
Notify an internal pricing service after each scheduled run completes.
Data warehouses
Load named datasets into BigQuery, Snowflake, PostgreSQL, or a lakehouse for historical analysis.
Make and Zapier
Use a completed Actor run as the trigger for inventory reports, alerts, or CRM enrichment.
Data quality notes
- Prices are numeric values in the requested currency when the source supplies conversion.
- Vivid Seats may not expose every optional field for every listing.
- Row and delivery details depend on seller disclosure.
- Event counts and inventory can change between requests.
- Completed, hidden, or unavailable productions may return no active listings.
- The source can refresh prices after the Actor's snapshot.
Legal and responsible use
This Actor extracts publicly accessible marketplace data without logging in.
You are responsible for using the data in compliance with applicable laws, Vivid Seats terms, and your contracts.
Do not use the Actor to overload the website, evade access controls, resell restricted personal data, or misrepresent ticket availability.
Keep schedules and limits proportionate to a legitimate business need.
Troubleshooting
Why did the run report an uncleared challenge?
Enable an Apify residential proxy configuration and run again. Network reputation and geography can affect challenge behavior.
Why are there no listings for a production ID?
The production may be completed, hidden, sold out, or have expired inventory. Refresh the ID from a current event page.
Why is a localized price missing?
Vivid Seats does not return localized values for every currency, country, or listing. Base and all-in fields remain available when supplied.
Why did the run fail instead of returning an empty dataset?
The Actor deliberately fails closed when no event data can be extracted. This prevents scheduled monitors from treating a challenge page as a valid zero-inventory snapshot.
FAQ
Does this require a Vivid Seats account?
No. The Actor uses the public anonymous website surfaces.
Can it scrape concerts, sports, and theater?
Yes, when those events are listed on public Vivid Seats performer, search, category, or production pages.
Can I scrape only events?
Yes. Set includeListings to false.
Can I monitor several events together?
Yes. Supply multiple production IDs and choose maxEvents large enough for the batch.
Does the Actor buy tickets?
No. It extracts public event and listing data only.
Are prices guaranteed at checkout?
No. Resale inventory and fees can change. Treat each output as a timestamped snapshot.
Related scrapers
Explore other data tools from automation-lab for marketplace monitoring, event discovery, and structured web extraction.
Use this Actor specifically when the source of truth must be Vivid Seats event and live listing data.
Support
If an input fails, include:
- the Vivid Seats URL or production ID
- whether listings were enabled
- selected currency and limits
- run ID and error message
- whether a proxy was configured
Do not include account credentials or private payment information.