Developers

REST API v1

JSON over HTTPS. Create an API key under Settings, API and webhooks.

Authentication

Authorization: Bearer sdk_your_key_here

Base URL: https://squawkdesk.app/api/v1. Keys carry scopes: tickets:read, tickets:write, contacts:read, contacts:write. Errors return {"error": "message"} with a 4xx or 5xx status.

Tickets

MethodPathNotes
GET/ticketsQuery: status (comma list), priority, assignee_id, group_id, requester_email, tag, updated_since (ISO), search, page, per_page (max 200).
GET/tickets/:numberNumber or UUID. Returns ticket, requester, messages, attachments.
POST/ticketsBody: subject, requester_email, body_html or body_text, requester_name, priority, type, group_id, assignee_id, mailbox_id, cc[], tags[], custom_fields{}.
PATCH/tickets/:numberAny of subject, status, priority, type, assignee_id, group_id, tags, custom_fields, due_at, requester_email.
POST/tickets/:number/repliesBody: body_html or body_text, kind (reply or note), agent_email (attribute to an agent), status (set after reply).
DELETE/tickets/:numberMoves to trash.
curl -X POST https://squawkdesk.app/api/v1/tickets \
  -H "Authorization: Bearer sdk_xxx" -H "Content-Type: application/json" \
  -d '{"subject":"Server down","requester_email":"[email protected]","body_text":"Primary DC is unreachable","priority":"urgent","tags":["monitoring"]}'

Statuses: open, pending, on_hold, resolved, closed. Priorities: low, normal, high, urgent.

Contacts and companies

MethodPathNotes
GET/contactsQuery: email, search, page, per_page.
GET/contacts/:id
POST/contactsBody: email (required), name, phone, company_id, custom_fields. Upserts by email.
GET/companies
POST/companiesBody: name (required), domains[], custom_fields. Upserts by name.

Reference

GET/meTenant and key scopes.
GET/agents
GET/groups
GET/articlesPublished articles. Query: search.

Webhooks

Configure endpoints under Settings. Each delivery is a POST with headers X-SquawkDesk-Event and X-SquawkDesk-Signature (hex HMAC-SHA256 of the raw body using the endpoint secret). Respond 2xx within 10 seconds. Failed deliveries retry with backoff for up to 8 attempts.

Events: ticket.created, ticket.updated (includes changes), ticket.replied (includes message), ticket.resolved, ticket.sla_breached, and automation.* from the "fire webhook" action.

{"event":"ticket.created","at":"2026-10-16T18:20:11.000Z","ticket":{"id":"...","number":1042,"subject":"Server down","status":"open","priority":"urgent", ...}}

Verifying a signature (Node)

const sig = crypto.createHmac('sha256', SECRET).update(rawBody).digest('hex');
if (sig !== req.get('x-squawkdesk-signature')) return res.status(401).end();

Inbound email relay

If you run your own mail relay, you can POST raw RFC 822 messages for forwarding-type mailboxes to /inbound/mail with header X-Inbound-Token. This endpoint is for platform operators; customers should use Microsoft 365, Google, IMAP or forwarding instead.