Docs

API reference

Base URL https://www.venuery.com/v1. JSON in, JSON out. This page and the OpenAPI 3.1 file are made from the code that validates requests, so they always match.

Keys

Every request needs a key: secret keys (sk_…) on your server, publishable keys (pk_…) in browsers, for the seat map. Test keys act on separate test data.

The key you're using

GET/v1/mePublishable keys too

Which organization, workspace (live or test) and venues the key acts on.

Request
curl https://www.venuery.com/v1/me \
  -u pk_test_…:
Response · 200
{
  "object": "api_key",
  "id": "key_8f3k2m9q1x7c4b0d",
  "kind": "secret",
  "livemode": true,
  "organization": {
    "id": "org_1",
    "name": "Cape Fear Ghost Crabs"
  },
  "workspace": {
    "id": "wsp_1",
    "mode": "live"
  },
  "venues": "all"
}

Venues

A venue holds charts and events. Keys can be limited to some venues.

List venues

GET/v1/venues
Query parameterTypeDescription
limitinteger1–100 (default 25)
cursorstringnext_cursor from the previous page
Request
curl https://www.venuery.com/v1/venues \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "ven_8f3k2m9q1x7c4b0d",
      "object": "venue",
      "name": "Brooks Field",
      "slug": "brooks-field",
      "address": "601 S College Rd, Wilmington NC",
      "timezone": "America/New_York",
      "livemode": true,
      "created_at": "2026-10-14T12:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create a venue

POST/v1/venues
Body fieldTypeDescription
namerequiredstringA name people will see. up to 120 characters
addressstring | nullStreet address. up to 300 characters
timezonestringIANA time zone, like America/New_York (default: the organization's).
Request
curl https://www.venuery.com/v1/venues \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"name":"Brooks Field","address":"601 S College Rd, Wilmington NC","timezone":"America/New_York"}'
Response · 201
{
  "id": "ven_8f3k2m9q1x7c4b0d",
  "object": "venue",
  "name": "Brooks Field",
  "slug": "brooks-field",
  "address": "601 S College Rd, Wilmington NC",
  "timezone": "America/New_York",
  "livemode": true,
  "created_at": "2026-10-14T12:00:00.000Z"
}

Get a venue

GET/v1/venues/{id}
Request
curl https://www.venuery.com/v1/venues/ven_8f3k2m9q1x7c4b0d \
  -u sk_test_…:
Response · 200
{
  "id": "ven_8f3k2m9q1x7c4b0d",
  "object": "venue",
  "name": "Brooks Field",
  "slug": "brooks-field",
  "address": "601 S College Rd, Wilmington NC",
  "timezone": "America/New_York",
  "livemode": true,
  "created_at": "2026-10-14T12:00:00.000Z"
}

Update a venue

PATCH/v1/venues/{id}
Body fieldTypeDescription
namestringA name people will see. up to 120 characters
addressstring | nullStreet address. up to 300 characters
timezonestringIANA time zone, like America/New_York (default: the organization's).
Request
curl https://www.venuery.com/v1/venues/ven_8f3k2m9q1x7c4b0d \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"address":"601 S College Rd, Wilmington NC 28403"}'
Response · 200
{
  "id": "ven_8f3k2m9q1x7c4b0d",
  "object": "venue",
  "name": "Brooks Field",
  "slug": "brooks-field",
  "address": "601 S College Rd, Wilmington NC",
  "timezone": "America/New_York",
  "livemode": true,
  "created_at": "2026-10-14T12:00:00.000Z"
}

Charts

A chart is a venue's seating layout. Edit the draft (in the designer, or here), then publish: events pin a published version, so later edits never move a seat someone bought.

List charts

GET/v1/charts
Query parameterTypeDescription
venuestringOnly this venue's charts
limitinteger1–100 (default 25)
cursorstringnext_cursor from the previous page
Request
curl https://www.venuery.com/v1/charts \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "cht_4k9q2m8f1x7c3b0d",
      "object": "chart",
      "venue": "ven_8f3k2m9q1x7c4b0d",
      "name": "Baseball",
      "latest_version": 3,
      "draft_revision": 41,
      "created_at": "2026-10-14T12:00:00.000Z",
      "updated_at": "2026-10-14T13:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create a chart

POST/v1/charts

Empty, or from a document: a venuery chart document or a seats.io drawing, converted on the way in. Then publish it to use it for events.

Body fieldTypeDescription
venuerequiredstringA venue's id.
namerequiredstringA name people will see. up to 120 characters
documentanyA venuery chart document, or a seats.io drawing (converted on the way in).
Request
curl https://www.venuery.com/v1/charts \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"venue":"ven_8f3k2m9q1x7c4b0d","name":"Baseball","document":{"…":"a seats.io drawing or venuery document"}}'
Response · 201
{
  "id": "cht_4k9q2m8f1x7c3b0d",
  "object": "chart",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "name": "Baseball",
  "latest_version": null,
  "draft_revision": 0,
  "created_at": "2026-10-14T12:00:00.000Z",
  "updated_at": "2026-10-14T13:00:00.000Z"
}

Get a chart

GET/v1/charts/{id}
Query parameterTypeDescription
expandstringdraft to include the draft document
Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d \
  -u sk_test_…:
Response · 200
{
  "id": "cht_4k9q2m8f1x7c3b0d",
  "object": "chart",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "name": "Baseball",
  "latest_version": 3,
  "draft_revision": 41,
  "created_at": "2026-10-14T12:00:00.000Z",
  "updated_at": "2026-10-14T13:00:00.000Z"
}

Replace the draft

PUT/v1/charts/{id}/draft

Pass the revision you started from to be refused (409) if someone saved in between.

Body fieldTypeDescription
documentrequiredanyA venuery chart document, or a seats.io drawing (converted on the way in).
revisionintegerThe draft_revision you started from: refused (409) if the draft changed since.
Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/draft \
  -u sk_test_…: \
  -X PUT \
  -H "Content-Type: application/json" \
  -d '{"document":{"format":"venuery.chart-doc/v2","…":"…"},"revision":41}'
Response · 200
{
  "id": "cht_4k9q2m8f1x7c3b0d",
  "object": "chart",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "name": "Baseball",
  "latest_version": 3,
  "draft_revision": 42,
  "created_at": "2026-10-14T12:00:00.000Z",
  "updated_at": "2026-10-14T13:00:00.000Z"
}

Check the draft

POST/v1/charts/{id}/draft/validate

Runs the checks publishing runs, with your organization's settings (Settings → Chart checks).

Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/draft/validate \
  -u sk_test_…: \
  -X POST
Response · 200
{
  "object": "chart_validation",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "ok": true,
  "errors": [],
  "warnings": [
    {
      "rule": "noFocalPoint",
      "message": "No focal point: best available can't rank seats.",
      "object_ids": []
    }
  ],
  "stats": {
    "seats": 980,
    "places": 2480,
    "capacity_by_category": {
      "club": 171,
      "reserved": 769,
      "lawn": 1500,
      "tables": 40
    }
  }
}

Publish the draft

POST/v1/charts/{id}/publish

Compiles the draft into a new version that events can pin. Versions never change. 422 with the errors when the draft can't be published.

Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/publish \
  -u sk_test_…: \
  -X POST
Response · 201
{
  "id": "chv_2m8f4k9q1x7c3b0d",
  "object": "chart_version",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "version": 3,
  "capacity": 2480,
  "compiler": "compile@1",
  "diff": {
    "added": 12,
    "removed": 0,
    "relabeled": 4,
    "recategorized": 0,
    "safe_for_auto_upgrade": true
  },
  "published_at": "2026-10-14T13:00:00.000Z",
  "warnings": []
}

List versions

GET/v1/charts/{id}/versions
Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/versions \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "chv_2m8f4k9q1x7c3b0d",
      "object": "chart_version",
      "chart": "cht_4k9q2m8f1x7c3b0d",
      "version": 3,
      "capacity": 2480,
      "compiler": "compile@1",
      "diff": {
        "added": 12,
        "removed": 0,
        "relabeled": 4,
        "recategorized": 0,
        "safe_for_auto_upgrade": true
      },
      "published_at": "2026-10-14T13:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Get a version

GET/v1/charts/{id}/versions/{n}
Query parameterTypeDescription
expandstringlayout, document and/or labels (label → id for every seat, table, booth and GA area), comma-separated
Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/versions/3 \
  -u sk_test_…:
Response · 200
{
  "id": "chv_2m8f4k9q1x7c3b0d",
  "object": "chart_version",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "version": 3,
  "capacity": 2480,
  "compiler": "compile@1",
  "diff": {
    "added": 12,
    "removed": 0,
    "relabeled": 4,
    "recategorized": 0,
    "safe_for_auto_upgrade": true
  },
  "published_at": "2026-10-14T13:00:00.000Z"
}

Copy a chart

POST/v1/charts/{id}/copy

A new chart with this one's draft.

Body fieldTypeDescription
namestringThe copy's name (default: “… (copy)”). up to 120 characters
Request
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/copy \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"name":"Baseball – playoffs"}'
Response · 201
{
  "id": "cht_7c3b0d4k9q2m8f1x",
  "object": "chart",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "name": "Baseball – playoffs",
  "latest_version": null,
  "draft_revision": 0,
  "created_at": "2026-10-14T12:00:00.000Z",
  "updated_at": "2026-10-14T13:00:00.000Z"
}

Events

An event is one date on a chart version, with its own inventory: every seat, table and GA place, and its status.

List events

GET/v1/events
Query parameterTypeDescription
venuestringVenue id
seasonstringSeason id
statusstringdraft, on_sale or cancelled
starts_afterstringISO 8601 date-time
starts_beforestringISO 8601 date-time
limitinteger1–100 (default 25)
cursorstringnext_cursor from the previous page
Request
curl https://www.venuery.com/v1/events \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "evt_9q1x7c4b0d8f3k2m",
      "object": "event",
      "key": "2027-05-28-opening-night",
      "kind": "inventory",
      "venue": "ven_8f3k2m9q1x7c4b0d",
      "chart_version": "chv_2m8f4k9q1x7c3b0d",
      "season": null,
      "name": "Opening Night",
      "subtitle": "vs. the Sharks",
      "starts_at": "2027-05-28T23:05:00.000Z",
      "status": "on_sale",
      "max_tickets_per_order": 10,
      "livemode": true,
      "created_at": "2026-10-14T13:05:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create an event

POST/v1/events

Pins a published chart version and makes the event's inventory: every seat, table and GA place, available. Give it your own key to find it by later.

Body fieldTypeDescription
chartrequiredstringA chart's id.
versionintegerThe published version to pin (default: the latest). positive
keystringYour own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$
namerequiredstringA name people will see. up to 200 characters
subtitlestring | nullA second line, like the opponent. up to 200 characters
starts_atrequireddate-timeWhen it starts, ISO 8601 with an offset (2027-05-28T19:05:00-04:00).
kind"inventory" | "ticketed"inventory: you sell, and book seats through this API. ticketed: venuery's checkout sells them at prices. default "inventory"
status"draft" | "on_sale"on_sale (default) or draft. default "on_sale"
pricesmap of integerTicketed events: price per chart category, in cents ({"reserved": 1500}).
max_tickets_per_orderintegerThe most places one order may take. 1–500
seasonstringA season (id or key) on the same chart. The event gets the season's booked seats.
Request
curl https://www.venuery.com/v1/events \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"chart":"cht_4k9q2m8f1x7c3b0d","key":"2027-05-28-opening-night","name":"Opening Night","subtitle":"vs. the Sharks","starts_at":"2027-05-28T19:05:00-04:00"}'
Response · 201
{
  "id": "evt_9q1x7c4b0d8f3k2m",
  "object": "event",
  "key": "2027-05-28-opening-night",
  "kind": "inventory",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "season": null,
  "name": "Opening Night",
  "subtitle": "vs. the Sharks",
  "starts_at": "2027-05-28T23:05:00.000Z",
  "status": "on_sale",
  "max_tickets_per_order": 10,
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Create up to 100 events

POST/v1/events/bulk

All of them, or none.

Body fieldTypeDescription
eventsrequiredobject[]Events, each as for Create an event. 1–100 items
events[].chartrequiredstringA chart's id.
events[].versionintegerThe published version to pin (default: the latest). positive
events[].keystringYour own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$
events[].namerequiredstringA name people will see. up to 200 characters
events[].subtitlestring | nullA second line, like the opponent. up to 200 characters
events[].starts_atrequireddate-timeWhen it starts, ISO 8601 with an offset (2027-05-28T19:05:00-04:00).
events[].kind"inventory" | "ticketed"inventory: you sell, and book seats through this API. ticketed: venuery's checkout sells them at prices. default "inventory"
events[].status"draft" | "on_sale"on_sale (default) or draft. default "on_sale"
events[].pricesmap of integerTicketed events: price per chart category, in cents ({"reserved": 1500}).
events[].max_tickets_per_orderintegerThe most places one order may take. 1–500
events[].seasonstringA season (id or key) on the same chart. The event gets the season's booked seats.
Request
curl https://www.venuery.com/v1/events/bulk \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"events":[{"chart":"cht_4k9q2m8f1x7c3b0d","key":"2027-05-29","name":"Game 2","starts_at":"2027-05-29T19:05:00-04:00"},{"chart":"cht_4k9q2m8f1x7c3b0d","key":"2027-05-30","name":"Game 3","starts_at":"2027-05-30T14:05:00-04:00"}]}'
Response · 201
{
  "object": "list",
  "data": [
    {
      "id": "evt_9q1x7c4b0d8f3k2m",
      "object": "event",
      "key": "2027-05-28-opening-night",
      "kind": "inventory",
      "venue": "ven_8f3k2m9q1x7c4b0d",
      "chart_version": "chv_2m8f4k9q1x7c3b0d",
      "season": null,
      "name": "Opening Night",
      "subtitle": "vs. the Sharks",
      "starts_at": "2027-05-28T23:05:00.000Z",
      "status": "on_sale",
      "max_tickets_per_order": 10,
      "livemode": true,
      "created_at": "2026-10-14T13:05:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Get an event

GET/v1/events/{id}

By id or by your key.

Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night \
  -u sk_test_…:
Response · 200
{
  "id": "evt_9q1x7c4b0d8f3k2m",
  "object": "event",
  "key": "2027-05-28-opening-night",
  "kind": "inventory",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "season": null,
  "name": "Opening Night",
  "subtitle": "vs. the Sharks",
  "starts_at": "2027-05-28T23:05:00.000Z",
  "status": "on_sale",
  "max_tickets_per_order": 10,
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Update an event

PATCH/v1/events/{id}
Body fieldTypeDescription
namestringA name people will see. up to 200 characters
subtitlestring | nullA second line, like the opponent. up to 200 characters
starts_atdate-timeWhen it starts, ISO 8601 with an offset (2027-05-28T19:05:00-04:00).
max_tickets_per_orderintegerThe most places one order may take. 1–500
seasonstring | nullMove it into a season (id or key), where it gets the season's booked seats, or null to take it out. Seats stay booked either way.
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"starts_at":"2027-05-28T18:35:00-04:00"}'
Response · 200
{
  "id": "evt_9q1x7c4b0d8f3k2m",
  "object": "event",
  "key": "2027-05-28-opening-night",
  "kind": "inventory",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "season": null,
  "name": "Opening Night",
  "subtitle": "vs. the Sharks",
  "starts_at": "2027-05-28T23:05:00.000Z",
  "status": "on_sale",
  "max_tickets_per_order": 10,
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

The event's chart

GET/v1/events/{id}/layoutPublishable keys too

The compiled chart version the event uses: sections, rows, seats with their labels and positions, tables, booths and GA areas. For drawing your own map.

Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/layout \
  -u pk_test_…:
Response · 200
{
  "object": "event_layout",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "layout": {
    "format": "venuery.layout/v2",
    "sections": [
      "…"
    ],
    "seats": [
      "…"
    ],
    "pools": [
      "…"
    ]
  }
}

Put an event on sale

POST/v1/events/{id}/on_sale
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/on_sale \
  -u sk_test_…: \
  -X POST
Response · 200
{
  "id": "evt_9q1x7c4b0d8f3k2m",
  "object": "event",
  "key": "2027-05-28-opening-night",
  "kind": "inventory",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "season": null,
  "name": "Opening Night",
  "subtitle": "vs. the Sharks",
  "starts_at": "2027-05-28T23:05:00.000Z",
  "status": "on_sale",
  "max_tickets_per_order": 10,
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Cancel an event

POST/v1/events/{id}/cancel

Releases every active hold. Booked seats stay booked, for your records.

Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/cancel \
  -u sk_test_…: \
  -X POST
Response · 200
{
  "id": "evt_9q1x7c4b0d8f3k2m",
  "object": "event",
  "key": "2027-05-28-opening-night",
  "kind": "inventory",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart_version": "chv_2m8f4k9q1x7c3b0d",
  "season": null,
  "name": "Opening Night",
  "subtitle": "vs. the Sharks",
  "starts_at": "2027-05-28T23:05:00.000Z",
  "status": "cancelled",
  "max_tickets_per_order": 10,
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Seasons

A season is a run of events on one chart. Seats booked for the season are booked at every upcoming event in it, and at events added later. To give up one game of a season seat, release it at that event; the season booking stays.

List seasons

GET/v1/seasons
Query parameterTypeDescription
venuestringOnly this venue's seasons
limitinteger1–100 (default 25)
cursorstringnext_cursor from the previous page
Request
curl https://www.venuery.com/v1/seasons \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "ssn_3k2m9q1x7c4b0d8f",
      "object": "season",
      "key": "2027",
      "name": "2027 Season",
      "venue": "ven_8f3k2m9q1x7c4b0d",
      "chart": "cht_4k9q2m8f1x7c3b0d",
      "events": [
        "evt_9q1x7c4b0d8f3k2m",
        "evt_0d8f3k2m9q1x7c4b"
      ],
      "livemode": true,
      "created_at": "2026-10-14T13:10:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create a season

POST/v1/seasons
Body fieldTypeDescription
chartrequiredstringA chart's id.
keystringYour own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$
namerequiredstringA name people will see. up to 80 characters
eventsstring[]Events (ids or keys) on the same chart to put in it. Add more later. up to 200 items
Request
curl https://www.venuery.com/v1/seasons \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"chart":"cht_4k9q2m8f1x7c3b0d","key":"2027","name":"2027 Season","events":["2027-05-28-opening-night","2027-05-29"]}'
Response · 201
{
  "id": "ssn_3k2m9q1x7c4b0d8f",
  "object": "season",
  "key": "2027",
  "name": "2027 Season",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ],
  "livemode": true,
  "created_at": "2026-10-14T13:10:00.000Z"
}

Get a season

GET/v1/seasons/{id}

By id or by your key.

Request
curl https://www.venuery.com/v1/seasons/2027 \
  -u sk_test_…:
Response · 200
{
  "id": "ssn_3k2m9q1x7c4b0d8f",
  "object": "season",
  "key": "2027",
  "name": "2027 Season",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ],
  "livemode": true,
  "created_at": "2026-10-14T13:10:00.000Z"
}

Update a season

PATCH/v1/seasons/{id}
Body fieldTypeDescription
namestringA name people will see. up to 80 characters
keystring | nullYour own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$
Request
curl https://www.venuery.com/v1/seasons/2027 \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"name":"2027 Regular Season"}'
Response · 200
{
  "id": "ssn_3k2m9q1x7c4b0d8f",
  "object": "season",
  "key": "2027",
  "name": "2027 Regular Season",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ],
  "livemode": true,
  "created_at": "2026-10-14T13:10:00.000Z"
}

Add events

POST/v1/seasons/{id}/events

Puts events in the season. Upcoming ones get the season's booked seats; if one of those seats is taken at an event, nothing changes (409 names the event and seats).

Body fieldTypeDescription
eventsrequiredstring[]Events (ids or keys) on the season's chart. 1–200 items
Request
curl https://www.venuery.com/v1/seasons/2027/events \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"events":["2027-08-30"]}'
Response · 200
{
  "id": "ssn_3k2m9q1x7c4b0d8f",
  "object": "season",
  "key": "2027",
  "name": "2027 Season",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ],
  "livemode": true,
  "created_at": "2026-10-14T13:10:00.000Z"
}

Remove an event

DELETE/v1/seasons/{id}/events/{event}

Takes an event out of the season. Seats booked at it stay booked.

Request
curl https://www.venuery.com/v1/seasons/2027/events/2027-05-28-opening-night \
  -u sk_test_…: \
  -X DELETE
Response · 200
{
  "id": "ssn_3k2m9q1x7c4b0d8f",
  "object": "season",
  "key": "2027",
  "name": "2027 Season",
  "venue": "ven_8f3k2m9q1x7c4b0d",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "events": [
    "evt_9q1x7c4b0d8f3k2m"
  ],
  "livemode": true,
  "created_at": "2026-10-14T13:10:00.000Z"
}

Book for the season

POST/v1/seasons/{id}/book

Books seats and GA places at every upcoming event in the season, all or nothing, and at events added to it later. Without an order_ref they're booked under season:<season id>. To give up one game, release the seat at that event: the season booking stays.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
order_refstringYour order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters
metadataobjectYour own key–value data, stored on each booked object.
Request
curl https://www.venuery.com/v1/seasons/2027/book \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"objects":["204-C-12","204-C-13"],"order_ref":"STH-0042","metadata":{"holder":"Sam"}}'
Response · 200
{
  "object": "season_booking",
  "season": "ssn_3k2m9q1x7c4b0d8f",
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m"
  ],
  "ga": [],
  "order_ref": "STH-0042",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ]
}

Release season seats

POST/v1/seasons/{id}/release

Frees season seats at every upcoming event where they're still booked under the season booking's order. Games already played keep their history.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
order_refstringRelease everything booked for the season under this order reference. up to 200 characters
Request
curl https://www.venuery.com/v1/seasons/2027/release \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"order_ref":"STH-0042"}'
Response · 200
{
  "object": "season_release",
  "season": "ssn_3k2m9q1x7c4b0d8f",
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m"
  ],
  "ga": [],
  "order_ref": "STH-0042",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ]
}

Season availability

GET/v1/seasons/{id}/availabilityPublishable keys too

What's left to sell for the whole season: a seat is unavailable if it's taken at any upcoming event, and a GA area has the fewest places left at any of them.

Request
curl https://www.venuery.com/v1/seasons/2027/availability \
  -u pk_test_…:
Response · 200
{
  "object": "season_availability",
  "season": "ssn_3k2m9q1x7c4b0d8f",
  "events": [
    "evt_9q1x7c4b0d8f3k2m",
    "evt_0d8f3k2m9q1x7c4b"
  ],
  "booked_for_season": 412,
  "counts": {
    "booked": 431,
    "held": 3
  },
  "unavailable": {
    "s_4k9q2m8f1x7c": "booked"
  },
  "general_admission": {
    "p_lawn": {
      "label": "Lawn",
      "category": "lawn",
      "capacity": 1500,
      "booked_for_season": 0,
      "available": 1180
    }
  }
}

Inventory

Hold seats while a buyer checks out, then book them under your order reference. Statuses: available, held, booked, not_for_sale and your own.

Availability

GET/v1/events/{id}/availabilityPublishable keys too

Every object that isn't available, with its status (held, booked, not_for_sale or your own), counts by status, and general admission by pool. Free seats kept for a channel you don't name show as channel. Poll it, or keep it fresh with webhooks.

Query parameterTypeDescription
channelsstringComma-separated channel keys whose seats count as available (NO_CHANNEL for seats in none)
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/availability \
  -u pk_test_…:
Response · 200
{
  "object": "availability",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "counts": {
    "available": 938,
    "booked": 40,
    "held": 2
  },
  "unavailable": {
    "s_4k9q2m8f1x7c": "booked"
  },
  "general_admission": {
    "p_lawn": {
      "label": "Lawn",
      "category": "lawn",
      "capacity": 1500,
      "booked": 120,
      "held": 4,
      "blocked": 50,
      "available": 1326
    }
  }
}

Object details

GET/v1/events/{id}/objects

Label parts, category, status, section, entrance, accessibility, hold, order_ref and metadata: what a ticket needs. Up to 500 at a time.

Query parameterTypeDescription
idsstringComma-separated object ids
labelsstringComma-separated labels (204-C-12,Lawn)
order_refstringEverything booked under this order reference (general admission pools carry order_quantity)
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/objects \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "s_4k9q2m8f1x7c",
      "object": "event_object",
      "kind": "seat",
      "label": "204-C-12",
      "displayed": {
        "section": "204",
        "row": "C",
        "seat": "12"
      },
      "category": "reserved",
      "status": "booked",
      "section": "sec_204",
      "entrance": "Gate B",
      "accessibility": [],
      "hold": null,
      "order_ref": "ORD-1042",
      "metadata": {
        "buyer": "Sam"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Hold seats

POST/v1/holdsPublishable keys too

Reserves objects and GA places while a buyer checks out. Publishable keys may call it: the seat map holds seats as buyers pick them. Book the hold when they pay; if you don't, it expires and the seats go back on sale.

Body fieldTypeDescription
eventrequiredstringThe event's id, or your key for it.
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
ttl_secondsintegerHow long to hold, in seconds. A hold can't last past two hours after it was made. 10–7200 · default 900
channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). up to 20 items
ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office).
Request
curl https://www.venuery.com/v1/holds \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"event":"2027-05-28-opening-night","objects":["204-C-12","204-C-13"],"ga":[{"pool":"Lawn","quantity":2}]}'
Response · 201
{
  "id": "hld_x7c4b0d8f3k2m9q1",
  "object": "hold",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "status": "active",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "expires_at": "2026-10-14T13:20:00.000Z",
  "max_expires_at": "2026-10-14T15:05:00.000Z",
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Get a hold

GET/v1/holds/{id}Publishable keys too
Request
curl https://www.venuery.com/v1/holds/hld_x7c4b0d8f3k2m9q1 \
  -u pk_test_…:
Response · 200
{
  "id": "hld_x7c4b0d8f3k2m9q1",
  "object": "hold",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "status": "active",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "expires_at": "2026-10-14T13:20:00.000Z",
  "max_expires_at": "2026-10-14T15:05:00.000Z",
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Extend or change a hold

PATCH/v1/holds/{id}Publishable keys too
Body fieldTypeDescription
ttl_secondsintegerHold for this many seconds from now (up to two hours after it was made). 0–7200
addobjectObjects and GA places to add to the hold.
add.objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
add.gaobject[]General admission places. up to 50 items
add.ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
add.ga[].quantityrequiredintegerHow many places. 1–100000
removeobjectObjects and GA places to let go of.
remove.objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
remove.gaobject[]General admission places. up to 50 items
remove.ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
remove.ga[].quantityrequiredintegerHow many places. 1–100000
channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). up to 20 items
ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office).
Request
curl https://www.venuery.com/v1/holds/hld_x7c4b0d8f3k2m9q1 \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"ttl_seconds":600,"add":{"objects":["204-C-14"]}}'
Response · 200
{
  "id": "hld_x7c4b0d8f3k2m9q1",
  "object": "hold",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "status": "active",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "expires_at": "2026-10-14T13:20:00.000Z",
  "max_expires_at": "2026-10-14T15:05:00.000Z",
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Release a hold

DELETE/v1/holds/{id}Publishable keys too
Request
curl https://www.venuery.com/v1/holds/hld_x7c4b0d8f3k2m9q1 \
  -u sk_test_…: \
  -X DELETE
Response · 200
{
  "id": "hld_x7c4b0d8f3k2m9q1",
  "object": "hold",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "status": "released",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "expires_at": "2026-10-14T13:20:00.000Z",
  "max_expires_at": "2026-10-14T15:05:00.000Z",
  "livemode": true,
  "created_at": "2026-10-14T13:05:00.000Z"
}

Book

POST/v1/events/{id}/book

Books a hold, or objects and GA places directly, under your order_ref. Objects must be available (or in the hold, or in a status in if_status); otherwise 409 with conflicts and nothing changes.

Body fieldTypeDescription
holdstringA hold's id: books everything it holds (plus any objects or ga you add).
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
order_refstringYour order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters
metadataobjectYour own key–value data, stored on each booked object.
if_statusstring[]Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items
channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). up to 20 items
ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office).
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/book \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"hold":"hld_x7c4b0d8f3k2m9q1","order_ref":"ORD-1042","metadata":{"buyer":"Sam"}}'
Response · 200
{
  "object": "status_change",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "action": "book",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "order_ref": "ORD-1042"
}

Release

POST/v1/events/{id}/release

Frees booked objects and GA places, by object and quantity or everything under an order_ref. Seats sold by venuery's own checkout are refunded there instead.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
order_refstringRelease everything booked under this order reference. up to 200 characters
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/release \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"order_ref":"ORD-1042"}'
Response · 200
{
  "object": "status_change",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "action": "release",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "order_ref": "ORD-1042"
}

Edit an order

POST/v1/events/{id}/move

Changes an order's seats: frees the ones in remove (they must be booked under order_ref) and books the ones in add under the same reference and metadata, in one transaction. A swap either happens whole or not at all (409 with conflicts).

Body fieldTypeDescription
order_refrequiredstringYour order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters
removestring[]Seats and tables to take out of the order; they go back on sale. up to 500 items
addstring[]Seats and tables to add; they must be available. up to 500 items
channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). up to 20 items
ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office).
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/move \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"order_ref":"ORD-1042","remove":["204-C-12","204-C-13"],"add":["204-A-5","204-A-6"]}'
Response · 200
{
  "object": "order_change",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "action": "move",
  "order_ref": "ORD-1042",
  "removed": [
    "s_4k9q2m8f1x7c",
    "s_4k9q2m8f1x7d"
  ],
  "added": [
    "s_2b7d1q0c9e3a",
    "s_2b7d1q0c9e3b"
  ]
}

Take seats off sale

POST/v1/events/{id}/block

Puts available objects in not_for_sale or your own status (sponsor, camera…), and holds back GA places.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
statusstringWhere to put the objects: not_for_sale (default) or your own status, like sponsor. matches ^[a-z0-9_]{1,40}$ · default "not_for_sale"
if_statusstring[]Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/block \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"objects":["101-A-1","101-A-2"],"status":"sponsor"}'
Response · 200
{
  "object": "status_change",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "action": "block",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "order_ref": null
}

Put seats back on sale

POST/v1/events/{id}/unblock
Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
gaobject[]General admission places. up to 50 items
ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
ga[].quantityrequiredintegerHow many places. 1–100000
statusstringThe status they're in now (default not_for_sale). matches ^[a-z0-9_]{1,40}$ · default "not_for_sale"
if_statusstring[]Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/unblock \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"objects":["101-A-1","101-A-2"],"status":"sponsor"}'
Response · 200
{
  "object": "status_change",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "action": "unblock",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "ga": [
    {
      "pool": "p_lawn",
      "quantity": 2
    }
  ],
  "order_ref": null
}

Many changes at once

POST/v1/status_changes/batch

Up to 100 book, release, block and unblock changes, across events, in one transaction: all happen or none do. A failure says which change (its index) it was.

Body fieldTypeDescription
changesrequiredobject[]Book, release, block or unblock changes, each with its event and action and that endpoint's fields. 1–100 items
changes[].eventrequiredstringThe event's id, or your key for it.
changes[].actionrequired"book" | "release" | "block" | "unblock"What to do: book, release, block or unblock.
changes[].holdstringA hold's id: books everything it holds (plus any objects or ga you add). book only
changes[].objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
changes[].gaobject[]General admission places. up to 50 items
changes[].ga[].poolrequiredstringA GA pool's id or label (Lawn). up to 120 characters
changes[].ga[].quantityrequiredintegerHow many places. 1–100000
changes[].order_refstringYour order reference. It's stored on each object, comes back from /objects, and release can free everything under it. book, release only · up to 200 characters
changes[].metadataobjectYour own key–value data, stored on each booked object. book only
changes[].if_statusstring[]Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. book, block, unblock only · up to 10 items
changes[].channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). book only · up to 20 items
changes[].ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office). book only
changes[].statusstringblock: the status to put them in (default not_for_sale). unblock: the status they're in now. block, unblock only · matches ^[a-z0-9_]{1,40}$ · default "not_for_sale"
Request
curl https://www.venuery.com/v1/status_changes/batch \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"changes":[{"action":"book","event":"2027-05-28-opening-night","objects":["204-C-12"],"order_ref":"ORD-1043"},{"action":"release","event":"2027-05-29","order_ref":"ORD-0977"}]}'
Response · 200
{
  "object": "list",
  "data": [
    {
      "object": "status_change",
      "event": "evt_9q1x7c4b0d8f3k2m",
      "action": "book",
      "objects": [
        "s_4k9q2m8f1x7c"
      ],
      "ga": [
        {
          "pool": "p_lawn",
          "quantity": 2
        }
      ],
      "order_ref": "ORD-1042"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Best available

POST/v1/events/{id}/best_availablePublishable keys too

Picks the best places and holds (or books) them: side by side in one row without stranding a seat, closest to the chart's focal point; then nearby seats; then a whole table; then general admission. 409 when there aren't enough.

Body fieldTypeDescription
numberrequiredintegerHow many places. 1–50
categoriesstring[]Only these category keys. up to 50 items
sectionsstring[]Only these sections (ids or labels). up to 200 items
zonestringOnly this zone (id or name).
accessible_seatsintegerHow many of the places must be wheelchair spaces; their companion seats come with them. 0–50 · default 0
prevent_orphansbooleanDon't leave a single empty seat at a row's edge or between taken seats. default true
action"hold" | "book"hold (default) or book the places found. default "hold"
ttl_secondsintegerFor hold: how long, in seconds (default 900). 10–7200
order_refstringYour order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters
metadataobjectYour own key–value data, stored on each booked object.
channelsstring[]Sales channels whose seats this request may take. Without it, only seats in no channel; add NO_CHANNEL to the list to include those (and general admission, which is in no channel). up to 20 items
ignore_channelsbooleanSecret keys: take seats whatever channel they're in (back office).
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/best_available \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"number":4,"categories":["reserved"]}'
Response · 201
{
  "object": "best_available",
  "next_to_each_other": true,
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m"
  ],
  "ga": [],
  "hold": {
    "id": "hld_x7c4b0d8f3k2m9q1",
    "object": "hold",
    "event": "evt_9q1x7c4b0d8f3k2m",
    "status": "active",
    "objects": [
      "s_4k9q2m8f1x7c"
    ],
    "ga": [
      {
        "pool": "p_lawn",
        "quantity": 2
      }
    ],
    "expires_at": "2026-10-14T13:20:00.000Z",
    "max_expires_at": "2026-10-14T15:05:00.000Z",
    "livemode": true,
    "created_at": "2026-10-14T13:05:00.000Z"
  }
}

Channels

Keep some of an event's seats for one sales channel: a presale, a partner site, sponsors. Requests take channel seats only when they name the channel in channels; the seat map does when you pass it channels.

List channels

GET/v1/events/{id}/channels
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "object": "channel",
      "event": "evt_9q1x7c4b0d8f3k2m",
      "key": "presale",
      "name": "Season-holder presale",
      "color": "#4f46e5",
      "objects": [
        "s_4k9q2m8f1x7c",
        "s_8f1x7c4k9q2m"
      ],
      "created_at": "2026-10-14T13:20:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create a channel

POST/v1/events/{id}/channels

Keeps seats for one sales channel: a presale, a partner site, sponsors. Only holds, bookings and best-available requests that name the channel can take them. For inventory events.

Body fieldTypeDescription
keyrequiredstringYour name for it in requests (letters, digits, _ and -). matches ^[A-Za-z0-9_-]{1,40}$
namerequiredstringWhat staff see. Buyers never see channel names. up to 80 characters
colorstringA hex color for staff views, like #4f46e5. matches ^#[0-9a-fA-F]{6}$
objectsstring[]Seats, tables and booths to put in it (by id or label). Each object is in one channel at most. up to 500 items
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"key":"presale","name":"Season-holder presale","objects":["204-C-12","204-C-13"]}'
Response · 201
{
  "object": "channel",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "key": "presale",
  "name": "Season-holder presale",
  "color": "#4f46e5",
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m"
  ],
  "created_at": "2026-10-14T13:20:00.000Z"
}

Update a channel

PATCH/v1/events/{id}/channels/{key}
Body fieldTypeDescription
namestringA name people will see. up to 80 characters
colorstring | nullA hex color for staff views, like #4f46e5. matches ^#[0-9a-fA-F]{6}$
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels/presale \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"name":"Members presale"}'
Response · 200
{
  "object": "channel",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "key": "presale",
  "name": "Members presale",
  "color": "#4f46e5",
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m"
  ],
  "created_at": "2026-10-14T13:20:00.000Z"
}

Delete a channel

DELETE/v1/events/{id}/channels/{key}

Its seats go back on general sale.

Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels/presale \
  -u sk_test_…: \
  -X DELETE
Response · 200
{
  "object": "channel",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "key": "presale",
  "name": "Season-holder presale",
  "color": "#4f46e5",
  "objects": [],
  "created_at": "2026-10-14T13:20:00.000Z",
  "deleted": true
}

Add seats to a channel

POST/v1/events/{id}/channels/{key}/objects

Moves them out of any other channel.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels/presale/objects \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"objects":["204-C-14"]}'
Response · 200
{
  "object": "channel",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "key": "presale",
  "name": "Season-holder presale",
  "color": "#4f46e5",
  "objects": [
    "s_4k9q2m8f1x7c",
    "s_8f1x7c4k9q2m",
    "s_1x7c4k9q2m8f"
  ],
  "created_at": "2026-10-14T13:20:00.000Z"
}

Replace a channel's seats

PUT/v1/events/{id}/channels/{key}/objects

The channel ends up with exactly these; an empty list empties it.

Body fieldTypeDescription
objectsstring[]Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels/presale/objects \
  -u sk_test_…: \
  -X PUT \
  -H "Content-Type: application/json" \
  -d '{"objects":["204-C-12"]}'
Response · 200
{
  "object": "channel",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "key": "presale",
  "name": "Season-holder presale",
  "color": "#4f46e5",
  "objects": [
    "s_4k9q2m8f1x7c"
  ],
  "created_at": "2026-10-14T13:20:00.000Z"
}

Gates

For venuery Ticketing events: connect turnstiles, RFID readers and other access control. Gates ask whether to open for what they read, exactly as the scanner app decides, and can keep a ticket list for when the network drops.

Scan a ticket at a gate

POST/v1/events/{id}/scans

For turnstiles, RFID readers and other access control: send what the reader read and open the gate when allow is true. It decides exactly as venuery's scanner app does: a ticket gets in once (duplicate after that, with the earlier scan), can go out and back in, and refunded or sent-on tickets are refused. Every scan is logged with its gate and device. Wristbands and cards work when their id is the ticket's external code (imported tickets keep the barcode they came with). Secret keys only.

Body fieldTypeDescription
coderequiredstringWhat the reader read: venuery's QR payload (VNY1:…), a ticket code, or a ticket's external code (another system's barcode, a wristband id). up to 200 characters
direction"in" | "out"in (default) or out. default "in"
gatestringWhich gate or lane, for the scan log. up to 40 characters
devicestringThe reader's own id, for the scan log. up to 64 characters
scanned_atdate-timeWhen it was read, for scans a gate stored while offline (default: now).
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/scans \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"code":"VNY1:8K2M4Q9X:3F7B1C0D2E","gate":"North 2","device":"turnstile-n2"}'
Response · 200
{
  "object": "scan",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "result": "admitted",
  "allow": true,
  "message": "Admit",
  "ticket": {
    "id": "tkt_7c2f9d1k3m8q",
    "label": "Section 204 · Row C · Seat 12",
    "type": "Adult",
    "checked_in_at": "2027-05-28T22:41:07.000Z"
  },
  "previous": null
}

Ticket list for offline gates

GET/v1/events/{id}/scan_list

Every ticket for the game with its codes and whether it's valid and inside, for gates that must keep checking when the network drops. Match a QR payload VNY1:<code>:<signature> by its code. Refuse moved_codes (they were replaced when a ticket was sent to someone else). Send the scans afterwards with scanned_at so the log and counts catch up. No names or emails.

Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/scan_list \
  -u sk_test_…:
Response · 200
{
  "object": "scan_list",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "generated_at": "2027-05-28T21:00:00.000Z",
  "tickets": [
    {
      "id": "tkt_7c2f9d1k3m8q",
      "code": "8K2M4Q9X",
      "external_code": null,
      "label": "Section 204 · Row C · Seat 12",
      "type": "Adult",
      "valid": true,
      "inside": false
    }
  ],
  "moved_codes": [
    "Q3T6V1B8"
  ]
}

Webhooks

Get told when things change: signed POSTs to your endpoints, or poll the notifications feed.

List endpoints

GET/v1/webhook_endpoints
Request
curl https://www.venuery.com/v1/webhook_endpoints \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "whe_2m8f4k9q1x7c3b0d",
      "object": "webhook_endpoint",
      "url": "https://tickets.example.com/hooks/venuery",
      "events": [
        "objects.booked",
        "hold.expired"
      ],
      "description": "Production",
      "enabled": true,
      "created_at": "2026-10-14T13:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create an endpoint

POST/v1/webhook_endpoints

The response includes the signing secret, this once. Keep it to check signatures.

Body fieldTypeDescription
urlrequiredstringA public https URL that accepts POSTs. up to 500 characters
events("hold.created" | "hold.expired" | "objects.booked" | "objects.released" | "objects.status_changed" | "season.booked" | "season.released" | "order.completed" | "order.refunded" | "event.updated" | "chart.published" | "*")[]Notification types to send, or ["*"] (default) for all. default ["*"]
descriptionstringA note for yourself. up to 200 characters
Request
curl https://www.venuery.com/v1/webhook_endpoints \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"url":"https://tickets.example.com/hooks/venuery","events":["objects.booked","hold.expired"],"description":"Production"}'
Response · 201
{
  "id": "whe_2m8f4k9q1x7c3b0d",
  "object": "webhook_endpoint",
  "url": "https://tickets.example.com/hooks/venuery",
  "events": [
    "objects.booked",
    "hold.expired"
  ],
  "description": "Production",
  "enabled": true,
  "created_at": "2026-10-14T13:00:00.000Z",
  "secret": "whsec_…"
}

Get an endpoint

GET/v1/webhook_endpoints/{id}
Request
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
  -u sk_test_…:
Response · 200
{
  "id": "whe_2m8f4k9q1x7c3b0d",
  "object": "webhook_endpoint",
  "url": "https://tickets.example.com/hooks/venuery",
  "events": [
    "objects.booked",
    "hold.expired"
  ],
  "description": "Production",
  "enabled": true,
  "created_at": "2026-10-14T13:00:00.000Z"
}

Update an endpoint

PATCH/v1/webhook_endpoints/{id}
Body fieldTypeDescription
urlstringA public https URL that accepts POSTs. up to 500 characters
events("hold.created" | "hold.expired" | "objects.booked" | "objects.released" | "objects.status_changed" | "season.booked" | "season.released" | "order.completed" | "order.refunded" | "event.updated" | "chart.published" | "*")[]Notification types to send, or ["*"] for all. default ["*"]
descriptionstring | nullA note for yourself. up to 200 characters
enabledbooleanWhether deliveries are sent.
Request
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
  -u sk_test_…: \
  -X PATCH \
  -H "Content-Type: application/json" \
  -d '{"enabled":false}'
Response · 200
{
  "id": "whe_2m8f4k9q1x7c3b0d",
  "object": "webhook_endpoint",
  "url": "https://tickets.example.com/hooks/venuery",
  "events": [
    "objects.booked",
    "hold.expired"
  ],
  "description": "Production",
  "enabled": false,
  "created_at": "2026-10-14T13:00:00.000Z"
}

Delete an endpoint

DELETE/v1/webhook_endpoints/{id}
Request
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
  -u sk_test_…: \
  -X DELETE
Response · 200
{
  "id": "whe_2m8f4k9q1x7c3b0d",
  "object": "webhook_endpoint",
  "url": "https://tickets.example.com/hooks/venuery",
  "events": [
    "objects.booked",
    "hold.expired"
  ],
  "description": "Production",
  "enabled": true,
  "created_at": "2026-10-14T13:00:00.000Z",
  "deleted": true
}

Recent deliveries

GET/v1/webhook_endpoints/{id}/deliveries

The last 50, newest first.

Request
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d/deliveries \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": 1,
      "object": "webhook_delivery",
      "notification": "ntf_812",
      "type": "objects.booked",
      "status": "succeeded",
      "attempts": 1,
      "last_status_code": 200,
      "last_error": null,
      "created_at": "2026-10-14T13:06:00.000Z",
      "delivered_at": "2026-10-14T13:06:01.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Poll notifications

GET/v1/notifications

Everything that happened in the workspace, oldest first, for platforms that would rather poll than receive webhooks. Types: hold.created, hold.expired, objects.booked, objects.released, objects.status_changed, season.booked, season.released, order.completed, order.refunded, event.updated, chart.published.

Query parameterTypeDescription
afterstringA notification id: only later ones
typesstringComma-separated types
limitinteger1–100 (default 25)
cursorstringnext_cursor from the previous page
Request
curl https://www.venuery.com/v1/notifications \
  -u sk_test_…:
Response · 200
{
  "object": "list",
  "data": [
    {
      "id": "ntf_812",
      "object": "notification",
      "type": "objects.booked",
      "created_at": "2026-10-14T13:06:00.000Z",
      "livemode": true,
      "data": {
        "object": "status_change",
        "event": "evt_9q1x7c4b0d8f3k2m",
        "action": "book",
        "objects": [
          "s_4k9q2m8f1x7c"
        ],
        "ga": [
          {
            "pool": "p_lawn",
            "quantity": 2
          }
        ],
        "order_ref": "ORD-1042"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Staff embeds

Staff tools on your own pages, powered by short-lived tokens your server mints, so no secret key reaches a browser: the event manager (venuery.EventManager) and the chart designer (venuery.Designer). See the embed guide.

Mint an event manager token

POST/v1/event_manager_tokens

A short-lived token for the event manager embed (venuery.EventManager), so staff screens never hold a secret key. It works on one event, only in the modes you give it, and stops working if the key that minted it is revoked. Make one per staff session on your server.

Body fieldTypeDescription
eventrequiredstringThe event's id, or your key for it.
modes("view" | "sell" | "book" | "block")[]view (live statuses and search; always included), sell (point of sale: picks are held for you to book), book (book and release), block (take seats off sale and put them back). Default: all. 1–4 items · default ["view","sell","book","block"]
ttl_secondsintegerHow long it works, in seconds: 60 to 43,200 (12 hours). Default an hour. 60–43200 · default 3600
userstringWho it's for (shown in the status log as the actor), like a staff email. up to 100 characters
Request
curl https://www.venuery.com/v1/event_manager_tokens \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"event":"2027-05-28-opening-night","modes":["view","book","block"],"user":"[email protected]"}'
Response · 201
{
  "object": "event_manager_token",
  "token": "emt_eyJ2IjoxLC…",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "modes": [
    "view",
    "book",
    "block"
  ],
  "user": "[email protected]",
  "expires_at": "2027-05-28T19:00:00.000Z"
}

Mint a designer token

POST/v1/designer_tokens

A short-lived token for the embedded designer (venuery.Designer): your customers draw and edit their charts on your pages, white label. It works on one chart, saves drafts, and publishes only with publish. Live keys need the Growth plan; test keys work on any plan.

Body fieldTypeDescription
chartrequiredstringA chart's id.
modes("edit" | "publish")[]edit (save drafts; default) and/or publish (make versions events can use). 1–2 items · default ["edit"]
ttl_secondsintegerHow long it works, in seconds: 60 to 43,200 (12 hours). Default an hour. 60–43200 · default 3600
userstringWho it's for, like an email. up to 100 characters
Request
curl https://www.venuery.com/v1/designer_tokens \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"chart":"cht_4k9q2m8f1x7c3b0d","modes":["edit","publish"],"user":"[email protected]"}'
Response · 201
{
  "object": "designer_token",
  "token": "edt_eyJ2IjoxLC…",
  "chart": "cht_4k9q2m8f1x7c3b0d",
  "modes": [
    "edit",
    "publish"
  ],
  "user": "[email protected]",
  "expires_at": "2027-05-28T19:00:00.000Z"
}

Usage

You pay for booked seats, not holds or selections. See your count any time.

Booked seats this month

GET/v1/usage

What you're billed for, by calendar month (UTC): seats, tables and booths booked through the API, once per event and once per season for season seats, plus GA places (the most booked at once in each area). Live keys see live usage; test keys see test usage, which is never billed. Stripe invoices by your plan's billing period.

Query parameterTypeDescription
monthstring2027-05 (default: this month)
Request
curl https://www.venuery.com/v1/usage \
  -u sk_test_…:
Response · 200
{
  "object": "usage",
  "month": "2027-05",
  "livemode": true,
  "booked_seats": 1873,
  "breakdown": {
    "event_seats": 1204,
    "season_seats": 412,
    "general_admission": 257
  },
  "events": [
    {
      "event": "evt_9q1x7c4b0d8f3k2m",
      "key": "2027-05-28-opening-night",
      "name": "Opening Night",
      "seats": 611,
      "general_admission": 120
    }
  ],
  "seasons": [
    {
      "season": "ssn_3k2m9q1x7c4b0d8f",
      "key": "2027",
      "name": "2027 Season",
      "seats": 412,
      "general_admission": 0
    }
  ],
  "plan": "launch",
  "included": 750,
  "over_allowance": 1123
}

Migration

Moving from seats.io: bring each live event's bookings across. See the migration guide for the whole move.

Import a seats.io event's state

POST/v1/events/{id}/import

Books, blocks and takes off sale the objects a seats.io event report lists, matched by label, in one transaction: all or nothing. Free and held objects are left alone. Imported bookings aren't billed and send no webhooks. Try it with dry_run first.

Body fieldTypeDescription
reportrequiredobject[] | map of object[]The report as seats.io returns it (GET /reports/events/{key}/byStatus, byLabel or byOrderId), or a flat list of its objects. Each needs label and status; orderId, extraData, forSale, objectType, numBooked and numNotForSale are used when present.
ga_bookingsobject[]General admission bookings per order. Without them, each area's numBooked becomes one booking. up to 10000 items
ga_bookings[].poolrequiredstringThe GA area's label. up to 200 characters
ga_bookings[].quantityrequiredinteger 1–100000
ga_bookings[].order_refstringThe order (default: default_order_ref). up to 200 characters
ga_bookings[].metadataobjectYour own key–value data, stored on each booked object.
booked_statusesstring[]seats.io statuses that mean someone owns the seat. Any other status (except free and held) becomes a blocked status of the same name here. 1–20 items · default ["booked","resale"]
default_order_refstringOrder reference for bookings without an orderId. up to 200 characters · default "seatsio-import"
skip_unknownbooleanImport what matches and ignore labels this chart doesn't have. Otherwise they're listed and nothing is imported. default false
dry_runbooleanCheck everything and report what would happen, changing nothing. default false
Request
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/import \
  -u sk_test_…: \
  -H "Content-Type: application/json" \
  -d '{"dry_run":true,"report":{"booked":[{"label":"204-C-12","status":"booked","orderId":"ORD-881","extraData":{"buyer":"Sam"}},{"label":"Lawn","status":"booked","objectType":"GeneralAdmissionArea","numBooked":120}],"Sponsor":[{"label":"101-A-1","status":"Sponsor"}]}}'
Response · 200
{
  "object": "state_import",
  "event": "evt_9q1x7c4b0d8f3k2m",
  "dry_run": true,
  "booked": {
    "objects": 1,
    "orders": 1,
    "ga": [
      {
        "pool": "p_lawn",
        "quantity": 120,
        "order_ref": "seatsio-import"
      }
    ]
  },
  "blocked": {
    "sponsor": 1
  },
  "ga_blocked": [],
  "skipped": {
    "free": 0,
    "held": 0,
    "unknown": 0
  },
  "unknown": []
}