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.
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.
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.
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.
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"
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"}'
panel_id, Sephie uses the first available panel for that server.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.
Close a ticket
POST /api/v1/tickets/:id/close
Scope: tickets:write
Content-Type: application/json
{
"reason": "Resolved by external workflow"
}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.
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.