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
/v1/mePublishable keys tooWhich organization, workspace (live or test) and venues the key acts on.
curl https://www.venuery.com/v1/me \
-u pk_test_…:{
"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.
- GET
/venuesList venues - POST
/venuesCreate a venue - GET
/venues/{id}Get a venue - PATCH
/venues/{id}Update a venue
List venues
/v1/venues| Query parameter | Type | Description |
|---|---|---|
limit | integer | 1–100 (default 25) |
cursor | string | next_cursor from the previous page |
curl https://www.venuery.com/v1/venues \
-u sk_test_…:{
"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
/v1/venues| Body field | Type | Description |
|---|---|---|
namerequired | string | A name people will see. up to 120 characters |
address | string | null | Street address. up to 300 characters |
timezone | string | IANA time zone, like America/New_York (default: the organization's). |
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"}'{
"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
/v1/venues/{id}curl https://www.venuery.com/v1/venues/ven_8f3k2m9q1x7c4b0d \
-u sk_test_…:{
"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
/v1/venues/{id}| Body field | Type | Description |
|---|---|---|
name | string | A name people will see. up to 120 characters |
address | string | null | Street address. up to 300 characters |
timezone | string | IANA time zone, like America/New_York (default: the organization's). |
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"}'{
"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.
- GET
/chartsList charts - POST
/chartsCreate a chart - GET
/charts/{id}Get a chart - PUT
/charts/{id}/draftReplace the draft - POST
/charts/{id}/draft/validateCheck the draft - POST
/charts/{id}/publishPublish the draft - GET
/charts/{id}/versionsList versions - GET
/charts/{id}/versions/{n}Get a version - POST
/charts/{id}/copyCopy a chart
List charts
/v1/charts| Query parameter | Type | Description |
|---|---|---|
venue | string | Only this venue's charts |
limit | integer | 1–100 (default 25) |
cursor | string | next_cursor from the previous page |
curl https://www.venuery.com/v1/charts \
-u sk_test_…:{
"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
/v1/chartsEmpty, 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 field | Type | Description |
|---|---|---|
venuerequired | string | A venue's id. |
namerequired | string | A name people will see. up to 120 characters |
document | any | A venuery chart document, or a seats.io drawing (converted on the way in). |
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"}}'{
"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
/v1/charts/{id}| Query parameter | Type | Description |
|---|---|---|
expand | string | draft to include the draft document |
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d \
-u sk_test_…:{
"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
/v1/charts/{id}/draftPass the revision you started from to be refused (409) if someone saved in between.
| Body field | Type | Description |
|---|---|---|
documentrequired | any | A venuery chart document, or a seats.io drawing (converted on the way in). |
revision | integer | The draft_revision you started from: refused (409) if the draft changed since. |
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}'{
"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
/v1/charts/{id}/draft/validateRuns the checks publishing runs, with your organization's settings (Settings → Chart checks).
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/draft/validate \
-u sk_test_…: \
-X POST{
"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
/v1/charts/{id}/publishCompiles the draft into a new version that events can pin. Versions never change. 422 with the errors when the draft can't be published.
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/publish \
-u sk_test_…: \
-X POST{
"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
/v1/charts/{id}/versionscurl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/versions \
-u sk_test_…:{
"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
/v1/charts/{id}/versions/{n}| Query parameter | Type | Description |
|---|---|---|
expand | string | layout, document and/or labels (label → id for every seat, table, booth and GA area), comma-separated |
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/versions/3 \
-u sk_test_…:{
"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
/v1/charts/{id}/copyA new chart with this one's draft.
| Body field | Type | Description |
|---|---|---|
name | string | The copy's name (default: “… (copy)”). up to 120 characters |
curl https://www.venuery.com/v1/charts/cht_4k9q2m8f1x7c3b0d/copy \
-u sk_test_…: \
-H "Content-Type: application/json" \
-d '{"name":"Baseball – playoffs"}'{
"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.
- GET
/eventsList events - POST
/eventsCreate an event - POST
/events/bulkCreate up to 100 events - GET
/events/{id}Get an event - PATCH
/events/{id}Update an event - GET
/events/{id}/layoutThe event's chart - POST
/events/{id}/on_salePut an event on sale - POST
/events/{id}/cancelCancel an event
List events
/v1/events| Query parameter | Type | Description |
|---|---|---|
venue | string | Venue id |
season | string | Season id |
status | string | draft, on_sale or cancelled |
starts_after | string | ISO 8601 date-time |
starts_before | string | ISO 8601 date-time |
limit | integer | 1–100 (default 25) |
cursor | string | next_cursor from the previous page |
curl https://www.venuery.com/v1/events \
-u sk_test_…:{
"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
/v1/eventsPins 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 field | Type | Description |
|---|---|---|
chartrequired | string | A chart's id. |
version | integer | The published version to pin (default: the latest). positive |
key | string | Your own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$ |
namerequired | string | A name people will see. up to 200 characters |
subtitle | string | null | A second line, like the opponent. up to 200 characters |
starts_atrequired | date-time | When 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" |
prices | map of integer | Ticketed events: price per chart category, in cents ({"reserved": 1500}). |
max_tickets_per_order | integer | The most places one order may take. 1–500 |
season | string | A season (id or key) on the same chart. The event gets the season's booked seats. |
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"}'{
"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
/v1/events/bulkAll of them, or none.
| Body field | Type | Description |
|---|---|---|
eventsrequired | object[] | Events, each as for Create an event. 1–100 items |
events[].chartrequired | string | A chart's id. |
events[].version | integer | The published version to pin (default: the latest). positive |
events[].key | string | Your 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[].namerequired | string | A name people will see. up to 200 characters |
events[].subtitle | string | null | A second line, like the opponent. up to 200 characters |
events[].starts_atrequired | date-time | When 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[].prices | map of integer | Ticketed events: price per chart category, in cents ({"reserved": 1500}). |
events[].max_tickets_per_order | integer | The most places one order may take. 1–500 |
events[].season | string | A season (id or key) on the same chart. The event gets the season's booked seats. |
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"}]}'{
"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
/v1/events/{id}By id or by your key.
curl https://www.venuery.com/v1/events/2027-05-28-opening-night \
-u sk_test_…:{
"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
/v1/events/{id}| Body field | Type | Description |
|---|---|---|
name | string | A name people will see. up to 200 characters |
subtitle | string | null | A second line, like the opponent. up to 200 characters |
starts_at | date-time | When it starts, ISO 8601 with an offset (2027-05-28T19:05:00-04:00). |
max_tickets_per_order | integer | The most places one order may take. 1–500 |
season | string | null | Move 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. |
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"}'{
"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
/v1/events/{id}/layoutPublishable keys tooThe compiled chart version the event uses: sections, rows, seats with their labels and positions, tables, booths and GA areas. For drawing your own map.
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/layout \
-u pk_test_…:{
"object": "event_layout",
"event": "evt_9q1x7c4b0d8f3k2m",
"chart_version": "chv_2m8f4k9q1x7c3b0d",
"layout": {
"format": "venuery.layout/v2",
"sections": [
"…"
],
"seats": [
"…"
],
"pools": [
"…"
]
}
}Put an event on sale
/v1/events/{id}/on_salecurl https://www.venuery.com/v1/events/2027-05-28-opening-night/on_sale \
-u sk_test_…: \
-X POST{
"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
/v1/events/{id}/cancelReleases every active hold. Booked seats stay booked, for your records.
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/cancel \
-u sk_test_…: \
-X POST{
"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.
- GET
/seasonsList seasons - POST
/seasonsCreate a season - GET
/seasons/{id}Get a season - PATCH
/seasons/{id}Update a season - POST
/seasons/{id}/eventsAdd events - DELETE
/seasons/{id}/events/{event}Remove an event - POST
/seasons/{id}/bookBook for the season - POST
/seasons/{id}/releaseRelease season seats - GET
/seasons/{id}/availabilitySeason availability
List seasons
/v1/seasons| Query parameter | Type | Description |
|---|---|---|
venue | string | Only this venue's seasons |
limit | integer | 1–100 (default 25) |
cursor | string | next_cursor from the previous page |
curl https://www.venuery.com/v1/seasons \
-u sk_test_…:{
"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
/v1/seasons| Body field | Type | Description |
|---|---|---|
chartrequired | string | A chart's id. |
key | string | Your own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$ |
namerequired | string | A name people will see. up to 80 characters |
events | string[] | Events (ids or keys) on the same chart to put in it. Add more later. up to 200 items |
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"]}'{
"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
/v1/seasons/{id}By id or by your key.
curl https://www.venuery.com/v1/seasons/2027 \
-u sk_test_…:{
"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
/v1/seasons/{id}| Body field | Type | Description |
|---|---|---|
name | string | A name people will see. up to 80 characters |
key | string | null | Your own id for it, unique in the workspace (letters, digits and . _ : -). Use it anywhere an id goes. matches ^[A-Za-z0-9._:-]{1,80}$ |
curl https://www.venuery.com/v1/seasons/2027 \
-u sk_test_…: \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"name":"2027 Regular Season"}'{
"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
/v1/seasons/{id}/eventsPuts 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 field | Type | Description |
|---|---|---|
eventsrequired | string[] | Events (ids or keys) on the season's chart. 1–200 items |
curl https://www.venuery.com/v1/seasons/2027/events \
-u sk_test_…: \
-H "Content-Type: application/json" \
-d '{"events":["2027-08-30"]}'{
"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
/v1/seasons/{id}/events/{event}Takes an event out of the season. Seats booked at it stay booked.
curl https://www.venuery.com/v1/seasons/2027/events/2027-05-28-opening-night \
-u sk_test_…: \
-X DELETE{
"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
/v1/seasons/{id}/bookBooks 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 field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
order_ref | string | Your order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters |
metadata | object | Your own key–value data, stored on each booked object. |
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"}}'{
"object": "season_booking",
"season": "ssn_3k2m9q1x7c4b0d8f",
"objects": [
"s_4k9q2m8f1x7c",
"s_8f1x7c4k9q2m"
],
"ga": [],
"order_ref": "STH-0042",
"events": [
"evt_9q1x7c4b0d8f3k2m",
"evt_0d8f3k2m9q1x7c4b"
]
}Release season seats
/v1/seasons/{id}/releaseFrees season seats at every upcoming event where they're still booked under the season booking's order. Games already played keep their history.
| Body field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
order_ref | string | Release everything booked for the season under this order reference. up to 200 characters |
curl https://www.venuery.com/v1/seasons/2027/release \
-u sk_test_…: \
-H "Content-Type: application/json" \
-d '{"order_ref":"STH-0042"}'{
"object": "season_release",
"season": "ssn_3k2m9q1x7c4b0d8f",
"objects": [
"s_4k9q2m8f1x7c",
"s_8f1x7c4k9q2m"
],
"ga": [],
"order_ref": "STH-0042",
"events": [
"evt_9q1x7c4b0d8f3k2m",
"evt_0d8f3k2m9q1x7c4b"
]
}Season availability
/v1/seasons/{id}/availabilityPublishable keys tooWhat'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.
curl https://www.venuery.com/v1/seasons/2027/availability \
-u pk_test_…:{
"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.
- GET
/events/{id}/availabilityAvailability - GET
/events/{id}/objectsObject details - POST
/holdsHold seats - GET
/holds/{id}Get a hold - PATCH
/holds/{id}Extend or change a hold - DELETE
/holds/{id}Release a hold - POST
/events/{id}/bookBook - POST
/events/{id}/releaseRelease - POST
/events/{id}/moveEdit an order - POST
/events/{id}/blockTake seats off sale - POST
/events/{id}/unblockPut seats back on sale - POST
/status_changes/batchMany changes at once - POST
/events/{id}/best_availableBest available
Availability
/v1/events/{id}/availabilityPublishable keys tooEvery 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 parameter | Type | Description |
|---|---|---|
channels | string | Comma-separated channel keys whose seats count as available (NO_CHANNEL for seats in none) |
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/availability \
-u pk_test_…:{
"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
/v1/events/{id}/objectsLabel parts, category, status, section, entrance, accessibility, hold, order_ref and metadata: what a ticket needs. Up to 500 at a time.
| Query parameter | Type | Description |
|---|---|---|
ids | string | Comma-separated object ids |
labels | string | Comma-separated labels (204-C-12,Lawn) |
order_ref | string | Everything booked under this order reference (general admission pools carry order_quantity) |
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/objects \
-u sk_test_…:{
"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
/v1/holdsPublishable keys tooReserves 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 field | Type | Description |
|---|---|---|
eventrequired | string | The event's id, or your key for it. |
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
ttl_seconds | integer | How long to hold, in seconds. A hold can't last past two hours after it was made. 10–7200 · default 900 |
channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). |
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}]}'{
"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
/v1/holds/{id}Publishable keys toocurl https://www.venuery.com/v1/holds/hld_x7c4b0d8f3k2m9q1 \
-u pk_test_…:{
"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
/v1/holds/{id}Publishable keys too| Body field | Type | Description |
|---|---|---|
ttl_seconds | integer | Hold for this many seconds from now (up to two hours after it was made). 0–7200 |
add | object | Objects and GA places to add to the hold. |
add.objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
add.ga | object[] | General admission places. up to 50 items |
add.ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
add.ga[].quantityrequired | integer | How many places. 1–100000 |
remove | object | Objects and GA places to let go of. |
remove.objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
remove.ga | object[] | General admission places. up to 50 items |
remove.ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
remove.ga[].quantityrequired | integer | How many places. 1–100000 |
channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). |
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"]}}'{
"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
/v1/holds/{id}Publishable keys toocurl https://www.venuery.com/v1/holds/hld_x7c4b0d8f3k2m9q1 \
-u sk_test_…: \
-X DELETE{
"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
/v1/events/{id}/bookBooks 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 field | Type | Description |
|---|---|---|
hold | string | A hold's id: books everything it holds (plus any objects or ga you add). |
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
order_ref | string | Your order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters |
metadata | object | Your own key–value data, stored on each booked object. |
if_status | string[] | Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items |
channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). |
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"}}'{
"object": "status_change",
"event": "evt_9q1x7c4b0d8f3k2m",
"action": "book",
"objects": [
"s_4k9q2m8f1x7c"
],
"ga": [
{
"pool": "p_lawn",
"quantity": 2
}
],
"order_ref": "ORD-1042"
}Release
/v1/events/{id}/releaseFrees 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 field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
order_ref | string | Release everything booked under this order reference. up to 200 characters |
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"}'{
"object": "status_change",
"event": "evt_9q1x7c4b0d8f3k2m",
"action": "release",
"objects": [
"s_4k9q2m8f1x7c"
],
"ga": [
{
"pool": "p_lawn",
"quantity": 2
}
],
"order_ref": "ORD-1042"
}Edit an order
/v1/events/{id}/moveChanges 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 field | Type | Description |
|---|---|---|
order_refrequired | string | Your order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters |
remove | string[] | Seats and tables to take out of the order; they go back on sale. up to 500 items |
add | string[] | Seats and tables to add; they must be available. up to 500 items |
channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). |
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"]}'{
"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
/v1/events/{id}/blockPuts available objects in not_for_sale or your own status (sponsor, camera…), and holds back GA places.
| Body field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
status | string | Where 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_status | string[] | Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items |
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"}'{
"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
/v1/events/{id}/unblock| Body field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
ga | object[] | General admission places. up to 50 items |
ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
ga[].quantityrequired | integer | How many places. 1–100000 |
status | string | The status they're in now (default not_for_sale). matches ^[a-z0-9_]{1,40}$ · default "not_for_sale" |
if_status | string[] | Statuses the objects may also be in besides available, e.g. ["not_for_sale"] to book seats you'd blocked. up to 10 items |
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"}'{
"object": "status_change",
"event": "evt_9q1x7c4b0d8f3k2m",
"action": "unblock",
"objects": [
"s_4k9q2m8f1x7c"
],
"ga": [
{
"pool": "p_lawn",
"quantity": 2
}
],
"order_ref": null
}Many changes at once
/v1/status_changes/batchUp 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 field | Type | Description |
|---|---|---|
changesrequired | object[] | Book, release, block or unblock changes, each with its event and action and that endpoint's fields. 1–100 items |
changes[].eventrequired | string | The event's id, or your key for it. |
changes[].actionrequired | "book" | "release" | "block" | "unblock" | What to do: book, release, block or unblock. |
changes[].hold | string | A hold's id: books everything it holds (plus any objects or ga you add). book only |
changes[].objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
changes[].ga | object[] | General admission places. up to 50 items |
changes[].ga[].poolrequired | string | A GA pool's id or label (Lawn). up to 120 characters |
changes[].ga[].quantityrequired | integer | How many places. 1–100000 |
changes[].order_ref | string | Your 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[].metadata | object | Your own key–value data, stored on each booked object. book only |
changes[].if_status | string[] | 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[].channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). book only |
changes[].status | string | block: 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" |
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"}]}'{
"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
/v1/events/{id}/best_availablePublishable keys tooPicks 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 field | Type | Description |
|---|---|---|
numberrequired | integer | How many places. 1–50 |
categories | string[] | Only these category keys. up to 50 items |
sections | string[] | Only these sections (ids or labels). up to 200 items |
zone | string | Only this zone (id or name). |
accessible_seats | integer | How many of the places must be wheelchair spaces; their companion seats come with them. 0–50 · default 0 |
prevent_orphans | boolean | Don'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_seconds | integer | For hold: how long, in seconds (default 900). 10–7200 |
order_ref | string | Your order reference. It's stored on each object, comes back from /objects, and release can free everything under it. up to 200 characters |
metadata | object | Your own key–value data, stored on each booked object. |
channels | string[] | 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_channels | boolean | Secret keys: take seats whatever channel they're in (back office). |
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"]}'{
"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.
- GET
/events/{id}/channelsList channels - POST
/events/{id}/channelsCreate a channel - PATCH
/events/{id}/channels/{key}Update a channel - DELETE
/events/{id}/channels/{key}Delete a channel - POST
/events/{id}/channels/{key}/objectsAdd seats to a channel - PUT
/events/{id}/channels/{key}/objectsReplace a channel's seats
List channels
/v1/events/{id}/channelscurl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels \
-u sk_test_…:{
"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
/v1/events/{id}/channelsKeeps 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 field | Type | Description |
|---|---|---|
keyrequired | string | Your name for it in requests (letters, digits, _ and -). matches ^[A-Za-z0-9_-]{1,40}$ |
namerequired | string | What staff see. Buyers never see channel names. up to 80 characters |
color | string | A hex color for staff views, like #4f46e5. matches ^#[0-9a-fA-F]{6}$ |
objects | string[] | Seats, tables and booths to put in it (by id or label). Each object is in one channel at most. up to 500 items |
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"]}'{
"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
/v1/events/{id}/channels/{key}| Body field | Type | Description |
|---|---|---|
name | string | A name people will see. up to 80 characters |
color | string | null | A hex color for staff views, like #4f46e5. matches ^#[0-9a-fA-F]{6}$ |
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"}'{
"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
/v1/events/{id}/channels/{key}Its seats go back on general sale.
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/channels/presale \
-u sk_test_…: \
-X DELETE{
"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
/v1/events/{id}/channels/{key}/objectsMoves them out of any other channel.
| Body field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
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"]}'{
"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
/v1/events/{id}/channels/{key}/objectsThe channel ends up with exactly these; an empty list empties it.
| Body field | Type | Description |
|---|---|---|
objects | string[] | Object ids (s_…, t_…) or labels (204-C-12). A table books whole. up to 500 items |
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"]}'{
"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
/v1/events/{id}/scansFor 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 field | Type | Description |
|---|---|---|
coderequired | string | What 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" |
gate | string | Which gate or lane, for the scan log. up to 40 characters |
device | string | The reader's own id, for the scan log. up to 64 characters |
scanned_at | date-time | When it was read, for scans a gate stored while offline (default: now). |
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"}'{
"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
/v1/events/{id}/scan_listEvery 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.
curl https://www.venuery.com/v1/events/2027-05-28-opening-night/scan_list \
-u sk_test_…:{
"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.
- GET
/webhook_endpointsList endpoints - POST
/webhook_endpointsCreate an endpoint - GET
/webhook_endpoints/{id}Get an endpoint - PATCH
/webhook_endpoints/{id}Update an endpoint - DELETE
/webhook_endpoints/{id}Delete an endpoint - GET
/webhook_endpoints/{id}/deliveriesRecent deliveries - GET
/notificationsPoll notifications
List endpoints
/v1/webhook_endpointscurl https://www.venuery.com/v1/webhook_endpoints \
-u sk_test_…:{
"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
/v1/webhook_endpointsThe response includes the signing secret, this once. Keep it to check signatures.
| Body field | Type | Description |
|---|---|---|
urlrequired | string | A 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 ["*"] |
description | string | A note for yourself. up to 200 characters |
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"}'{
"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
/v1/webhook_endpoints/{id}curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
-u sk_test_…:{
"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
/v1/webhook_endpoints/{id}| Body field | Type | Description |
|---|---|---|
url | string | A 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 ["*"] |
description | string | null | A note for yourself. up to 200 characters |
enabled | boolean | Whether deliveries are sent. |
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
-u sk_test_…: \
-X PATCH \
-H "Content-Type: application/json" \
-d '{"enabled":false}'{
"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
/v1/webhook_endpoints/{id}curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d \
-u sk_test_…: \
-X DELETE{
"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
/v1/webhook_endpoints/{id}/deliveriesThe last 50, newest first.
curl https://www.venuery.com/v1/webhook_endpoints/whe_2m8f4k9q1x7c3b0d/deliveries \
-u sk_test_…:{
"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
/v1/notificationsEverything 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 parameter | Type | Description |
|---|---|---|
after | string | A notification id: only later ones |
types | string | Comma-separated types |
limit | integer | 1–100 (default 25) |
cursor | string | next_cursor from the previous page |
curl https://www.venuery.com/v1/notifications \
-u sk_test_…:{
"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
/v1/event_manager_tokensA 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 field | Type | Description |
|---|---|---|
eventrequired | string | The 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_seconds | integer | How long it works, in seconds: 60 to 43,200 (12 hours). Default an hour. 60–43200 · default 3600 |
user | string | Who it's for (shown in the status log as the actor), like a staff email. up to 100 characters |
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]"}'{
"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
/v1/designer_tokensA 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 field | Type | Description |
|---|---|---|
chartrequired | string | A chart's id. |
modes | ("edit" | "publish")[] | edit (save drafts; default) and/or publish (make versions events can use). 1–2 items · default ["edit"] |
ttl_seconds | integer | How long it works, in seconds: 60 to 43,200 (12 hours). Default an hour. 60–43200 · default 3600 |
user | string | Who it's for, like an email. up to 100 characters |
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]"}'{
"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
/v1/usageWhat 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 parameter | Type | Description |
|---|---|---|
month | string | 2027-05 (default: this month) |
curl https://www.venuery.com/v1/usage \
-u sk_test_…:{
"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
/v1/events/{id}/importBooks, 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 field | Type | Description |
|---|---|---|
reportrequired | object[] | 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_bookings | object[] | General admission bookings per order. Without them, each area's numBooked becomes one booking. up to 10000 items |
ga_bookings[].poolrequired | string | The GA area's label. up to 200 characters |
ga_bookings[].quantityrequired | integer | 1–100000 |
ga_bookings[].order_ref | string | The order (default: default_order_ref). up to 200 characters |
ga_bookings[].metadata | object | Your own key–value data, stored on each booked object. |
booked_statuses | string[] | 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_ref | string | Order reference for bookings without an orderId. up to 200 characters · default "seatsio-import" |
skip_unknown | boolean | Import what matches and ignore labels this chart doesn't have. Otherwise they're listed and nothing is imported. default false |
dry_run | boolean | Check everything and report what would happen, changing nothing. default false |
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"}]}}'{
"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": []
}