A ticket API you never get billed for.
Send tickets from any form, app, checkout or chatbot. Read their status. Get a signed webhook the moment something changes. No API add-on, no per-call pricing, no plan to upgrade.
POST /v1/tickets
→ 201 Created
{
"number": "MT-1043",
"status": "open",
"public_token": "t_9fK2…",
"category": "order_issue",
"priority": "high",
"link": "https://app.multiticket.io/t/t_9fK2…"
}
What you get, free
Unlimited API calls
No monthly call quota and no per-call fee. Fair-use rate limits only.
Unlimited websites & keys
Every site gets a public key for browsers and a secret key for servers.
Signed webhooks
HMAC-SHA256 signatures, 5 automatic retries, and a delivery log.
AI on every ticket
Spam check, category and priority come back in the API response.
Drop-in widget
Under 20 KB, no framework, with built-in bot protection.
Clear errors
One error shape everywhere: a stable code you can branch on, and a readable message.
Quickstart in 3 steps
1. Get your keys
Sign up, add a website, and copy its pk_ (public) and sk_ (secret) keys. The secret key is shown once.
MT_PUBLIC_KEY=pk_live_… # safe in the browser
MT_SECRET_KEY=sk_live_… # server only
2. Create a ticket
From your server with the secret key, or from the browser with the public key (only from your own domain).
curl -X POST https://api.multiticket.io/v1/tickets \
-H "Authorization: Bearer $MT_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Priya",
"email": "priya@example.com",
"phone": "+919800000000",
"subject": "Order not delivered",
"order_number": "58213",
"message": "Ordered Monday, not here yet."
}'
3. Listen for changes
Add a webhook URL for your site. Verify the signature, then update your own page — for example, show "Closed" on the customer's order.
// Node.js
const sig = req.get('X-MultiTicket-Signature');
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.MT_WEBHOOK_SECRET)
.update(rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)))
return res.sendStatus(401);
// event: ticket.created | ticket.replied | ticket.closed
Endpoints
| Method | Path | Key | What it does |
|---|---|---|---|
POST | /v1/tickets | public or secret | Create a ticket |
GET | /v1/tickets | secret | List a site's tickets (filter by status, email, phone, date) |
GET | /v1/tickets/:token | public | Status and messages, to show on your site |
POST | /v1/tickets/:token/messages | public | Add a customer reply from your site |
Unlimited, with fair use
"Unlimited" means we never count your calls against a quota or bill you for them. Per-minute limits exist only to stop bots and runaway scripts from slowing the service for everyone. Normal websites never hit them.
If you go over, you get a 429 with a Retry-After header — never a bill. Need more for a real use case? Tell us and we'll raise it.
| New tickets per website | 30 |
|---|---|
| New tickets per visitor (IP) | 10 |
| Read requests per key | 120 |
| AI features per workspace | 1,000 / month |