Help Center Developer & API Using the TikitDesk API

Using the TikitDesk API

Using the TikitDesk API

*Create and list tickets from your own scripts or another tool β€” for developers and technically comfortable admins.*

Quick answerGenerate a key under Settings β†’ API Access, then send it as Authorization: Bearer <key> to POST /api/tickets (create) or GET /api/tickets (list). Everything below is one endpoint, plain JSON, no SDK required.

What you'll learn

  • How to generate and manage an API key
  • How to create a ticket via the API
  • How to list your tickets via the API
  • Rate limits, error responses, and common mistakes

Prerequisites

  • An Admin account (API keys are Admin-only)
  • Something that can make an HTTPS request β€” curl, Postman, a script, a Zapier/Make webhook step, anything

Step 1 β€” Generate a key

Go to Settings β†’ API Access and click Generate New Key.

Your key is shown once, in full. Copy it somewhere safe immediately β€” TikitDesk stores only a hash of it, the same way it stores passwords, so if you close the dialog without copying it, there is no way to retrieve it again. Generate a new one instead; the old row will still show its last 4 characters in the list so you can tell keys apart.

Treat this key like a password. Anyone who has it can create and read tickets in your workspace. If a key is ever exposed (committed to a public repo, pasted somewhere it shouldn't be), click Revoke next to it immediately β€” revoking takes effect instantly and cannot be undone.

Step 2 β€” Create a ticket

`

POST /api/tickets

Authorization: Bearer tk_your_key_here

Content-Type: application/json

{

"title": "Customer can't reset password",

"description": "They click the reset link and get a blank page.",

"priority": "High",

"client_email": "customer@example.com",

"client_name": "Jordan Lee"

}

`

Fields:

FieldRequiredNotes
titleYesUp to 200 characters
descriptionYes
priorityNoLow, Medium, High, or Urgent. Anything else (or omitted) defaults to Low
client_emailNoMust be a valid email address or it's ignored
client_nameNoUp to 150 characters
departmentNoMust match an existing department name exactly. If omitted or not recognized, your first configured department is used instead
categoryNoSame rule as department
typeNoSame rule as department
projectNoSame rule as department

A form-encoded POST body works exactly the same as JSON β€” use whichever your tool makes easier.

Response (success, HTTP 200):

`json

{ "status": "success", "ticket_no": 142, "message": "Ticket #T-142 created." }

`

New tickets always start in the Open status and Unassigned, exactly like a ticket created by a teammate in the app β€” pick them up from the board like any other.

Step 3 β€” List tickets

`

GET /api/tickets?limit=25&offset=0

Authorization: Bearer tk_your_key_here

`

Query parameters (all optional):

ParameterDefaultNotes
limit25Maximum 100
offset0For paging through results
statusβ€”Exact status name, e.g. Open or Close

Response (HTTP 200):

`json

{

"status": "success",

"count": 2,

"tickets": [

{

"ticket_no": 142,

"title": "Customer can't reset password",

"description": "They click the reset link and get a blank page.",

"status": "Open",

"department": "Support",

"assigned_to": "Unassigned",

"priority": "High",

"client_email": "customer@example.com",

"client_name": "Jordan Lee",

"created_at": "2026-08-20 11:42:00",

"resolved_at": null

}

]

}

`

Rate limits

60 requests per minute per key. Going over it returns HTTP 429 with a plain error message β€” back off and retry after a few seconds. If your integration legitimately needs more (e.g. a bulk import), space requests out rather than firing them all at once.

Errors

Every error comes back as JSON with a message you can log or show directly:

HTTP codeMeaning
401Missing or invalid key β€” check the Authorization: Bearer header is present and the key hasn't been revoked
403Your plan's monthly ticket limit has been reached
422title or description was missing or empty
429Rate limit exceeded (see above)
405Wrong HTTP method β€” this endpoint only accepts GET and POST
500Something went wrong on our end β€” safe to retry once; contact support if it keeps happening

Good to know

  • Works from browser JS too: this endpoint sends the CORS headers needed to call it directly from client-side JavaScript (a fetch() in your own website, a no-code tool's custom-code step, this article's own examples) β€” not just from a server or curl.
  • One endpoint today: /api/tickets. It does not yet cover comments, attachments, or status updates β€” only creating and listing tickets.
  • Your data only: a key can only ever see and create tickets for your own company. There's no way to access another workspace's data with a key, no matter what you pass in.
  • No SDKs yet: it's plain HTTPS + JSON, so any language's standard HTTP client works. A Node/Python example:

`bash

curl -X POST https://tikitdesk.com/api/tickets \

-H "Authorization: Bearer tk_your_key_here" \

-H "Content-Type: application/json" \

-d '{"title":"Test ticket","description":"Just testing the API"}'

`

Was this article helpful?
We're sorry this wasn't helpful. What went wrong?
Thanks for the feedback!