Skip to content

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

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.

TypeFires whendata.object
order.completedAn 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.refundedAn order is fully or partly refunded. data.refunded_ticket_ids lists the tickets refunded by this change.order
ticket.issuedA new ticket is issued — by a purchase or as a comp.ticket
ticket.transferredA ticket is transferred to someone else. Its barcode rotates. data.previous_attendee_email is who held it before.ticket
ticket.checked_inA ticket is scanned in at the door — by any scanner, including the API.ticket
event.publishedAn event goes public.event
event.updatedA published event's details change (title, time, venue, description, image, doors, on-sale time, …). data.changed_fields lists the fields that changed.event
event.cancelledAn event is cancelled.event
event.sold_outEvery ticket for an event has sold, or the event is marked sold out.event
ticket_type.low_inventoryA 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.releasedReleased 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:

Request 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",
      "…": "…"
    }
  }
}
FieldDescription
idUnique event id (evt_…), same as the ShowTix-Event-Id header and stable across retries.
typeOne of the event types above.
api_versionPayload version — currently 2026-10-18.
createdUnix timestamp (seconds) when the event happened.
livemodefalse for test events.
organisation_idYour organisation.
data.objectThe object the event is about, in the same shape as the API object. Some types add extra keys to data.
HeaderValue
Content-Typeapplication/json
User-AgentShowTix-Webhooks/1.0 (+https://showtix.com.au/help/partners/webhooks)
ShowTix-Event-Idevt_… — deduplicate on this.
ShowTix-Event-Typee.g. order.completed
ShowTix-Delivery-Attempt1 for the first try, incrementing on retries and resends.
ShowTix-Signaturet=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:

text
v1 = hex( HMAC_SHA256( endpoint_secret, "<t>.<raw request body>" ) )
  1. Split the header on , and collect t and every v1 value.

  2. Build the signed payload: the timestamp, a literal ., then the raw request body exactly as received (not re-serialised JSON).

  3. Compute HMAC-SHA256 with your endpoint secret — the whole whsec_… string — as the key, hex-encoded.

  4. Accept if any v1 matches, using a constant-time comparison.

  5. 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:

AttemptSent
1Immediately
21 minute after attempt 1
35 minutes later
430 minutes later
52 hours later
65 hours later
78 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 PATCH it with enabled: 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.

js
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: false and 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:3001 or ngrok http 3001.

To exercise your verifier without ShowTix, sign a body yourself:

bash
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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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.

json
{
  "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?