Webhooks
Receive signed ShowTix events — orders, tickets, check-ins and event changes — at your HTTPS endpoint, with signature checks, retries and examples.
For developersLast updated
On this page
- Event types
- Payload & headers
- Verifying signatures
- Retries & auto-disable
- Processing events
- Acknowledge fast
- Handle duplicates
- Don't rely on order
- Testing
- Example payloads
- order.completed
- order.refunded
- ticket.issued
- ticket.transferred
- ticket.checked_in
- event.published
- event.updated
- event.cancelled
- event.sold_out
- ticket_type.low_inventory
- waitlist.released
ShowTix POSTs a signed JSON event to your HTTPS endpoint whenever something happens — an order completes, a ticket is scanned, an event changes. Add endpoints in Developers → Webhooks (see the dashboard guide) or through the API.
Each organisation only receives events about events created under it.
Event types#
Subscribe to the types you need, or * (All events in the dashboard) for all — including types added in future. New types may be added at any time — ignore ones you don't handle.
| Type | Fires when | data.object |
|---|---|---|
order.completed | An order for one of your events is paid (or a free order is confirmed) and its tickets issued — through an API checkout session, your embed or storefront, or any other ShowTix sales channel. | order |
order.refunded | An order is fully or partly refunded. data.refunded_ticket_ids lists the tickets refunded by this change. | order |
ticket.issued | A new ticket is issued — by a purchase or as a comp. | ticket |
ticket.transferred | A ticket is transferred to someone else. Its barcode rotates. data.previous_attendee_email is who held it before. | ticket |
ticket.checked_in | A ticket is scanned in at the door — by any scanner, including the API. | ticket |
event.published | An event goes public. | event |
event.updated | A published event's details change (title, time, venue, description, image, doors, on-sale time, …). data.changed_fields lists the fields that changed. | event |
event.cancelled | An event is cancelled. | event |
event.sold_out | Every ticket for an event has sold, or the event is marked sold out. | event |
ticket_type.low_inventory | A ticket type's availability drops to its low-stock threshold — 10% of the pool's capacity, and at least 5. data.threshold is the threshold that was crossed. | ticket_type |
waitlist.released | Released tickets are offered to customers on an event's waitlist. | waitlist_release |
Live and test endpoints
Real activity is only sent to live endpoints. A test endpoint only ever receives the test events you send it yourself (see testing).
Payload & headers#
Each delivery is a POST with a UTF-8 JSON body:
{
"id": "evt_3kTq9WmZpL2vX8rNa4Hs6dQe",
"object": "event",
"type": "order.completed",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "order",
"id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"…": "…"
}
}
}| Field | Description |
|---|---|
id | Unique event id (evt_…), same as the ShowTix-Event-Id header and stable across retries. |
type | One of the event types above. |
api_version | Payload version — currently 2026-10-18. |
created | Unix timestamp (seconds) when the event happened. |
livemode | false for test events. |
organisation_id | Your organisation. |
data.object | The object the event is about, in the same shape as the API object. Some types add extra keys to data. |
| Header | Value |
|---|---|
Content-Type | application/json |
User-Agent | ShowTix-Webhooks/1.0 (+https://showtix.com.au/help/partners/webhooks) |
ShowTix-Event-Id | evt_… — deduplicate on this. |
ShowTix-Event-Type | e.g. order.completed |
ShowTix-Delivery-Attempt | 1 for the first try, incrementing on retries and resends. |
ShowTix-Signature | t=1792294800,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd |
Redirects aren't followed — register the final URL. Endpoints must use HTTPS, and URLs that resolve to private, loopback or internal addresses are refused (checked again at every delivery).
Verifying signatures#
Verify every delivery before trusting it. The ShowTix-Signature header has a timestamp t and one or more v1 signatures:
v1 = hex( HMAC_SHA256( endpoint_secret, "<t>.<raw request body>" ) )Split the header on
,and collecttand everyv1value.Build the signed payload: the timestamp, a literal
., then the raw request body exactly as received (not re-serialised JSON).Compute HMAC-SHA256 with your endpoint secret — the whole
whsec_…string — as the key, hex-encoded.Accept if any
v1matches, using a constant-time comparison.Reject if the timestamp is more than 300 seconds from your clock (replay protection — keep your server on NTP).
Secret rotation
After you rotate an endpoint's secret (Rotate secret in the dashboard), the old secret keeps signing for 24 hours: the header then carries two signatures (t=…,v1=<new>,v1=<old>). Code that accepts any matching v1 keeps working while you deploy the new secret.
import express from "express";
import crypto from "node:crypto";
const app = express();
const SECRET = process.env.SHOWTIX_WEBHOOK_SECRET; // "whsec_…" — the full string is the HMAC key
const TOLERANCE_SECONDS = 300;
function verifyShowTixSignature(rawBody, header, secret) {
if (!header) return false;
let timestamp = null;
const signatures = [];
for (const part of header.split(",")) {
const i = part.indexOf("=");
const key = part.slice(0, i).trim();
const value = part.slice(i + 1).trim();
if (key === "t") timestamp = value;
else if (key === "v1") signatures.push(value); // two v1 values during a secret rotation
}
if (!/^\d+$/.test(timestamp ?? "") || signatures.length === 0) return false;
if (Math.abs(Math.floor(Date.now() / 1000) - Number(timestamp)) > TOLERANCE_SECONDS) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.`)
.update(rawBody) // the exact bytes received — never re-serialised JSON
.digest();
return signatures.some((sig) => {
const given = Buffer.from(sig, "hex");
return given.length === expected.length && crypto.timingSafeEqual(given, expected);
});
}
// express.raw keeps the body as a Buffer so the signature can be checked.
app.post("/hooks/showtix", express.raw({ type: "application/json" }), async (req, res) => {
if (!verifyShowTixSignature(req.body, req.get("ShowTix-Signature"), SECRET)) {
return res.status(400).send("Invalid signature");
}
const event = JSON.parse(req.body.toString("utf8"));
await jobs.enqueue(event); // process asynchronously, deduplicating on event.id
res.sendStatus(200); // acknowledge within 10 seconds
});
app.listen(3001);Respond 400 to a bad signature — it will be retried, which is what you want if your secret is out of date.
Retries & auto-disable#
Respond with any 2xx within 10 seconds. Any other status, a timeout or a connection error is retried with backoff — 8 attempts over about 24 hours:
| Attempt | Sent |
|---|---|
| 1 | Immediately |
| 2 | 1 minute after attempt 1 |
| 3 | 5 minutes later |
| 4 | 30 minutes later |
| 5 | 2 hours later |
| 6 | 5 hours later |
| 7 | 8 hours later |
| 8 (final) | 8 hours later |
An endpoint is automatically disabled after 50 consecutive failed deliveries, or once it has been failing for 3 days (with at least 5 consecutive failures). Organisation owners and admins are emailed when it happens.
Re-enable it in Developers → Webhooks → your endpoint → Re-enable (or
PATCHit withenabled: true), which also resets the failure count. Resend missed deliveries from the endpoint's Deliveries list, or backfill with updated_since.Test events are delivered once and never retried.
Processing events#
Acknowledge fast#
Verify, store or enqueue the event, return 200, then do the slow work (CRM calls, emails) in a background job. Work done before responding counts against the 10-second timeout.
Handle duplicates#
A delivery can arrive more than once (a retry after a slow response, or a manual resend). Record each ShowTix-Event-Id you process and skip ones you've seen.
async function handle(event) {
// ShowTix-Event-Id (== event.id) is unique per event and identical across retries.
const firstTime = await db.processedEvents.insertIfAbsent({ id: event.id });
if (!firstTime) return; // duplicate delivery — already handled
switch (event.type) {
case "order.completed":
await crm.upsertOrder(event.data.object);
break;
case "ticket.checked_in":
await crm.markAttended(event.data.object.id);
break;
default:
// Ignore types you don't handle.
}
}Don't rely on order#
Delivery order is not guaranteed — a retried order.completed can arrive after the order.refunded for the same order. Compare the object's updated_at with what you've stored, or re-fetch the latest state from the API (e.g. GET /orders/{id}) before acting.
Testing#
Send test event on an endpoint in Developers (or POST /webhook_endpoints/{id}/test) delivers a signed sample of any type with
livemode: falseand shows the response your server returned.Writes made with a test key never fire webhooks — use test events instead.
Developing locally? Expose your server with a tunnel and register the HTTPS URL it prints, e.g.
cloudflared tunnel --url http://localhost:3001orngrok http 3001.
To exercise your verifier without ShowTix, sign a body yourself:
t=$(date +%s)
body='{"id":"evt_local_1","object":"event","type":"order.completed","livemode":false,"data":{"object":{}}}'
sig=$(printf '%s' "$t.$body" | openssl dgst -sha256 -hmac "$SHOWTIX_WEBHOOK_SECRET" | sed 's/^.* //')
curl http://localhost:3001/hooks/showtix \
-H "Content-Type: application/json" \
-H "ShowTix-Signature: t=$t,v1=$sig" \
-d "$body"Example payloads#
order.completed#
An order for one of your events is paid (or a free order is confirmed) and its tickets issued — through an API checkout session, your embed or storefront, or any other ShowTix sales channel.
{
"id": "evt_mr7bhMxDAPFNd3BfdcLwGc35",
"object": "event",
"type": "order.completed",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "order",
"id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"status": "completed",
"customer": {
"email": "alex.ng@example.com",
"first_name": "Alex",
"last_name": "Ng",
"phone": null
},
"currency": "AUD",
"subtotal": "98.00",
"total_fees": "7.90",
"discount": "0.00",
"total": "98.00",
"refunded_amount": "0.00",
"payment_method": "stripe",
"checkout_session_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"sales_channel": "api",
"channel_origin": null,
"metadata": {
"crm_contact_id": "cus_48211"
},
"tickets": [
{
"object": "ticket",
"id": 8812,
"barcode": "5e0c6f2a-91d4-4b8e-a3c1-7f20d9b4c611",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Alex",
"last_name": "Ng",
"email": "alex.ng@example.com"
},
"price": "49.00",
"status": "valid",
"comp": false,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-18T03:14:22Z"
},
{
"object": "ticket",
"id": 8813,
"barcode": "c47b1e09-2f6a-4d35-8e0b-51a9d3f7e284",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Priya",
"last_name": "Sharma",
"email": "priya.sharma@example.com"
},
"price": "49.00",
"status": "valid",
"comp": false,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-18T03:14:22Z"
}
],
"created_at": "2026-10-18T03:14:00Z",
"completed_at": "2026-10-18T03:16:41Z",
"updated_at": "2026-10-18T03:16:41Z"
}
}
}order.refunded#
An order is fully or partly refunded. data.refunded_ticket_ids lists the tickets refunded by this change.
{
"id": "evt_mr7bhMKkY4KZAVYD3H74iqgE",
"object": "event",
"type": "order.refunded",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "order",
"id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"status": "partially_refunded",
"customer": {
"email": "alex.ng@example.com",
"first_name": "Alex",
"last_name": "Ng",
"phone": null
},
"currency": "AUD",
"subtotal": "98.00",
"total_fees": "7.90",
"discount": "0.00",
"total": "98.00",
"refunded_amount": "49.00",
"payment_method": "stripe",
"checkout_session_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"sales_channel": "api",
"channel_origin": null,
"metadata": {
"crm_contact_id": "cus_48211"
},
"tickets": [
{
"object": "ticket",
"id": 8812,
"barcode": "5e0c6f2a-91d4-4b8e-a3c1-7f20d9b4c611",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Alex",
"last_name": "Ng",
"email": "alex.ng@example.com"
},
"price": "49.00",
"status": "refunded",
"comp": false,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-18T03:14:22Z"
},
{
"object": "ticket",
"id": 8813,
"barcode": "c47b1e09-2f6a-4d35-8e0b-51a9d3f7e284",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Priya",
"last_name": "Sharma",
"email": "priya.sharma@example.com"
},
"price": "49.00",
"status": "valid",
"comp": false,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-18T03:14:22Z"
}
],
"created_at": "2026-10-18T03:14:00Z",
"completed_at": "2026-10-18T03:16:41Z",
"updated_at": "2026-10-20T01:05:00Z"
},
"refunded_ticket_ids": [
8812
]
}
}ticket.issued#
A new ticket is issued — by a purchase or as a comp.
{
"id": "evt_5NIcj6GSNDu4WTkOVLrcjXwq",
"object": "event",
"type": "ticket.issued",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "ticket",
"id": 8920,
"barcode": "5e0c6f2a-91d4-4b8e-a3c1-7f20d9b4c611",
"order_id": null,
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Sam",
"last_name": "Guest",
"email": "sam.guest@example.com"
},
"price": "0.00",
"status": "valid",
"comp": true,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-18T03:14:22Z"
}
}
}ticket.transferred#
A ticket is transferred to someone else. Its barcode rotates. data.previous_attendee_email is who held it before.
{
"id": "evt_5NIcj6GzZhVnbZ1sTQY6PHIN",
"object": "event",
"type": "ticket.transferred",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "ticket",
"id": 8812,
"barcode": "a81f3c56-0e2d-47b9-9d14-6c0b2e7f5a93",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Jordan",
"last_name": "Lee",
"email": "jordan.lee@example.com"
},
"price": "49.00",
"status": "valid",
"comp": false,
"seat_label": null,
"checked_in_at": null,
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-10-28T10:12:00Z"
},
"previous_attendee_email": "alex.ng@example.com"
}
}ticket.checked_in#
A ticket is scanned in at the door — by any scanner, including the API.
{
"id": "evt_5NIcj6GusAJLi30Wal8u1lNW",
"object": "event",
"type": "ticket.checked_in",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "ticket",
"id": 8812,
"barcode": "5e0c6f2a-91d4-4b8e-a3c1-7f20d9b4c611",
"order_id": "f3a9c2d1-7b4e-4e0a-8c56-1d2e3f4a5b6c",
"event_id": 123,
"ticket_type_id": 55,
"ticket_type_name": "Early Bird",
"pool_id": 31,
"attendee": {
"first_name": "Alex",
"last_name": "Ng",
"email": "alex.ng@example.com"
},
"price": "49.00",
"status": "checked_in",
"comp": false,
"seat_label": null,
"checked_in_at": "2026-11-02T08:47:12Z",
"created_at": "2026-10-18T03:14:22Z",
"updated_at": "2026-11-02T08:47:12Z"
}
}
}event.published#
An event goes public.
{
"id": "evt_Chet9MK8URKIYo26IyEbPIlC",
"object": "event",
"type": "event.published",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "event",
"id": 123,
"slug": "late-night-cabaret-melbourne",
"title": "Late Night Cabaret",
"summary": "Songs, sketches and sequins — a late-night variety bill in Richmond.",
"description": "Late Night Cabaret returns to the Corner Hotel for one night only. 18+. Doors 7pm.",
"status": "published",
"starts_at": "2026-11-02T09:00:00Z",
"ends_at": "2026-11-02T13:00:00Z",
"timezone": "Australia/Melbourne",
"doors": "7:00pm",
"url": "https://showtix.com.au/shows/late-night-cabaret-melbourne",
"image_url": "https://showtix.com.au/uploads/events/123/feature.jpg",
"sold_out": false,
"on_sale_at": null,
"venue": {
"object": "venue",
"id": 9,
"name": "Corner Hotel",
"slug": "corner-hotel",
"address": {
"line1": "57 Swan St",
"line2": null,
"locality": "Richmond",
"state": "VIC",
"postal_code": "3121",
"country": "AU",
"formatted": "57 Swan St, Richmond VIC 3121"
},
"lat": -37.8253,
"lng": 144.9932,
"url": "https://cornerhotel.com",
"phone": null
},
"ticketing": {
"currency": "AUD",
"min_price": "49.00",
"max_price": "89.00",
"tickets_remaining": 412
},
"categories": [
"cabaret",
"comedy"
],
"created_at": "2026-09-14T02:31:07Z",
"updated_at": "2026-10-17T23:12:45Z"
}
}
}event.updated#
A published event's details change (title, time, venue, description, image, doors, on-sale time, …). data.changed_fields lists the fields that changed.
{
"id": "evt_Chet9M3I4W0KuYSAw3tb9oju",
"object": "event",
"type": "event.updated",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "event",
"id": 123,
"slug": "late-night-cabaret-melbourne",
"title": "Late Night Cabaret",
"summary": "Songs, sketches and sequins — a late-night variety bill in Richmond.",
"description": "Late Night Cabaret returns to the Corner Hotel for one night only. 18+. Doors 7pm.",
"status": "published",
"starts_at": "2026-11-02T09:30:00Z",
"ends_at": "2026-11-02T13:00:00Z",
"timezone": "Australia/Melbourne",
"doors": "7:30pm",
"url": "https://showtix.com.au/shows/late-night-cabaret-melbourne",
"image_url": "https://showtix.com.au/uploads/events/123/feature.jpg",
"sold_out": false,
"on_sale_at": null,
"venue": {
"object": "venue",
"id": 9,
"name": "Corner Hotel",
"slug": "corner-hotel",
"address": {
"line1": "57 Swan St",
"line2": null,
"locality": "Richmond",
"state": "VIC",
"postal_code": "3121",
"country": "AU",
"formatted": "57 Swan St, Richmond VIC 3121"
},
"lat": -37.8253,
"lng": 144.9932,
"url": "https://cornerhotel.com",
"phone": null
},
"ticketing": {
"currency": "AUD",
"min_price": "49.00",
"max_price": "89.00",
"tickets_remaining": 412
},
"categories": [
"cabaret",
"comedy"
],
"created_at": "2026-09-14T02:31:07Z",
"updated_at": "2026-10-17T23:12:45Z"
},
"changed_fields": [
"starts_at",
"doors"
]
}
}event.cancelled#
An event is cancelled.
{
"id": "evt_Chet9MhvjbIRTTTtfjxS4cJW",
"object": "event",
"type": "event.cancelled",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "event",
"id": 123,
"slug": "late-night-cabaret-melbourne",
"title": "Late Night Cabaret",
"summary": "Songs, sketches and sequins — a late-night variety bill in Richmond.",
"description": "Late Night Cabaret returns to the Corner Hotel for one night only. 18+. Doors 7pm.",
"status": "cancelled",
"starts_at": "2026-11-02T09:00:00Z",
"ends_at": "2026-11-02T13:00:00Z",
"timezone": "Australia/Melbourne",
"doors": "7:00pm",
"url": "https://showtix.com.au/shows/late-night-cabaret-melbourne",
"image_url": "https://showtix.com.au/uploads/events/123/feature.jpg",
"sold_out": false,
"on_sale_at": null,
"venue": {
"object": "venue",
"id": 9,
"name": "Corner Hotel",
"slug": "corner-hotel",
"address": {
"line1": "57 Swan St",
"line2": null,
"locality": "Richmond",
"state": "VIC",
"postal_code": "3121",
"country": "AU",
"formatted": "57 Swan St, Richmond VIC 3121"
},
"lat": -37.8253,
"lng": 144.9932,
"url": "https://cornerhotel.com",
"phone": null
},
"ticketing": {
"currency": "AUD",
"min_price": "49.00",
"max_price": "89.00",
"tickets_remaining": 412
},
"categories": [
"cabaret",
"comedy"
],
"created_at": "2026-09-14T02:31:07Z",
"updated_at": "2026-10-17T23:12:45Z"
}
}
}event.sold_out#
Every ticket for an event has sold, or the event is marked sold out.
{
"id": "evt_Chet9MZnz0R3Oj4JCJBuHl1e",
"object": "event",
"type": "event.sold_out",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "event",
"id": 123,
"slug": "late-night-cabaret-melbourne",
"title": "Late Night Cabaret",
"summary": "Songs, sketches and sequins — a late-night variety bill in Richmond.",
"description": "Late Night Cabaret returns to the Corner Hotel for one night only. 18+. Doors 7pm.",
"status": "published",
"starts_at": "2026-11-02T09:00:00Z",
"ends_at": "2026-11-02T13:00:00Z",
"timezone": "Australia/Melbourne",
"doors": "7:00pm",
"url": "https://showtix.com.au/shows/late-night-cabaret-melbourne",
"image_url": "https://showtix.com.au/uploads/events/123/feature.jpg",
"sold_out": true,
"on_sale_at": null,
"venue": {
"object": "venue",
"id": 9,
"name": "Corner Hotel",
"slug": "corner-hotel",
"address": {
"line1": "57 Swan St",
"line2": null,
"locality": "Richmond",
"state": "VIC",
"postal_code": "3121",
"country": "AU",
"formatted": "57 Swan St, Richmond VIC 3121"
},
"lat": -37.8253,
"lng": 144.9932,
"url": "https://cornerhotel.com",
"phone": null
},
"ticketing": {
"currency": "AUD",
"min_price": "49.00",
"max_price": "89.00",
"tickets_remaining": 0
},
"categories": [
"cabaret",
"comedy"
],
"created_at": "2026-09-14T02:31:07Z",
"updated_at": "2026-10-17T23:12:45Z"
}
}
}ticket_type.low_inventory#
A ticket type's availability drops to its low-stock threshold — 10% of the pool's capacity, and at least 5. data.threshold is the threshold that was crossed.
{
"id": "evt_5NIcj6tYhU3aWGLpKvlPv2Nm",
"object": "event",
"type": "ticket_type.low_inventory",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "ticket_type",
"id": 55,
"pool_id": 31,
"pool_name": "General Admission",
"event_id": 123,
"name": "Early Bird",
"description": null,
"price": "49.00",
"booking_fee": "3.95",
"currency": "AUD",
"fees_included": true,
"gst_applies": true,
"min_per_order": 1,
"max_per_order": 10,
"status": "on_sale",
"sale_starts_at": null,
"sale_ends_at": "2026-10-25T13:00:00Z",
"available": 20,
"capacity": 500,
"seated": false
},
"threshold": 20
}
}waitlist.released#
Released tickets are offered to customers on an event's waitlist.
{
"id": "evt_qc92g2Fy4Z0rWOPldRMOyFg0",
"object": "event",
"type": "waitlist.released",
"api_version": "2026-10-18",
"created": 1792294800,
"livemode": true,
"organisation_id": 12,
"data": {
"object": {
"object": "waitlist_release",
"event_id": 123,
"pool_id": 31,
"released_count": 3
}
}
}Was this article helpful?