Using the Equaticket Public API
In this article
Using the Equaticket Public API
5 min read · Integrations & API
Using the Equaticket Public API
The Public API lets your own systems create and publish events, read orders and attendees, and manage webhook endpoints. Every plan includes API access, with separate live and test keys.
Get an API key
Owners and admins manage keys at Dashboard > Settings > Developer > API Keys.
- The first time, click Accept API Terms. This is a one-time step for your organization.
- Click Create API key.
- Enter a Key name, tick the scopes you need, and choose a Mode:
sk_live_(live data) orsk_test_(test data only). - Copy the key. It is shown only once.
You can have up to 10 active keys. Scopes cannot be changed later: create a new key instead. To revoke a key, click Revoke on its row. Recent Activity on the same page shows who created or revoked keys, and when.
Never put a live key in client-side code or a public repository.
Authentication and base URL
Send the key as a Bearer token on every request. All endpoints are under https://equaticket.com/api/v1/.
curl https://equaticket.com/api/v1/events \
-H "Authorization: Bearer sk_live_..."
Scopes
| Scope | Allows |
|---|---|
events:read | List and get events and ticket types |
events:write | Create, update, publish and cancel events |
ticket_types:write | Create, update and delete ticket types |
orders:read | List and get orders |
attendees:read | List attendees (tickets) |
webhooks:read | List webhook endpoints and their delivery history |
webhooks:write | Create, update and delete webhook endpoints |
Test mode
Test keys (sk_test_...) only see test data, which is kept apart from your live data. Your first test key comes with sample data. To start over, click Reset test data on the API Keys page. Webhook endpoints created with a test key only receive test events.
Rate limits
Limits apply per API key, per minute:
| Plan | Requests per minute |
|---|---|
| Free | 60 |
| Starter | 100 |
| Growth | 300 |
| Pro | 600 |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit you get 429 with the code rate_limited and a Retry-After header (in seconds).
Pagination
List endpoints return newest first and use a cursor:
GET /api/v1/orders?limit=50
GET /api/v1/orders?limit=50&cursor=NEXT_CURSOR
{
"livemode": true,
"data": [],
"has_more": true,
"next_cursor": "..."
}
Stop when has_more is false.
Idempotency
POST requests accept an optional Idempotency-Key header (up to 256 characters; a UUID works well). Retrying with the same key and body within 24 hours returns the original response with Idempotent-Replayed: true, so a retry after a timeout never creates a duplicate.
Request IDs
Every response has an X-Request-Id header. Include it when you contact support about an API call.
Errors
Errors look like this:
{
"error": {
"code": "validation_error",
"message": "Human-readable description",
"request_id": "req_...",
"param": "starts_at",
"doc_url": "https://equaticket.com/ticketing-api/errors#validation_error"
}
}
Branch on error.code, never on error.message. Common codes:
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_json | The body is not valid JSON |
| 400 | invalid_param / missing_param | A query parameter is malformed or missing (error.param names it) |
| 401 | missing_auth | No Authorization: Bearer header |
| 401 | invalid_api_key | The key is malformed or unknown |
| 401 | key_revoked | The key has been revoked |
| 403 | insufficient_scope | The key lacks the scope (error.required names it) |
| 404 | not_found | Not found, or not in your organization |
| 409 | duplicate_slug | An event with that slug already exists |
| 409 | event_not_editable | The event is cancelled, completed or archived |
| 422 | validation_error | The body failed validation |
| 422 | missing_venue_contact | Publish blocked: no venue_contact_email |
| 422 | unsupported_currency | Publish blocked: your Stripe account does not support the currency |
| 429 | rate_limited | Too many requests |
| 500 | insert_failed / query_error / update_failed | Server error, safe to retry |
The full error reference lists every code.
Common workflows
Create and publish an event
# 1. Create the event
curl -X POST https://equaticket.com/api/v1/events \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Spring Workshop",
"slug": "spring-workshop-2026",
"timezone": "America/Chicago",
"starts_at": "2026-11-15T18:00:00Z",
"currency": "usd",
"venue_contact_email": "hello@example.com"
}'
# 2. Add a ticket type
curl -X POST https://equaticket.com/api/v1/events/EVENT_ID/ticket-types \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "name": "General Admission", "price": 2500, "currency": "usd", "quantity_total": 100 }'
# 3. Publish
curl -X POST https://equaticket.com/api/v1/events/EVENT_ID/publish \
-H "Authorization: Bearer sk_live_..."
venue_contact_email is required to publish. It is shown to attendees and is the reply-to address on their ticket emails. To publish paid events, your Stripe account must be connected and must support the event's currency.
Read orders and attendees
GET /api/v1/orders
GET /api/v1/orders?status=confirmed
GET /api/v1/orders?buyer_email=jane@example.com
GET /api/v1/events/EVENT_ID/orders
GET /api/v1/attendees
GET /api/v1/events/EVENT_ID/attendees?checked_in=true
Public event listing (no key needed)
GET /api/v1/public/events?org_slug=YOUR_ORG_SLUG
Returns your published public events, so you can build an events page without exposing a key.
Webhooks
To get notified instead of polling, set up Outbound Webhooks. They are available on every plan, from the dashboard or through /api/v1/webhooks with the webhooks:write scope.
Still need help? Contact support and include the X-Request-Id.
Still need help?
If this article didn't answer your question, our support team is here.
Contact Support