Everything you'd expect from a modern AI platform — OpenAPI 3.1 spec, signed webhooks, idiomatic SDKs in 4 languages, and a sandbox that's free to use.
Whether you're stitching Embott into an existing product or building a custom integration on top, you only need to know three primitives.
Fully documented OpenAPI 3.1 spec. Send messages, manage bots, query conversations, push leads. Token-auth, predictable JSON. Rate limited 600 req/min by default.
Reference →14 event types. HMAC-SHA256 signed payloads. Auto-retry with exponential backoff up to 24h. View deliveries and replay in the dashboard.
Subscribe →Official clients for JavaScript/TypeScript, Python, PHP, and Ruby. Each wraps the REST API + webhook signature verification. Maintained in lockstep with the API.
Install →Base URL: https://api.embott.com/v1. All requests require Authorization: Bearer <your_api_key>.
# Send a message to an Embott conversation curl https://api.embott.com/v1/conversations/conv_abc123/messages \ -H "Authorization: Bearer $EMBOTT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "user", "content": "Do you ship internationally?" }'
import { Embott } from "embott"; const client = new Embott({ apiKey: process.env.EMBOTT_API_KEY }); const reply = await client.conversations.sendMessage({ conversationId: "conv_abc123", role: "user", content: "Do you ship internationally?", }); console.log(reply.message.content);
from embott import Embott client = Embott(api_key=os.environ["EMBOTT_API_KEY"]) reply = client.conversations.send_message( conversation_id="conv_abc123", role="user", content="Do you ship internationally?", ) print(reply.message.content)
<?php use Embott\Client; $client = new Client(getenv('EMBOTT_API_KEY')); $reply = $client->conversations->sendMessage([ 'conversation_id' => 'conv_abc123', 'role' => 'user', 'content' => 'Do you ship internationally?', ]); echo $reply->message->content;
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /v1/bots | List all bots in your account |
| POST | /v1/bots | Create a new bot |
| GET | /v1/bots/:id | Get bot details + config |
| PUT | /v1/bots/:id | Update bot config or persona |
| GET | /v1/conversations | List conversations, filter by bot/date/status |
| GET | /v1/conversations/:id | Full transcript with metadata |
| POST | /v1/conversations/:id/messages | Send a message to a conversation |
| POST | /v1/conversations/:id/handoff | Escalate to a human + notify team |
| GET | /v1/leads | Captured leads with attribution |
| POST | /v1/leads/:id/export | Push to CRM (HubSpot, Salesforce…) |
| GET | /v1/products | Synced product catalog |
| POST | /v1/products/sync | Trigger an immediate re-crawl |
| GET | /v1/analytics/overview | Aggregated KPIs by date range |
| POST | /v1/webhooks | Subscribe to events |
| DEL | /v1/webhooks/:id | Unsubscribe |
Subscribe once, get notified on every important event. Payloads are JSON, signed with HMAC-SHA256 using your endpoint secret. Embott auto-retries failed deliveries 9 times over 24 hours.
conversation.startedA new visitor opened a chat session.
conversation.endedSession closed by visitor or auto-timeout.
message.createdAny new message — visitor, bot, or agent.
lead.capturedVisitor shared contact info (name/email/phone).
lead.qualifiedBot marked the lead as a hot prospect.
handoff.requestedVisitor or bot asked for a human agent.
handoff.acceptedAn agent claimed the handoff.
order.attributedOrder linked to a chat (Shopify/Woo).
cart.recoveredBot recovered an abandoned cart.
booking.createdBot booked a meeting via Calendly/Cal.com.
integration.connectedA new integration was authorized.
integration.disconnectedAn integration revoked or expired.
bot.deployedBot configuration published to production.
bot.errorBot hit a fatal error in a conversation.
import crypto from "node:crypto"; function verify(rawBody, header, secret) { const [t, sig] = header.split(",").map(p => p.split("=")[1]); const expected = crypto.createHmac("sha256", secret) .update(`${t}.${rawBody}`) .digest("hex"); return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig)); }
Type-safe, idiomatic, and maintained in lockstep with the REST API. Each SDK ships with retry, pagination, and webhook signature helpers built in.
Two-tier credentials. Public test keys (pk_test_*) for sandbox. Secret live keys (sk_live_*) for production. Rotate any time without redeploying.
| Scope | Granted by | Use case |
|---|---|---|
bots:read | Default on all keys | List + inspect bot configs |
bots:write | Workspace admin | Create, update, deploy bots |
conversations:read | Default | Read transcripts and metadata |
conversations:write | Workspace admin | Send messages, trigger handoffs |
leads:read | Default | Query captured leads |
leads:export | Workspace admin | Push leads to CRMs |
webhooks:manage | Workspace admin | Subscribe and unsubscribe |
Get a sandbox key, hit the API, ship to your customers. Free up to 1,000 calls/day forever.
Get an API key Talk to a dev