Sephie developer API

Build around your support workflow.

The Sephie REST API is available over HTTPS for server-to-server integrations. API keys are scoped to one Discord server and only receive the permissions you select.

01 · Access

Create an API key

Open Dashboard → Developer for the Discord server you want to integrate. Choose New key, name it and select scopes.

Available scopes

tickets:read allows reading tickets. tickets:write allows opening tickets, sending ticket messages and closing tickets.

The raw key is shown once. Sephie stores only a hash for later verification. You can also set an expiry date, a per-minute request limit and an exact-IP allowlist. Revoke a key from the dashboard if it is ever exposed.
02 · Authentication

Send the key as a Bearer token

Authorization: Bearer sephie_your_key_here

Base URL:

https://sephie.net/api/v1

These endpoints are authenticated API endpoints. They are internet-accessible through Sephie's HTTPS service, but they are not anonymous public data.

03 · Tickets

List tickets

GET /api/v1/tickets
Scope: tickets:read
curl https://sephie.net/api/v1/tickets \
  -H "Authorization: Bearer sephie_your_key_here"

Returns tickets for the Discord server that owns the key. Use ?limit= to request 1–200 rows; the default is 100.

04 · Ticket detail

Get one ticket

GET /api/v1/tickets/:id
Scope: tickets:read
curl https://sephie.net/api/v1/tickets/42 \
  -H "Authorization: Bearer sephie_your_key_here"
05 · Create

Open a ticket from another system

POST /api/v1/tickets
Scope: tickets:write
Content-Type: application/json

{
  "user_id": "123456789012345678",
  "panel_id": "optional-panel-uuid",
  "subject": "Website order issue",
  "description": "Created from our website contact flow",
  "form_answers": {
    "order": "ORD-1042"
  }
}
curl -X POST https://sephie.net/api/v1/tickets \
  -H "Authorization: Bearer sephie_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"user_id":"123456789012345678","subject":"Website order issue"}'
The Discord user must exist and Sephie must be available in the Discord server associated with the API key. If you omit panel_id, Sephie uses the first available panel for that server.
06 · Reply

Send a message into a ticket

POST /api/v1/tickets/:id/message
Scope: tickets:write
Content-Type: application/json

{
  "content": "Your order has been checked."
}

The message is sent into the Discord ticket and stored as a Sephie API staff message.

07 · Close

Close a ticket

POST /api/v1/tickets/:id/close
Scope: tickets:write
Content-Type: application/json

{
  "reason": "Resolved by external workflow"
}
08 · Events

Signed outbound webhooks

Create webhooks from Dashboard → Developer. Choose which supported events your endpoint should receive.

Signature

When a webhook has a secret, Sephie signs the request with HMAC-SHA256 in x-sephie-signature-v2 over timestamp + "." + raw_body, with the Unix timestamp in x-sephie-timestamp. The legacy x-sephie-signature header is also sent for compatibility. Reject stale timestamps and verify the v2 signature before trusting the payload.

Keep endpoints safe

Only configure destinations you control. Your receiving endpoint should use HTTPS, validate the signature, reject unexpected payloads and be safe to retry.

09 · Errors

Common API responses

401 api_key_required   Missing Bearer API key
401 invalid_api_key    Unknown or revoked key
403 missing_scope      Key does not have the required scope
400 panel_required     No usable ticket panel was found
400 user_not_found     Discord user could not be resolved
404 not_found          Ticket was not found for this key's server
503 guild_unavailable  Sephie is not currently connected to the server

API requests are rate-limited. Use normal retry/backoff behavior for transient errors rather than hammering the endpoint.