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-login | Account and workspace (plan, status) |
| GET | /api/v1/billing/status | Plan limits and this month's usage |
| GET | /api/v1/websites | Websites 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}/recrawl | Queue a re-crawl |
| GET | /api/v1/websites/{id}/sources | Knowledge sources |
| POST | /api/v1/websites/{id}/sources | Add 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-chat | Ask the assistant (counts as one AI reply) |
| GET | /api/v1/inbox/conversations?status=needs_human | Inbox, newest first; statuses open, needs_human, resolved, unresolved, all |
| GET | /api/v1/inbox/conversations/{id} | Transcript, contact, tickets |
| POST | /api/v1/inbox/conversations/{id}/reply | Reply 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}/ticket | Turn a conversation into a ticket |
| GET | /api/v1/tickets?status=open_pending | Tickets; POST creates one |
| PATCH | /api/v1/tickets/{id} | Status, priority, subject, description, assignee |
| POST | /api/v1/tickets/{id}/notes | Internal note |
| GET | /api/v1/analytics?days=30 | Totals, daily series, unanswered and most-asked questions |
| GET | /api/v1/team | Members; POST /invite adds one |
| GET | /api/v1/webhooks | Endpoints; 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.