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

Name

Format

Description

event_id

E-<digits>

Viagogo event identifier, including the E- prefix.

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

Field

Type

Description

viagogo_event_id

int

Numeric portion of the event id.

viagogo_event_url

string | null

Marketplace URL.

event_name

string | null

Event title.

event_date

datetime | null

Event start, RFC3339, UTC.

event_image

string | null

Cover image URL.

category_name

string | null

Marketplace category.

currency

string

Dominant sale currency (ISO-4217). Falls back to "USD" when no sales data exists yet.

venue

object | null

Venue block, present when the event has a venue on file.

artist

object | null

Artist block, present when the event has an artist on file.

external_urls

object

Cross-marketplace identifiers (Ticketmaster, VividSeats). Fields are null when not on file.

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.

Field

Type

Description

is_general_admission_only

bool | null

true for standing-only events.

stats_date

datetime | null

When the snapshot was taken.

tickets_sold

int | null

Cumulative tickets sold.

tickets_sold_24h

int | null

Tickets sold in the last 24h (clamped to β‰₯ 0).

tickets_sold_24h_percentage

decimal | null

24h change (clamped to β‰₯ 0).

listings_sold

int | null

Cumulative listings sold.

listings_sold_24h

int | null

Listings sold in the last 24h.

listings_sold_24h_percentage

decimal | null

24h change for listings sold.

listings_available

int | null

Active listings on the marketplace.

listings_available_24h

int | null

Change in active listings over the last 24h.

listings_available_24h_percentage

decimal | null

24h change for listings available.

available_tickets

int | null

Tickets currently available.

available_tickets_24h

int | null

Change in available tickets over the last 24h.

available_tickets_24h_percentage

decimal | null

24h change for available tickets.

average_ticket_price_sold

decimal | null

Average sold price.

average_ticket_price_sold_24h

decimal | null

24h delta in average sold price.

average_ticket_price_sold_24h_percentage

decimal | null

24h change in average sold price.

average_ticket_price_available

decimal | null

Average ask price.

average_ticket_price_available_24h

decimal | null

24h delta in average ask price.

average_ticket_price_available_24h_percentage

decimal | null

24h change in average ask price.

highest_sale_price

decimal | null

Highest sale price observed.

highest_sale_price_24h

decimal | null

24h delta in highest sale price.

highest_sale_price_24h_percentage

decimal | null

24h change in highest sale price.

get_in_price

decimal | null

Cheapest available ticket (get-in price).

get_in_price_24h

decimal | null

24h delta in get-in price.

get_in_price_24h_percentage

decimal | null

24h change in get-in price.

total_volume

decimal | null

Total sales volume in currency.

currency

string

ISO-4217 code, matches event.currency.

daily_statistics[] fields

One entry per day in the rolling window, ordered chronologically. All numeric fields may be null. Decimal fields are JSON strings.

Field

Type

Description

stat_date

date

Calendar day the statistic covers.

tickets_sold

int | null

Cumulative tickets sold.

tickets_sold_24h

int | null

Tickets sold in the last 24h.

available_tickets

int | null

Tickets currently available.

listings_available

int | null

Active listings.

average_ticket_price_sold

decimal | null

Average sold price for the day.

average_ticket_price_available

decimal | null

Average ask price for the day.

highest_sale_price

decimal | null

Highest sale price for the day.

price_histogram fields

Field

Type

Description

bins

int

Number of buckets in the histogram.

min

decimal

Lowest sale price observed.

max

decimal

Highest sale price observed.

currency

string

Currency the histogram is denominated in.

data[].start

decimal

Inclusive lower bound of the bucket.

data[].end

decimal

Upper bound of the bucket.

data[].tickets_sold

int

Total tickets sold within the bucket.

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

Name

Format

Description

event_id

E-<digits>

Viagogo event identifier, including the E- prefix.

Query parameters

Name

Type

Required

Description

section

string

no

Filter to a specific section label

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

Field

Type

Description

listing_id

string | int | null

Marketplace listing identifier.

section

string | null

Section label as listed.

row

string | null

Row label as listed.

seat

string | null

Seat label as listed.

sold_tickets

int

Number of tickets in this sale.

raw_price

decimal | null

Per-ticket price.

created_datetime

datetime | null

When the sale was recorded.

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

Name

Format

Description

tm_event_id

string

Ticketmaster event identifier as it appears on the marketplace.

Query parameters

Name

Type

Default

Range

Description

limit

int

100

1..1000

Max history points to include in

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

Name

Type

Required

Default

Range

Description

url

string

yes

β€”

β€”

Exact artist URL on record. Whitespace is trimmed.

snapshots_limit

int

no

30

1..200

Max number of items in snapshots_history.

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 in snapshots_history are passed through from the upstream Edge Functions. Internal database identifiers (artist_id, snapshot_id) are stripped before the response is returned.

  • social_metrics is null when the artist exists but has no social profile on file. In that case latest_snapshot is also null and snapshots_history is an empty array.

  • latest_snapshot.platforms reflects canonical timeseries values when available; demographics, scores, and releases are free-form JSON objects (or null) and may evolve without notice. Treat them as opaque.

  • snapshots_history[].platforms is 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)

Field

Type

Default

Range

Description

query

string

""

≀ 200

Free-text query.

page

int

1

1..1000

1-based page index.

hitsPerPage

int

24

1..100

Results per page.

sortBy

string

"recommended"

enum

One of the values listed below.

filterExpression

string

""

≀ 6000

Filter DSL expression forwarded to the search backend.

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:

Attribute

Type

Notes

event_id

int

Internal event id (same value as in hits[].event_id).

event_name

string

Full event title. Quote values with spaces.

event_date

int

Unix timestamp (seconds). Use comparison operators for date windows.

category_name

string

Marketplace category (e.g. "Concerts", "Sports").

artist_id

int

Internal artist id.

artist_name

string

Quote values with spaces.

venue_id

int

Internal venue id.

venue_name

string

Quote values with spaces.

venue_city

string

venue_country

string

Full country name (e.g. "United States").

venue_country_code

string

ISO-3166 alpha-2 (e.g. US, GB, IT).

tickets_sold

int

Comparison operators supported.

tickets_sold_24h

int

Comparison operators supported.

available_tickets

int

Comparison operators supported.

capacity

int

Comparison operators supported.

average_ticket_price_sold

number

Comparison operators supported.

Notes and limits:

  • Whole expressions are capped at 6000 characters; longer requests fail validation with 400 INVALID_REQUEST before 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.

Field

Type

Required

Description

event_url

string

viagogo

Full http(s) URL of the viagogo event page

viagogo_event_id

string

viagogo

Numeric viagogo event id

ticketmaster_event_url

string

Ticketmaster

Full http(s) URL of the Ticketmaster event page

ticketmaster_event_id

string

Ticketmaster

Ticketmaster event id

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

StatusCodeWhen

400

INVALID_REQUEST

Request validation failed (missing/wrong-type body or query fields).

404

EVENT_NOT_FOUND

No event matches the supplied identifier.

>500

INTERNAL_ERROR

Unhandled server error. Safe to retry once with backoff.