Skip to content

REST API

Standard HTTP, JSON in and out, one Bearer token. This page covers the conventions that apply everywhere; the resource pages have request and response examples for each endpoint.

Base URL

https://helmdesk.dev/api/v1

Authentication

Every request carries a project API key as a Bearer token. Keys are created from Dashboard → Project → API Keys.

curl https://helmdesk.dev/api/v1/tickets \
  -H "Authorization: Bearer sk_live_abc123..."

The key identifies the project, so no endpoint takes a project id. A missing or invalid key returns 401. See Authentication for key management and IP allowlists.

Environments

The key prefix selects the data plane. There is no environment parameter — the credential is the environment, so a sandbox key cannot reach live data even by id.

PrefixBehaviour
sk_live_Live data. Emails are really sent. Counts against plan quotas.
sk_sandbox_Sandbox data. Emails are captured, never delivered. Quota-exempt and excluded from analytics.

Scopes

Each key carries a scope list; the tables below name the scope every endpoint needs. A key created with an empty scope list has full access, which keeps older keys working. Calling an endpoint without its scope returns 403 auth.forbidden naming the scope you are missing.

Pagination

List endpoints take page and limit query parameters and return the rows under a named key alongside the page state:

GET /tickets?page=1&limit=50
{
  "tickets": [ /* … */ ],
  "total": 137,
  "page": 1,
  "limit": 50
}

The array key matches the resource — tickets, customers, logs, issues, and so on. Article search is the one exception: it returns { results, query, count } and is not paginated.

Rate limits

100 requests per minute per API key. Over that returns 429 rate_limit.exceeded. Plan quotas (emails, log events, storage) are separate and surface as 403 with a message naming the limit.

Errors

{
  "error": {
    "code": "auth.forbidden",
    "message": "This API key lacks the required scope: \"emails:manage\"."
  }
}

Every failure uses this shape. See Error Handling for the full code list.

Endpoints

Tickets

The core helpdesk resource.

MethodPathScopeDescription
POST/ticketstickets:writeCreate a ticket
GET/ticketstickets:readList tickets (paginated, filterable)
GET/tickets/:idtickets:readGet a ticket with its messages and tags
PATCH/tickets/:idtickets:writeUpdate status, priority, category, or assignee
POST/tickets/:id/messagestickets:writePost a staff reply (emails the customer)
POST/tickets/:id/tagstickets:writeAdd a tag
DELETE/tickets/:id/tagstickets:writeRemove a tag
GET/memberstickets:readList account members — the valid assignee targets

Customers

The directory builds itself from every interaction; externalId links a customer to your own app.

MethodPathScopeDescription
GET/customerscustomers:readList customers (paginated, searchable)
POST/customerscustomers:writeCreate a customer
GET/customers/:idcustomers:readGet a customer with ticket and feedback history
PATCH/customers/:idcustomers:writeUpdate a customer (email is immutable)
DELETE/customers/:idcustomers:writeDelete a customer (their tickets are untouched)

Emails

Transactional sending and the Handlebars template system.

MethodPathScopeDescription
POST/emails/sendemails:sendSend one email, immediately or scheduled
POST/emails/batchemails:sendSend up to 100 emails in one request (Pro+)
POST/emails/previewemails:sendRender a template without sending
GET/email-templatesemails:sendList template keys — project and @account/ shared
GET/email-templates/:key/schemaemails:manageVariables a template expects
POST/email-templates/importemails:manageImport a .hbs template, layout, or partial
POST/account/email-templates/importemails:manageImport into the shared account scope

Articles

Knowledge base content.

MethodPathScopeDescription
GET/articles/searcharticles:readSearch published articles
POST/articlesarticles:writeCreate an article
GET/articles/:idarticles:readGet an article
PATCH/articles/:idarticles:writeUpdate or publish an article
GET/article-categoriesarticles:readList categories

Feedback

Ratings and sentiment, kept separate from tickets. Requires Pro or higher.

MethodPathScopeDescription
GET/feedback/conversationsfeedback:readList feedback conversations
POST/feedback/conversationsfeedback:writeOpen a conversation
GET/feedback/conversations/:idfeedback:readGet a conversation with its messages
PATCH/feedback/conversations/:idfeedback:writeClose or reopen a conversation
POST/feedback/conversations/:id/messagesfeedback:writeReply (emails the customer a thread link)
GET/feedback/requestsfeedback:readList feedback requests
POST/feedback/requestsfeedback:writeSend a feedback request
GET/feedback/requests/:idfeedback:readGet a request and its funnel status

Logs

Ship application logs; they are fingerprinted and grouped into error issues.

MethodPathScopeDescription
POST/logslogs:writeIngest up to 100 log events
GET/logslogs:readList raw log events
GET/log-issueslogs:readList grouped error issues

Webhooks

The signing secret is returned once, on create.

MethodPathScopeDescription
GET/webhookswebhooks:manageList endpoints
POST/webhookswebhooks:manageRegister an endpoint
DELETE/webhooks/:idwebhooks:manageDelete an endpoint

AI endpoints are not part of the public API

The /api/v1/ai/* routes back the dashboard and the support widget. They authenticate with a signed-in session, not an API key, and are not covered by the OpenAPI spec. To drive Helmdesk from an AI assistant, use the MCP server.

OpenAPI specification

The full OpenAPI 3.1 spec — every endpoint, schema, and sample response on this site — is at:

https://helmdesk.dev/openapi.json

Use it to generate a client in any language, import into Postman or Insomnia, or point an agent at it.