Authentication and API keys
Authenticate to the ShowTix Partner API with organisation-scoped bearer keys — scopes, live and test keys, IP allowlists, rolling and revoking.
For developersLast updated
On this page
Every request is authenticated with an API key sent as a bearer token. Keys belong to one organisation: responses only ever contain that organisation's data — the events created under it, and their orders, attendees and check-ins — even when someone organises events for several organisations.
curl https://api.showtix-nonprod.link/events \
-H "Authorization: Bearer stx_live_..."API keys#
Organisation owners and admins create keys in Developers → API keys → Create key (step-by-step in the dashboard guide). A key looks like stx_live_ or stx_test_ followed by 32 base62 characters. The full secret is shown once, at creation; afterwards the dashboard shows only its prefix and last four characters (e.g. stx_live_Ab3dE9x…k2Pq).
ShowTix can also issue a key for your organisation on request — it appears in your list with an Issued by ShowTix badge and works the same way.
Check which key you're using — its organisation, mode and scopes — with GET /.
| Status | Error | Meaning |
|---|---|---|
| 401 | missing_api_key | No Authorization: Bearer header was sent. |
| 401 | invalid_api_key | The key is malformed or doesn't exist. |
| 401 | api_key_revoked | The key was revoked in the dashboard. |
| 401 | api_key_expired | The key was rolled and its grace period has ended. |
| 403 | insufficient_scope | The key is valid but lacks the scope this endpoint needs. |
{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid API key provided.",
"param": null,
"request_id": "F7xq2LmN8vRt",
"doc_url": "https://showtix.com.au/help/partners/api-reference#errors"
}
}Scopes#
Give each key only the scopes its integration needs — the dashboard calls them Permissions. Every key needs at least one. A request to an endpoint outside the key's scopes fails with 403 insufficient_scope.
| Scope | Grants | Endpoints |
|---|---|---|
events:read | Read events, ticket types (live availability and pricing) and venues. | GET /events, GET /events/{id}, GET /events/{id}/ticket_types, GET /venues, GET /venues/{id} |
orders:read | Read orders, tickets and checkout sessions. | GET /orders, GET /orders/{id}, GET /tickets/{id}, GET /checkout_sessions/{id} |
orders:write | Create checkout sessions (holds) and issue comp tickets. | POST /checkout_sessions, POST /comp_tickets |
attendees:read | Read attendee lists (and individual tickets). | GET /events/{id}/attendees, GET /tickets/{id} |
check_in:write | Check tickets in at the door. | POST /events/{id}/check_ins |
webhooks:manage | Manage webhook endpoints through the API. | GET/POST /webhook_endpoints, GET/PATCH/DELETE /webhook_endpoints/{id}, POST /webhook_endpoints/{id}/test |
GET / (key info) works with any valid key, and GET /openapi.json needs no key at all.
Live and test keys#
You choose the mode when you create a key; it can't be changed later.
stx_live_ | stx_test_ | |
|---|---|---|
| Reads | Your organisation's real data. | Your organisation's real data (read-only, safe). |
| Writes | Real holds, real orders, real comp tickets, real check-ins. | Validated in full — auth, scopes, availability, purchase limits, pricing — but a dry run: nothing is held, issued or checked in. |
livemode | true | false |
dry_run (writes) | false | true |
| Webhooks | Fired for real activity. | Never fired by test-key writes. Use Send test event in the dashboard or POST /webhook_endpoints/{id}/test for sample payloads. |
| Default rate limit | 120 requests / minute | 60 requests / minute |
A test checkout session
Test keys return "id": null and a checkout_url pointing at the public event page — so you can build and test the whole redirect flow without holding inventory.
Keeping keys secret#
Call the API from your server only. Keep keys in environment variables or a secrets manager — never in source control, mobile app bundles or front-end code.
Browser requests are blocked: requests made from a web page fail with
403 browser_request_blocked, so a key can't be used from front-end code even by mistake. To sell tickets inside a web page, use the embeddable checkout, which needs no key.Use separate keys per integration and environment so you can revoke one without touching the others.
Think a key has leaked? Revoke it immediately and email support@showtix.com.au.
IP allowlists#
Optionally restrict a key to the addresses your servers call from. In the key's IP allowlist field, add individual IPs (203.0.113.10) or CIDR ranges (10.0.0.0/8), separated by commas, when creating or editing the key. An empty list allows any address. Requests from anywhere else fail with 403 ip_not_allowed — even with a valid key.
{
"error": {
"type": "permission_error",
"code": "ip_not_allowed",
"message": "Requests from 198.51.100.7 are not allowed for this API key.",
"param": null,
"request_id": "F7xq2LmN8vRt",
"doc_url": "https://showtix.com.au/help/partners/api-reference#errors"
}
}Rotation & revocation#
Rolling a key#
Roll key replaces a key without downtime. You get a new secret immediately (same name, mode, permissions and allowlist), and the old key keeps working for the grace period you pick under Old key expires: Now, 1 hour, 24 hours (default), 3 days or 7 days (the API accepts 0–168 hours). During the grace period the old key shows as Expiring; afterwards it shows Expired and returns 401 api_key_expired. Choosing Now revokes the old key straight away, so it returns 401 api_key_revoked.
Open Developers → API keys, open the key's actions menu and choose Roll key, then copy the new secret.
Deploy the new secret to every server that uses it.
Confirm traffic has moved: the old key's Last used time in Developers stops advancing.
Revoking a key#
Revoke takes effect immediately — the next request with that key fails with 401 api_key_revoked. Revocation can't be undone; create a new key instead. Rotate keys whenever someone with access to them leaves your team.
Was this article helpful?