Docs · API

REST API and webhooks

The same endpoints the dashboard uses, with an API key instead of a browser session. Growth and Scale plans.

Authentication

Create a key in Dashboard → API & webhooks and send it as a bearer token. A key acts on the workspace it was created in and nothing else. Responses are JSON with a success boolean; errors carry an error code (plan_limit, authenticate, invalid_url, …) and a human message.

curl https://api.supportlime.com/api/v1/websites \
  -H "Authorization: Bearer sl_live_…"

Endpoints

GET/api/v1/security/check-loginAccount and workspace (plan, status)
GET/api/v1/billing/statusPlan limits and this month's usage
GET/api/v1/websitesWebsites with usage; POST creates one (plan website limit applies)
GET/api/v1/websites/{id}One website, its settings and latest crawl
PATCH/api/v1/websites/{id}Name, status, allowed domains, widget settings
POST/api/v1/websites/{id}/recrawlQueue a re-crawl
GET/api/v1/websites/{id}/sourcesKnowledge sources
POST/api/v1/websites/{id}/sourcesAdd text, Q&A, a page URL or an uploaded file
DELETE/api/v1/websites/{id}/sources/{sourceId}Remove a source and its chunks
POST/api/v1/websites/{id}/test-chatAsk the assistant (counts as one AI reply)
GET/api/v1/inbox/conversations?status=needs_humanInbox, newest first; statuses open, needs_human, resolved, unresolved, all
GET/api/v1/inbox/conversations/{id}Transcript, contact, tickets
POST/api/v1/inbox/conversations/{id}/replyReply as your team; pauses the assistant in that thread
POST/api/v1/inbox/conversations/{id}/status{"status": "open" | "needs_human" | "resolved"}
POST/api/v1/inbox/conversations/{id}/ticketTurn a conversation into a ticket
GET/api/v1/tickets?status=open_pendingTickets; POST creates one
PATCH/api/v1/tickets/{id}Status, priority, subject, description, assignee
POST/api/v1/tickets/{id}/notesInternal note
GET/api/v1/analytics?days=30Totals, daily series, unanswered and most-asked questions
GET/api/v1/teamMembers; POST /invite adds one
GET/api/v1/webhooksEndpoints; POST creates one, PATCH/DELETE /{id}, POST /{id}/test

Ids are the publicId values returned by list endpoints. Lists are paginated with ?page=. Rate limits mirror the dashboard; a 429 carries Retry-After.

Examples

Reply to a visitor who is waiting for a human:

curl -X POST https://api.supportlime.com/api/v1/inbox/conversations/CONVERSATION_ID/reply \
  -H "Authorization: Bearer sl_live_…" \
  -H "Content-Type: application/json" \
  -d '{"content":"Thanks for waiting. Yes, we ship to Canada: free over $50."}'

Teach the assistant an exact answer:

curl -X POST https://api.supportlime.com/api/v1/websites/WEBSITE_ID/sources \
  -H "Authorization: Bearer sl_live_…" \
  -H "Content-Type: application/json" \
  -d '{"type":"qa","question":"Do you ship to Canada?","answer":"Yes. Free shipping over $50, delivery in 3-5 days."}'

Webhooks

Add an https endpoint in Dashboard → API & webhooks and pick the events you want: conversation.needs_human, conversation.resolved, contact.captured, ticket.created, message.agent_reply. Deliveries are retried three times; after 20 consecutive failures the endpoint disables itself and the dashboard shows the last error. Use the Test button to send a signed ping.

POST https://example.com/hooks/supportlime
X-SupportLime-Event: conversation.needs_human
X-SupportLime-Signature: sha256=<hex HMAC-SHA256 of the raw body, keyed with the endpoint secret>

{
  "event": "conversation.needs_human",
  "workspace": "01a1…",
  "occurredAt": "2026-10-27T20:41:12+00:00",
  "data": { "conversation": { "publicId": "…", "status": "needs_human", "contact": { "email": "jane@acme.com" }, "metadata": { "pageUrl": "https://acme.com/pricing" } } }
}

Verify the signature before trusting a delivery:

// Node
import { createHmac, timingSafeEqual } from 'node:crypto';
const expected = 'sha256=' + createHmac('sha256', SECRET).update(rawBody).digest('hex');
const ok = timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-supportlime-signature']));

MCP

The same key authenticates the MCP server, which exposes these endpoints as tools for Claude, ChatGPT, Cursor and other agents.

Frequently asked questions

Is there a sandbox?
Use a second website in your workspace, or the Free plan on a separate account, for testing. Test chat replies count against the allowance of the workspace the key belongs to.
Can a key be read-only?
Not yet. Keep keys per integration and revoke them individually; scopes are on the roadmap.
What are the rate limits?
The same per-workspace limits as the dashboard. Webhook deliveries time out after 10 seconds; respond with any 2xx quickly and do the work asynchronously.

Build on SupportLime

Growth includes API keys, webhooks and the MCP server, with 5 websites and 6,000 AI replies a month.

Feedback? Need help?