Helpdesk API & SDK The helpdesk you build on, not around.
Tickets, customers, transactional email and a hosted help centre behind one REST API and a typed TypeScript SDK, with webhooks out and a widget for your site. Sandbox keys run the whole flow without emailing anyone.
Through Nov 30: 30% off Starter or Growth for 3 months with code SHIP30 at checkout.
import { HelmdeskClient } from '@helmdesk/sdk'
const helmdesk = new HelmdeskClient({ apiKey: process.env.HELMDESK_API_KEY! })
// A support form in your app becomes a ticket
const ticket = await helmdesk.tickets.create({
subject: 'Cannot export to CSV',
body: 'The export button spins forever.',
customerEmail: user.email,
customerName: user.name,
})npm install @helmdesk/sdk
# a key per app, sandbox while you build
HELMDESK_API_KEY=sk_sandbox_…Day one
Three calls, and your app has support.
No glue code between a helpdesk, an email provider and a docs site: the same key and the same typed client do all three.
Send a transactional email
Templates live in Helmdesk, rendered with your layout and sent through your own provider. Every send lands in the email log with its delivery status.
await helmdesk.emails.send({
templateKey: 'welcome',
to: { email: user.email, name: user.name },
variables: { name: user.name },
})Keep the customer directory in sync
Tag customers from your own billing events. Replacing one namespace converges on every webhook without reading the old value.
await helmdesk.customers.setTags(customer.id, ['premium'], {
namespace: 'plan',
})Embed the help centre and widget
One tag. The widget answers from your knowledge base first and files a ticket only when it cannot. Signed-in users skip the email field.
<script
src="https://helmdesk.dev/widget.js"
data-project="ledgerly">
</script>What the API covers
Every part of the desk, one base URL.
https://helmdesk.dev/api/v1, Bearer-token auth, JSON in and out, one error envelope. Every object says which project it belongs to.
- Tickets
Create, list, update, reply, internal notes, tags, bulk updates
POST /v1/tickets
- Customers
Directory with your own external id, tags and full history
GET /v1/customers/:id
- Email
Template and one-off sends, scheduling, the email log, suppressions
POST /v1/emails/send
- Knowledge base
Articles, categories and search behind the hosted help centre
GET /v1/articles/search
- Feedback
Feedback requests and rated conversations
POST /v1/feedback/requests
- Logs
Ship app errors; read them back grouped into issues
POST /v1/logs
Webhooks out
Subscribe an endpoint per project to the events you care about. Each delivery is signed with HMAC-SHA256 in the X-Helmdesk-Signature header.
- ticket.created
- ticket.resolved
- message.received
- feedback.submitted
- email.bounced
- customer.created
- customer.updated
REST API reference · SDK reference · Webhooks · openapi.json
Built to be trusted with production
Keys, sandbox and webhooks that behave.
Keys you can bound
Keys belong to the account and reach all projects or the ones you pick. Scope each to what it needs (tickets:write, emails:send, logs:write…) and lock it to IP ranges.
A sandbox that captures
An sk_sandbox_ key writes to a separate data plane: emails are rendered and captured in the log, never delivered. A live key can switch one request to sandbox with a header.
Webhooks out
Signed with HMAC-SHA256 in the X-Helmdesk-Signature header, with a test delivery and a delivery log for each endpoint. Optional Slack formatting.
Keys
One key for your agent, one per app.
An all-projects key for your coding agent, a one-project key inside each app, each with its own scopes. Revoke one and the others keep working.
sk_live_ · sk_sandbox_ · scopes · IP allowlists

Sandbox
Test the signup email without sending it.
In sandbox, every send renders and lands in the email log as Captured. Nothing reaches a real inbox, and sandbox sends do not count against your email quota.
Helmdesk-Environment: sandbox

Help centre
A hosted help centre per app.
Articles are Markdown, written in the dashboard, through the API or by your coding agent. Each app gets its own searchable help centre and support page, and the widget answers from the same articles.
helmdesk.dev/p/ledgerly/articles

Pricing
Priced by apps and tickets, not by people.
Free for your first app. Starter $39/mo for 3 apps, unlimited seats.
The API, the SDK and the widget are on every plan, Free included.
Annual billing saves 20%. No per-seat fees on paid plans, no per-resolution AI fees.
Through Nov 30: 30% off Starter or Growth for 3 months with code SHIP30 at checkout.
- Free1 app$0
- Starter3 apps$39/mo
- Growth10 apps$149/mo
- Enterprise: more apps and volume, quoted. Talk to us
FAQ
Building on the Helmdesk API
Is there an OpenAPI spec?
Yes. The full OpenAPI 3.1 spec is at helmdesk.dev/openapi.json, with a sample response for every resource. The build fails if a route ships without being documented in it.
Where does the SDK run?
Node.js 18 and later, Deno, Bun and Cloudflare Workers. It is typed end to end and published on npm as @helmdesk/sdk.
What are the rate limits?
100 requests per minute per API key. Batch endpoints take up to 100 emails or 100 log events in one request.
Can I try it without emailing real customers?
Yes. Use an sk_sandbox_ key, or send Helmdesk-Environment: sandbox with a live key. Sandbox emails are captured in the email log instead of delivered, and sandbox tickets never notify anyone.
Which plans include the API and webhooks?
The REST API, SDK and widget work on every plan, Free included. Webhooks and the batch email endpoint are on Starter and above.
Your support stack, one npm install away.
Free for your first app. Starter $39/mo for 3 apps, unlimited seats. No card.

