Skip to main content
Documentation

Endpoints

The full, always-current list of endpoints lives in the interactive explorer and the OpenAPI spec. This page covers the conventions every endpoint shares.

Response envelope

Successful responses wrap their result in data:

{ "data": { "id": "...", "ticketNumber": 42 } }

List endpoints add cursor pagination:

{
  "data": [ /* ... */ ],
  "pagination": { "nextCursor": "eyJ...", "hasMore": true, "limit": 50 }
}

Pagination

List endpoints are cursor-based. Pass ?limit= (1-100, default 50) and, to fetch the next page, ?cursor= with the previous response's nextCursor. When hasMore is false, nextCursor is null.

Errors

Errors share a consistent shape and use standard HTTP status codes:

{ "error": { "code": "forbidden", "message": "Missing required scope(s): tickets:write" } }
Status Code Meaning
400 validation_error Bad request body or query parameter
401 unauthorized Missing or invalid token
403 forbidden Missing scope or wrong token type
404 not_found Resource not found
409 conflict Duplicate, or related records still exist
429 rate_limited Rate limit exceeded
503 bot_unavailable A Discord-affecting action could not reach the bot

Scopes

Each token carries scopes. Read endpoints need a :read scope; writes need :write. Examples: tickets:read, tickets:write, categories:write, transcripts:read, analytics:read, webhooks:write. Organization tokens also use org:servers:read, org:members:read, org:analytics:read, and org:transcripts:read for the aggregate endpoints.

See Authentication for how to create tokens and assign scopes.

Rate limits

Requests are rate limited per token. Every response includes:

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1780000000

When you exceed the limit you get a 429 with a Retry-After header. Limits scale with plan tier.

Idempotency

POST /v1/tickets accepts an Idempotency-Key header. Retrying with the same key within 24 hours returns the original result instead of creating a duplicate.