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/v1Authentication
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.
| Prefix | Behaviour |
|---|---|
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:
{
"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.
| Method | Path | Scope | Description |
|---|---|---|---|
| POST | /tickets | tickets:write | Create a ticket |
| GET | /tickets | tickets:read | List tickets (paginated, filterable) |
| GET | /tickets/:id | tickets:read | Get a ticket with its messages and tags |
| PATCH | /tickets/:id | tickets:write | Update status, priority, category, or assignee |
| POST | /tickets/:id/messages | tickets:write | Post a staff reply (emails the customer) |
| POST | /tickets/:id/tags | tickets:write | Add a tag |
| DELETE | /tickets/:id/tags | tickets:write | Remove a tag |
| GET | /members | tickets:read | List account members — the valid assignee targets |
Customers
The directory builds itself from every interaction; externalId links a customer to your own app.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /customers | customers:read | List customers (paginated, searchable) |
| POST | /customers | customers:write | Create a customer |
| GET | /customers/:id | customers:read | Get a customer with ticket and feedback history |
| PATCH | /customers/:id | customers:write | Update a customer (email is immutable) |
| DELETE | /customers/:id | customers:write | Delete a customer (their tickets are untouched) |
Emails
Transactional sending and the Handlebars template system.
| Method | Path | Scope | Description |
|---|---|---|---|
| POST | /emails/send | emails:send | Send one email, immediately or scheduled |
| POST | /emails/batch | emails:send | Send up to 100 emails in one request (Pro+) |
| POST | /emails/preview | emails:send | Render a template without sending |
| GET | /email-templates | emails:send | List template keys — project and @account/ shared |
| GET | /email-templates/:key/schema | emails:manage | Variables a template expects |
| POST | /email-templates/import | emails:manage | Import a .hbs template, layout, or partial |
| POST | /account/email-templates/import | emails:manage | Import into the shared account scope |
Articles
Knowledge base content.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /articles/search | articles:read | Search published articles |
| POST | /articles | articles:write | Create an article |
| GET | /articles/:id | articles:read | Get an article |
| PATCH | /articles/:id | articles:write | Update or publish an article |
| GET | /article-categories | articles:read | List categories |
Feedback
Ratings and sentiment, kept separate from tickets. Requires Pro or higher.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /feedback/conversations | feedback:read | List feedback conversations |
| POST | /feedback/conversations | feedback:write | Open a conversation |
| GET | /feedback/conversations/:id | feedback:read | Get a conversation with its messages |
| PATCH | /feedback/conversations/:id | feedback:write | Close or reopen a conversation |
| POST | /feedback/conversations/:id/messages | feedback:write | Reply (emails the customer a thread link) |
| GET | /feedback/requests | feedback:read | List feedback requests |
| POST | /feedback/requests | feedback:write | Send a feedback request |
| GET | /feedback/requests/:id | feedback:read | Get a request and its funnel status |
Logs
Ship application logs; they are fingerprinted and grouped into error issues.
| Method | Path | Scope | Description |
|---|---|---|---|
| POST | /logs | logs:write | Ingest up to 100 log events |
| GET | /logs | logs:read | List raw log events |
| GET | /log-issues | logs:read | List grouped error issues |
Webhooks
The signing secret is returned once, on create.
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /webhooks | webhooks:manage | List endpoints |
| POST | /webhooks | webhooks:manage | Register an endpoint |
| DELETE | /webhooks/:id | webhooks:manage | Delete 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.jsonUse it to generate a client in any language, import into Postman or Insomnia, or point an agent at it.