Free API · Unlimited calls · Fair use

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

MethodPathKeyWhat it does
POST/v1/ticketspublic or secretCreate a ticket
GET/v1/ticketssecretList a site's tickets (filter by status, email, phone, date)
GET/v1/tickets/:tokenpublicStatus and messages, to show on your site
POST/v1/tickets/:token/messagespublicAdd 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.

Rate limits (per minute)
New tickets per website30
New tickets per visitor (IP)10
Read requests per key120
AI features per workspace1,000 / month

Your first ticket in under 5 minutes.

Get your free API key