Skip to content

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.

Start freeRead the API docsFree for your first app. No card.

Through Nov 30: 30% off Starter or Growth for 3 months with code SHIP30 at checkout.

app/support.ts
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,
})
terminal
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.

signup.ts
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.

stripe-webhook.ts
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.

app/layout.tsx
<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

helmdesk.dev/settings/api-keys
API keys settings: a Claude Code key reaching all projects and a Ledgerly app key with four scopes

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

helmdesk.dev/projects/ledgerly/email-logs
The Ledgerly email log in sandbox mode: welcome and password-reset emails marked Captured under a banner saying nothing reaches customers

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

helmdesk.dev/p/ledgerly/articles
The Ledgerly help centre: a search box, category filters and a list of 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.