Market Data API
Documentation for Market Data Eventory API.
Written By yeet
Last updated 12 days ago
This is a read-only API for ticketing market data. By providing an event id or an artist URL, you get the current state of an event alongside a rolling window of time-series data, plus a search endpoint over the Eventory event catalog.
1. Overview
The Data API provides six endpoints for fetching historical and aggregated event data from marketplaces like Viagogo and Ticketmaster, artist-level social metrics, and full-text search across the catalog.
Need real-time? This API is for polling. If you need push notifications for a watchlist, check out the Eventory Stream API. The two services operate independently.
2. Base URL
https://api.eventory.ai/eventory/data
3. Authentication
Include your API key in the apikey header on every request:
apikey: YOUR_API_KEY
4. GET /ping
Liveness probe.
https://api.eventory.ai/eventory/data/ping
Response:
{ "status": "ok" }
5. GET /viagogo/{event_id}
Returns Viagogo event metadata, the latest aggregate summary, a daily statistics history, and a price distribution histogram.
Path parameter
Example
https://api.eventory.ai/eventory/data/viagogo/E-160973997
Response
{
"event": {
"viagogo_event_id": 160973997,
"viagogo_event_url": "https://www.viagogo.com/...",
"event_name": "Artist World Tour",
"event_date": "2026-06-15T20:00:00Z",
"event_image": "https://...",
"category_name": "Concerts",
"currency": "USD",
"venue": {
"name": "Madison Square Garden",
"city": "New York",
"country": "United States",
"country_code": "US",
"svg_map_url": "https://..."
},
"artist": {
"name": "Artist",
"url": "https://www.viagogo.com/artist/...",
"image_url": "https://..."
},
"external_urls": {
"ticketmaster_event_id": "G5vYZ9abc",
"ticketmaster_event_url": "https://www.ticketmaster.com/event/...",
"vividseats_event_id": "1234567",
"vividseats_event_url": "https://www.vividseats.com/..."
}
},
"summary": { "...": "see below" },
"daily_statistics": [ { "...": "see below" } ],
"price_histogram": {
"bins": 10,
"min": "0",
"max": "500",
"currency": "USD",
"data": [
{ "start": "0", "end": "50", "tickets_sold": 12 }
]
}
}
event fields
summary fields
The latest aggregate snapshot for the event. All numeric fields can be null when no stats row exists yet. Decimal fields are JSON strings.
daily_statistics[] fields
One entry per day in the rolling window, ordered chronologically. All numeric fields may be null. Decimal fields are JSON strings.
price_histogram fields
When no sales have been observed, min and max are "0" and data is an empty array.
6. GET /sales/viagogo/{event_id}
Returns the most recent individual Viagogo sales for an event, newest first. Up to 50 sales per call.
Path change. This endpoint was previously
GET /viagogo/sales/{event_id}. The new path is/sales/viagogo/{event_id}.
Path parameter
Query parameters
Example
curl -H "apikey: $KEY" \
"https://api.eventory.ai/eventory/data/sales/viagogo/E-160973997?section=Floor"
Response
{
"sales": [
{
"listing_id": "9876543",
"section": "Floor",
"row": "C",
"seat": "12",
"sold_tickets": 2,
"raw_price": "210.00",
"created_datetime": "2026-04-27T18:32:11Z"
}
]
}
sales[] fields
7. GET /ticketmaster/{tm_event_id}
Returns Ticketmaster event data, the latest aggregate stats, and the dashboard v2 chart payload. All three sub-blocks are fetched in parallel.
Path parameter
Query parameters
Example
https://api.eventory.ai/eventory/data/ticketmaster/G5vYZ9xA12345?limit=100
Response shape
{
"ticketmaster_event": {
"scrapeRuns": [ { "id": "run-id", "event_id": "tm-event-id", "region": "US", "created_date_time": "..." } ],
"sectionStats": [ { "id": 1, "section_name": "101", "capacity": "250", "available_stock": "33", "sold_amount": "217", "created_date_time": "..." } ],
"offerStats": [ { "id": 1, "offer_name": "Standard", "offer_stock": 120, "average_price_fees": 110, "average_price_no_fees": 95, "offer_type": 0, "currency": "USD", "created_date_time": "..." } ],
"statisticsHistory":[ { "id": 1, "tickets_sold": 200, "tickets_sold_24h": 15, "available_tickets": 320, "created_date_time": "...", "highest_price": "180", "lowest_price": "45", "average_ticket_price_available": "97", "average_ticket_price_standard": "88", "average_ticket_price_resell": "120", "average_ticket_price_platinum": "150", "capacity": 520, "currency": "USD" } ]
},
"latest_stats": { "tickets_sold": 1000, "available_tickets": 550 },
"dashboard_v2": {
"currency": "USD",
"current_values": {
"total_tickets_sold": 1000,
"tickets_sold_last_24h": 40,
"tickets_sold_last_24h_percentage": 4.1,
"available_tickets": 550,
"available_tickets_delta_percentage": -1.3,
"listing_available": 120,
"average_sales_price": "0",
"average_listing_price": "105",
"get_in_price": "48"
},
"charts": {
"timestamps": ["2026-04-26", "2026-04-27"],
"total_tickets_sold": [960, 1000],
"tickets_sold_last_24h": [32, 40],
"available_tickets": [610, 550],
"listing_available": [150, 120],
"average_listing_price": ["99", "105"],
"get_in_price": ["44", "48"]
}
}
}
ticketmaster_event, latest_stats, and dashboard_v2 are returned as-is from the upstream Edge Functions. Treat the inner shapes as stable but additive β new keys can appear without notice.
8. GET /artist
Resolves an artist by exact marketplace URL and returns social metrics, the latest snapshot, and a rolling window of platform snapshots.
Query parameters
The match on url is exact β whitespace is trimmed but the URL is not otherwise normalised. If the artist exists under a different canonical URL, this call returns 404 ARTIST_NOT_FOUND.
Example
https://api.eventory.ai/eventory/data/artist?url=https%3A%2F%2Fwww.viagogo.com%2FConcert-Tickets%2FR-B%2FContemporary-R-B%2FTeddy-Swims-Tickets
Response
{
"artist": {
"artist_url": "https://www.viagogo.com/...",
"artist_name": "Artist",
"artist_image_url": "https://..."
},
"social_metrics": {
"country_code": "US",
"biography": "...",
"genre": "pop",
"subgenres": "synth-pop, electropop",
"career_stage": "mainstream",
"origin_city": "Los Angeles"
},
"latest_snapshot": {
"snapshot_date": "2026-04-27",
"platforms": { "spotify": { "followers": 12345678 } },
"demographics": { },
"scores": { },
"releases": { }
},
"snapshots_history": [
{
"snapshot_date": "2026-04-27",
"platforms": { "spotify": { "followers": 12345678 } }
}
]
}
Field notes
social_metrics,latest_snapshot, and each entry insnapshots_historyare passed through from the upstream Edge Functions. Internal database identifiers (artist_id,snapshot_id) are stripped before the response is returned.social_metricsisnullwhen the artist exists but has no social profile on file. In that caselatest_snapshotis alsonullandsnapshots_historyis an empty array.latest_snapshot.platformsreflects canonical timeseries values when available;demographics,scores, andreleasesare free-form JSON objects (ornull) and may evolve without notice. Treat them as opaque.snapshots_history[].platformsis keyed by platform ("spotify","youtube", etc.), each mapping to a metric-name β value object.
9. POST /search
Full-text search across the Eventory event catalog, with optional filters and sort orders.
Request body (JSON)
Allowed sortBy values
recommended
event_date event_date.desc
event_name event_name.desc
average_ticket_price_sold average_ticket_price_sold.desc
tickets_sold tickets_sold.desc
tickets_sold_24h tickets_sold_24h.desc
available_tickets available_tickets.desc
capacity capacity.desc
Using filterExpression
filterExpression is a string sent verbatim to the upstream search backend. It uses the standard search-filter DSL: each clause is an attribute:value pair, with quotes around values that contain spaces. Clauses are combined with AND, OR, and NOT, and grouped with parentheses. Numeric attributes also support comparison operators (=, !=, <, <=, >, >=) and the closed range form attribute:lower TO upper.
The simplest case is the one in the example above:
venue_country_code:US
Combined clauses:
venue_country_code:US AND tickets_sold > 1000
(venue_country_code:US OR venue_country_code:CA) AND event_date >= 1767225600
NOT category_name:"Sports"
average_ticket_price_sold: 50 TO 200
The attributes you can filter on match the fields indexed for search. The reliably supported ones today are:
Notes and limits:
Whole expressions are capped at 6000 characters; longer requests fail validation with
400 INVALID_REQUESTbefore any backend call is made.Unknown attributes are silently ignored by the backend (they return no filter effect rather than an error), so always test new filters against a known-non-empty query first.
The example response shape under
hits[]mirrors the searchable index, so any field you see on a hit can typically be used as a filter attribute.
Example
curl -X POST -H "apikey: $KEY" -H "Content-Type: application/json" \
-d '{
"query": "drake",
"page": 1,
"hitsPerPage": 24,
"sortBy": "tickets_sold.desc",
"filterExpression": "venue_country_code:US"
}' \
"https://api.eventory.ai/eventory/data/search"
Response
{
"hits": [
{
"objectID": "evt-1",
"event_id": 12345,
"event_name": "Drake β World Tour",
"venue_name": "O2 Arena",
"tickets_sold": 8000
}
],
"page": 1,
"hitsPerPage": 24,
"nbHits": 1,
"nbPages": 1,
"processingTimeMS": 7
}
The hits[] shape is determined by the upstream search index and may include additional fields beyond the example above.
10. POST /events/add
Registers a new event so it starts being tracked. Provide the event from one supported source β either viagogo or Ticketmaster.
Send a JSON object with exactly one source β a complete viagogo pair or a complete Ticketmaster pair. Don't mix the two, and don't omit both.
Provide either the viagogo fields or the Ticketmaster fields β not both.
Each source requires both of its fields together.
viagogo_event_id must contain digits only.
URLs must start with http:// or https://.
Examples
curl -X POST https://api.example.com/events/add \
-H "Content-Type: application/json" \
-d '{
"event_url": "https://www.viagogo.com/.../E-12345678",
"viagogo_event_id": "12345678"
}' curl -X POST https://api.example.com/events/add \
-H "Content-Type: application/json" \
-d '{
"ticketmaster_event_url": "https://www.ticketmaster.com/event/abc",
"ticketmaster_event_id": "abc",
}'11. Error Reference
All error responses use a uniform envelope:
{ "status": "error", "code": "EVENT_NOT_FOUND", "message": "..." }