# ThinnestAI > One AI agent that answers on your website, WhatsApp and Telegram — and remembers the same customer across all of them. - [Introduction](https://docs.thinnest.ai/introduction.md): One agent, answering on your website, WhatsApp and Telegram — from your own material. - [Quickstart](https://docs.thinnest.ai/quickstart.md): An agent answering on your website, from your own pages, in about ten minutes. - [How the pieces fit](https://docs.thinnest.ai/concepts.md): Workspace, agent, channel, contact — and which one owns what. - [Regions](https://docs.thinnest.ai/workspace/regions.md): Which site to sign up on, what you pay in, and what differs between the two. - [Knowledge](https://docs.thinnest.ai/agent/knowledge.md): What the agent answers from, and what it will refuse to guess at. - [Behaviour](https://docs.thinnest.ai/agent/behaviour.md): Tone, language, opening line, model and when to fetch a human. - [Leads and contacts](https://docs.thinnest.ai/agent/leads.md): Ending the conversation with somebody to call, not just a closed ticket. - [Actions](https://docs.thinnest.ai/agent/actions.md): Letting the agent do things, not only say them — safely. - [After the call](https://docs.thinnest.ai/agent/after-the-call.md): Send the caller a WhatsApp or an SMS when a call ends — a thank-you, a booking link, a sorry-we-missed-you. - [Calendar](https://docs.thinnest.ai/agent/calendar.md): Your agent reads your real availability and books meetings into your Cal.com. - [Spreadsheet](https://docs.thinnest.ai/agent/spreadsheet.md): Your agent writes what it learns into your spreadsheet while it is still talking, and can look things up in it. - [Call your own API](https://docs.thinnest.ai/agent/custom-api.md): Give the agent one narrow endpoint of yours, and every rule that keeps it safe. - [Escalation](https://docs.thinnest.ai/agent/escalation.md): How the agent hands a conversation to a person — including when an action fails. - [Channels overview](https://docs.thinnest.ai/channels/overview.md): Where customers talk to your agent, and what each channel can carry. - [Website widget](https://docs.thinnest.ai/channels/website.md): The chat window on your own pages. - [WhatsApp](https://docs.thinnest.ai/channels/whatsapp.md): The same agent, answering on WhatsApp — plus what Meta's rules mean for you. - [Connect External Agent/CRM](https://docs.thinnest.ai/whatsapp/external-agents.md): Answer WhatsApp customers from your own CRM or agent platform. ThinnestAI runs the WhatsApp side — the number, the inbox, templates and opt-outs. - [SMS](https://docs.thinnest.ai/channels/sms.md): Let your agent text customers in India — through your own SMS provider, under your own DLT sender ID. - [Telegram](https://docs.thinnest.ai/channels/telegram.md): The quickest channel to connect — no approvals, no templates, no waiting. - [Voice](https://docs.thinnest.ai/channels/voice.md): Your agent answers the phone — with the same memory of each customer it has everywhere else. - [Voice Clone](https://docs.thinnest.ai/channels/voice-clone.md): Record a short sample and your agent can speak in that voice — a founder's own, or someone from your team. - [Calling campaigns](https://docs.thinnest.ai/channels/voice-campaigns.md): Your agent rings a list and has the conversation itself. - [Calling rules by country (US TCPA, UK PECR, India TRAI)](https://docs.thinnest.ai/channels/calling-rules.md): What ThinnestAI does for you when your agent calls people, and what the law in the US, the UK and India leaves to you. - [Phone numbers](https://docs.thinnest.ai/channels/phone-numbers.md): Get a number your customers ring, or point one you already own at your agent. - [Shopify](https://docs.thinnest.ai/install/shopify.md): A theme app embed — no code, no paste, and no theme edits to undo. - [WordPress and WooCommerce](https://docs.thinnest.ai/install/wordpress.md): One file, three steps, and signed-in customers recognised. - [PrestaShop](https://docs.thinnest.ai/install/prestashop.md): A proper module — survives a theme change, and signs your customers. - [Wix, Squarespace, Webflow and anything else](https://docs.thinnest.ai/install/other-platforms.md): The script tag, where it goes on each platform, and which ones can recognise a customer. - [Recognise signed-in customers](https://docs.thinnest.ai/install/signed-in-customers.md): Four lines on your server, and a logged-in customer stops being a stranger. - [Website & app agent](https://docs.thinnest.ai/agent/website-and-app-agent.md): Let your agent see the screen your customer is on, fill it in, point at the right button and step in when they get stuck. - [Find leads](https://docs.thinnest.ai/agent/find-leads.md): Describe the businesses you want. Your agent finds them and brings back their phone numbers and emails. - [Templates](https://docs.thinnest.ai/whatsapp/templates.md): The only thing that reaches a customer outside the 24-hour window. - [One-time codes](https://docs.thinnest.ai/whatsapp/one-time-codes.md): OTP over WhatsApp — Meta writes the message, you choose how it behaves. - [Send a message](https://docs.thinnest.ai/whatsapp/send.md): One approved template, to a handful of numbers, without building a campaign. - [Broadcasts](https://docs.thinnest.ai/whatsapp/broadcasts.md): One approved template, to everybody who agreed to hear from you. - [Sequences](https://docs.thinnest.ai/whatsapp/sequences.md): A series of messages triggered by something that happened, not by a date. - [Your products in the chat](https://docs.thinnest.ai/whatsapp/products.md): The agent can show what you sell, with your real prices and pictures, without the customer leaving WhatsApp. - [When a message isn't delivered](https://docs.thinnest.ai/whatsapp/not-delivered.md): What WhatsApp said, what it means, and what to do about it. - [Adding a payment method in Meta](https://docs.thinnest.ai/whatsapp/payment-method.md): Why Meta blocks your number for a payment method, where to add a card, which cards work, and what happens next. - [WhatsApp calls](https://docs.thinnest.ai/whatsapp/calls.md): Customers call your business from WhatsApp, and your agent answers. - [Meta's rules, in one place](https://docs.thinnest.ai/meta/overview.md): What WhatsApp allows, who decides it, and which limits are ours versus Meta's. - [Windows and what gets charged](https://docs.thinnest.ai/meta/windows-and-pricing.md): The 24-hour window, the 72-hour free entry point, and why answering costs far less than starting. - [Template review and approval](https://docs.thinnest.ai/meta/template-review.md): How Meta reviews a template, why they get rejected, and how to fix each cause. - [Quality ratings and messaging limits](https://docs.thinnest.ai/meta/quality-and-limits.md): How many people you can reach, how to reach more, and how to lose the ability. - [Business verification](https://docs.thinnest.ai/meta/verification.md): What it unlocks, what it costs you in time, and what stays locked without it. - [Inbox](https://docs.thinnest.ai/workspace/inbox.md): Every conversation, and how a person takes one over. - [Helpdesk](https://docs.thinnest.ai/workspace/helpdesk.md): Escalations as tickets in Zendesk or Salesforce, with replies coming back. - [Analytics](https://docs.thinnest.ai/workspace/analytics.md): Whether the agent did its job — every figure a count you could verify yourself. - [Usage](https://docs.thinnest.ai/workspace/usage.md): What your agents did, what it cost, and every call you can open and listen to. - [Your data: erasure and training](https://docs.thinnest.ai/workspace/data-and-erasure.md): What is deleted when you erase a contact, what is kept on purpose, and when recordings may be used to improve our models. - [Notifications](https://docs.thinnest.ai/workspace/notifications.md): Be told when a call comes in, without logging in — in the console, and by email from your own Resend. - [White label](https://docs.thinnest.ai/white-label/overview.md): Sell AI voice and WhatsApp agents to your clients as your own product — your name, your logo, your domain, your prices. - [Clients](https://docs.thinnest.ai/white-label/clients.md): Create a workspace for each client, see each client's plan and balance, and fund them by hand if you bill them yourself. - [Brand and domains](https://docs.thinnest.ai/white-label/brand-and-domains.md): Put your name, logo and colour on everything, serve it from your own domain, and bring your own sign-in check and email sender. - [Your prices](https://docs.thinnest.ai/white-label/prices.md): Set your own prices on top of ours, get paid into your own payment account, and keep the difference. - [Partner referrals](https://docs.thinnest.ai/partners/referrals.md): Refer a business to ThinnestAI, and earn a share of what they spend on voice and on subscriptions. - [Guides](https://docs.thinnest.ai/guides/overview.md): Worked, end-to-end tutorials — real code, and the mistakes marked. - [Cut the "I don't know" answers](https://docs.thinnest.ai/guides/reduce-i-dont-know.md): A weekly loop using the gaps report — the highest-return half hour in the product. - [Serve customers in their own language](https://docs.thinnest.ai/guides/multilingual.md): One knowledge base, 37 languages — and how templates differ from chat. - [Make your agent sound right on the phone](https://docs.thinnest.ai/guides/how-your-agent-sounds.md): Why a reply that reads well can sound wrong, and the handful of changes that fix it. - [Take bookings over the phone](https://docs.thinnest.ai/guides/phone-bookings.md): A clinic line that answers, gathers four details and reads them back — built in about twenty minutes. - [Turn a calling list into a filled spreadsheet](https://docs.thinnest.ai/guides/calls-into-a-spreadsheet.md): Ring a list of leads and get their answers back in the rows you started with, with a line about each call. - [Create a survey agent](https://docs.thinnest.ai/guides/survey-agent.md): Ask the same questions of a thousand people and get answers you can count, not a thousand transcripts. - [Text the caller: WhatsApp and SMS from a call](https://docs.thinnest.ai/guides/text-the-caller.md): Two worked examples — an insurance line that sends a renewal link on WhatsApp, and a loan line that sends a documents list by SMS — during the call and after it. - [Call leads from your CRM](https://docs.thinnest.ai/guides/leads-from-your-crm.md): A lead lands in your CRM, your agent rings them within minutes, and the summary, their answers and the recording go back to the same record. - [Answer "where is my order?"](https://docs.thinnest.ai/guides/order-status.md): A worked example: your API, one action, and an agent that stops saying it doesn't know. - [Recognise signed-in customers on a Next.js site](https://docs.thinnest.ai/guides/nextjs-identity.md): A complete, copy-able implementation — server component, App Router, no secret in the browser. - [Send your first broadcast](https://docs.thinnest.ai/guides/first-campaign.md): Start to finish, with the mistakes that cost real money marked. - [Recover abandoned carts](https://docs.thinnest.ai/guides/abandoned-cart.md): An event from your shop, a two-step sequence, and messages that stop when the customer buys. - [Build your own product on the API](https://docs.thinnest.ai/guides/build-a-platform.md): Give each of your customers their own agents, numbers and conversations — from your dashboard, with one key. - [MCP server](https://docs.thinnest.ai/mcp/overview.md): Run your workspace from Claude Code, Cursor or VS Code — build agents, connect your systems, read conversations, build dashboards. - [Connect your assistant](https://docs.thinnest.ai/mcp/connect.md): Add the ThinnestAI MCP server to Claude Code, Cursor, VS Code or Claude Desktop with an API key. - [Tools](https://docs.thinnest.ai/mcp/tools.md): Every tool the ThinnestAI MCP server offers, and what each one does. - [Safety](https://docs.thinnest.ai/mcp/safety.md): What needs your approval, why, and how repeated sends are prevented. - [Keep your data in your database](https://docs.thinnest.ai/mcp/own-database.md): Use your own database and ThinnestAI's agents — the agent looks your data up live instead of us holding a copy. - [Build a dashboard](https://docs.thinnest.ai/mcp/dashboards.md): Have your assistant build a dashboard or an internal tool on your workspace's data. - [API reference](https://docs.thinnest.ai/api-reference/introduction.md): The transactional API — the messages your systems send, not the ones your marketing does. - [Authentication](https://docs.thinnest.ai/api-reference/authentication.md): Bearer keys, and the one place they must never go. - [Errors](https://docs.thinnest.ai/api-reference/errors.md): The status, the machine-readable code that tells refusals apart, and whether retrying will help. - [SDKs](https://docs.thinnest.ai/api-reference/sdks.md): Typed TypeScript and Python clients for every endpoint, with retries, idempotency and pagination built in. - [Customers](https://docs.thinnest.ai/api-reference/customers.md): Build your own product on the API: a workspace for each of your customers, reached with one key. - [Bring your own keys](https://docs.thinnest.ai/api-reference/bring-your-own-keys.md): Run your agents on your own speech-to-text, LLM and voice accounts, on your own voice and language model, on your own voice alone, or on your own language model alone. Each agent can follow the workspace or choose its own. - [Webhooks](https://docs.thinnest.ai/api-reference/webhooks.md): Add, list, change and remove the endpoints an agent's events are sent to. - [List Agents](https://docs.thinnest.ai/api-reference/agents/list-agents.md): Every agent in your workspace, newest first, in the same shape Get Agent returns. Page with `limit` and `cursor`. - [Create Agent](https://docs.thinnest.ai/api-reference/agents/create-agent.md): Makes an agent exactly as the console does: a starter persona when you send no `instructions`, a website widget key, and (where your deployment has voice) a voice channel that answers on the web and WhatsApp. Only `name` is required. The plan's agent allowance, its model list and its voice tiers app… - [Get Agent](https://docs.thinnest.ai/api-reference/agents/get-agent.md): One agent: its instructions, model, languages, script, widget, call settings and the details it collects from calls. Which engine speaks its voice or runs its model is never part of the answer. - [Update Agent](https://docs.thinnest.ai/api-reference/agents/update-agent.md): Changes any subset of the fields Create Agent takes and answers with the whole agent. Fields you leave out are untouched, and unknown fields are ignored — but a body that names no field this API knows is refused. A model or voice is checked against your plan only when it changes, and a refused voice… - [Delete Agent](https://docs.thinnest.ai/api-reference/agents/delete-agent.md): Deletes the agent and everything under it: its conversations, knowledge, actions and channels. It cannot be undone. A **build** key may do this. - [Get Agent BYOK Model](https://docs.thinnest.ai/api-reference/agents/get-agent-byok-model.md): On a workspace that brings its own keys: the model this agent runs on your own LLM key. `model` is the agent's own choice (null when it runs the key's model), and `stale` names an earlier choice your key no longer reaches, which the key's model answers in place of. Refused with `409` when the worksp… - [Set Agent BYOK Model](https://docs.thinnest.ai/api-reference/agents/set-agent-byok-model.md): Chooses which model of your own LLM key this agent runs. It must be one the key reaches — listed under `byok.models` by List Models — or `null` to run the key's own model (the one set under Settings → Your keys). The next reply uses it. A **build** key may do this. - [Get Agent BYOK Voice](https://docs.thinnest.ai/api-reference/agents/get-agent-byok-voice.md): On a workspace that brings its own keys: the voice this agent speaks with on your own voice provider. `voice` is null for the provider's default voice. A choice belongs to the provider it was made on; after you switch your voice key to another provider, `stale` holds the old choice and calls speak t… - [Set Agent BYOK Voice](https://docs.thinnest.ai/api-reference/agents/set-agent-byok-voice.md): Chooses the voice this agent speaks with on your own voice provider: an id from List BYOK Voices, checked against the provider's list for your key, or `null` for the provider's default. On Cartesia an id that is not on the list yet, such as a voice cloned a moment ago, is checked with Cartesia direc… - [Test Chat](https://docs.thinnest.ai/api-reference/agents/test-chat.md): Talks to your real agent through its website chat — the same prompt, model, knowledge, actions, limits and billing as the console's Playground — and answers with its reply and every tool it used. It runs as a sandbox: anything that would phone, message, email or send a code to a person, or change a… - [List Knowledge Documents](https://docs.thinnest.ai/api-reference/knowledge/list-knowledge-documents.md): The agent's documents, newest first, with whether each is ready to be cited. Files uploaded in the console are listed here too. - [Add Knowledge Document](https://docs.thinnest.ai/api-reference/knowledge/add-knowledge-document.md): Adds a web page (`url`) or pasted `text` to what the agent knows. A page is fetched and indexed before this answers, so a slow site is a slow request; `passages` says how much was indexed. A page that cannot be read is answered `422` with the reason and the `failed` document it left behind, which yo… - [Delete Knowledge Document](https://docs.thinnest.ai/api-reference/knowledge/delete-knowledge-document.md): Removes the document and every passage indexed from it; the agent stops citing it at once. A **build** key may do this. - [List Actions](https://docs.thinnest.ai/api-reference/actions/list-actions.md): The agent's actions — calls to your own HTTPS API that it may make mid-conversation — newest first. Header values never appear; only `headerNames`. - [Create Action](https://docs.thinnest.ai/api-reference/actions/create-action.md): Give the agent a call to your own API, with placeholders it fills from what the customer said. Dotted placeholders are filled by the platform, never the model: `{{call.id}}` (the id `GET /calls` lists), `{{call.from}}`, `{{call.to}}`, `{{call.direction}}` (empty outside a call), `{{conversation.id}}… - [Get Action](https://docs.thinnest.ai/api-reference/actions/get-action.md): One action. Header values never appear; only `headerNames`. - [Update Action](https://docs.thinnest.ai/api-reference/actions/update-action.md): Change any field, or switch it on or off with `enabled`. The action is validated as it will be saved, so a new `url` is checked against the parameters already there. Leaving `headers` out keeps the saved credential; sending any replaces the whole set. `enabled: true` makes it callable from every con… - [Delete Action](https://docs.thinnest.ai/api-reference/actions/delete-action.md): Remove the action and its sealed headers. The agent stops being able to call it at once. A **build** key may do this. - [Test Action](https://docs.thinnest.ai/api-reference/actions/test-action.md): Make the call once, for real, through the same address checks and credentials the agent uses — and it works while the action is still off, which is the point. A test has no conversation, so only `{{agent.id}}` and `{{workspace.id}}` fill; the rest are empty. A failed call is still `200`, with `ok: f… - [List Built-in Tools](https://docs.thinnest.ai/api-reference/tools/list-built-in-tools.md): The agent's built-in tools — the Actions page's switches — with the recall, verification and hand-over settings. The three tools that reach a customer on another channel also say whether they are `ready` (on, and what they need exists) and what they `needs`. - [Update Built-in Tools](https://docs.thinnest.ai/api-reference/tools/update-built-in-tools.md): Switch built-in tools on or off and set recall, code verification and the hand-over. `search_knowledge` is not a switch and web search cannot be switched on; both are refused. Changes apply in order and stop at the first refusal, keeping what came before. Needs a **full** key. — it can arm tools tha… - [List Tool Servers](https://docs.thinnest.ai/api-reference/tools/list-tool-servers.md): Every tool server the agent is connected to, oldest first, each with its tools. All come in one page. Tokens never appear; `hasSecret` says one is held. - [Connect Tool Server](https://docs.thinnest.ai/api-reference/tools/connect-tool-server.md): Connect an MCP tool server that takes a token (or none). It is asked for its tools at once and every tool arrives **off** — switch each on with `PATCH …/tools/{toolId}`. A server that cannot be reached is still saved and answers `201` with `status: "failed"` and the reason in `message`, so you can f… - [Get Tool Server](https://docs.thinnest.ai/api-reference/tools/get-tool-server.md): One tool server and its tools. - [Disconnect Tool Server](https://docs.thinnest.ai/api-reference/tools/disconnect-tool-server.md): Disconnect the server; its tools leave the agent at once and its token is deleted. This works for servers connected in the console too. A **build** key may do this. - [Sync Tool Server](https://docs.thinnest.ai/api-reference/tools/sync-tool-server.md): Ask the server what it offers, again — the console's Refresh, and the closest thing to a test. New tools arrive off; tools it no longer lists leave the agent. A store connection has a fixed list and is refused. A **build** key may do this. - [Update Tool Server Tool](https://docs.thinnest.ai/api-reference/tools/update-tool-server-tool.md): Switch one of a server's tools on or off. On, it is callable from every conversation the agent has. Answers with the server and all its tools. A **build** key may do this. - [List Connections](https://docs.thinnest.ai/api-reference/tools/list-connections.md): Every account the agent can work in, connected or not — a calendar, two spreadsheets, two CRMs, records kept here and two helpdesks — each with its state, what it is pinned to and its tools. `toolsInUse` / `maxTools` is the one budget every connection's switches share. Credentials never appear. - [Get Connection](https://docs.thinnest.ai/api-reference/tools/get-connection.md): One connection, connected or not, with the shared tool budget. - [Connect Account](https://docs.thinnest.ai/api-reference/tools/connect-account.md): Connect (or re-key) an account. Every key, token and secret is sealed and never returned. Connecting grants nothing: tools start off and are switched with `PATCH` `tools`. `googlesheets`, `zoho` and `zoho_bigin` sign in on the provider's own consent screen — connect them once in the console (this an… - [Configure Connection](https://docs.thinnest.ai/api-reference/tools/configure-connection.md): Pin a connection to its target, say how a lead's row is found, choose when it saves, and switch its tools. The account must be connected first (records excepted). Changes apply in a fixed order and stop at the first refusal, keeping what came before it. Helpdesks have nothing to configure. A **build… - [Disconnect Account](https://docs.thinnest.ai/api-reference/tools/disconnect-account.md): Disconnect the account; its tools leave the agent and its credential is deleted. A browser sign-in still pending is cancelled too. What already happened in the account (meetings booked, rows written) is untouched, and records already collected are kept. A **build** key may do this. - [List Connection Options](https://docs.thinnest.ai/api-reference/tools/list-connection-options.md): What a connected account can reach, read live each time, so you can choose a `target` for `PATCH …/connections/{kind}`: a Grist document's tables and columns (`?doc=`), a spreadsheet's sheets (`?spreadsheet=`), or the modules a Zoho account can write to. Other kinds have nothing to choose. - [Replace Records Link](https://docs.thinnest.ai/api-reference/tools/replace-records-link.md): Make a new link to read the records the agent collects, with a new passcode — shown in this response and never again. The old link stops working at once, which is also how a link shared too widely is revoked. A **build** key may do this. - [Get Agent Channels](https://docs.thinnest.ai/api-reference/channels/get-agent-channels.md): Where the agent answers, as the Channels page shows it: the widget key, the WhatsApp number and its health, the Telegram bot and the voice line. No token or secret is ever part of the answer. The widget's look and the call settings are changed with Update Agent (`widget`, `voice`). - [Connect Telegram Bot](https://docs.thinnest.ai/api-reference/channels/connect-telegram-bot.md): Connects a Telegram bot to the agent with the token @BotFather gave you: the token is checked with Telegram, stored encrypted and never shown again, and Telegram is told where to deliver messages. Telegram needs a paid plan, and a bot can belong to one agent only. Telegram calls back on the address… - [Disconnect Telegram Bot](https://docs.thinnest.ai/api-reference/channels/disconnect-telegram-bot.md): Disconnects the agent's Telegram bot (a 404 when none is connected) and tells Telegram to stop delivering to us. Its conversations stay in your inbox, and the bot itself still exists in Telegram — delete it in @BotFather if you want it gone. A **build** key may do this. - [List Calls](https://docs.thinnest.ai/api-reference/calls/list-calls.md): Every call your workspace made or took — inbound, website, WhatsApp, a campaign's or one you placed — newest first, without transcripts or recordings. Each item's `id` opens the call with Get Call. A call booked for later appears here only once it has rung; read a booked call by the `sch_…` id Place… - [Place Call](https://docs.thinnest.ai/api-reference/calls/place-call.md): Your agent rings a customer, opens with your `purpose` (spoken aloud, so 300 characters or fewer), then holds a normal conversation. A number that is not a contact yet becomes one with the `name` and `source` you send; someone who opted out or is on your do-not-call list is refused. Outside the call… - [Place Batch Calls](https://docs.thinnest.ai/api-reference/calls/place-batch-calls.md): Rings up to 200 people with one request. Every option Place Call takes may be set once for the batch and again on an entry, the entry winning (an entry's `variables` sit on top of the batch's); `purpose` and `agent` are the batch's. Every entry is queued and paced inside your plan's lines and balanc… - [Get Call](https://docs.thinnest.ai/api-reference/calls/get-call.md): One call and everything it learned: status, timings, how it ended, the summary, the collected `fields`, the transcript, a signed `recording` link and the call's `quality` figures (reply times, silences, interruptions, model errors). It is exactly the object `call.analysed` delivers, so a missed deli… - [Cancel Call](https://docs.thinnest.ai/api-reference/calls/cancel-call.md): Calls off a call you placed through the API (`out_…` or `sch_…`). A call still waiting to ring — booked, queued for its hours, or a retry — is cancelled and answers `200` with its report, `status: "cancelled"`. A call ringing or connected is ended on the line and answers `202` with the report as it… - [Get Call Transcript](https://docs.thinnest.ai/api-reference/calls/get-call-transcript.md): What was said on one call, oldest first: this call's spoken turns only, internal notes left out — the same words `call.analysed` delivers. `?format=txt` returns a plain-text file to save (`call-{id}.txt`, one `[mm:ss] Who: what` line per turn). A turn's `offset` is when it was written down, not wher… - [Get Call Analysis](https://docs.thinnest.ai/api-reference/post-call/get-call-analysis.md): What one call came to, without the transcript: the outcome as the console's call log shows it ("Answered", "Line busy", "Answering machine"), the summary and the collected fields. `outcome` is null until the call has ended; `analysedAt` null means the summary and fields may still arrive, and `call.a… - [Delete Call Content](https://docs.thinnest.ai/api-reference/post-call/delete-call-content.md): Deletes ONE call's recording and transcript, and keeps its billing record. Gone: the recording (ours, the phone provider's copy of a call on a number we rent, and any copy made for model training), this call's own turns in its conversation (other calls and chats with the same person stay), its summa… - [Get Post-call Settings](https://docs.thinnest.ai/api-reference/post-call/get-post-call-settings.md): What an agent does after each call: whether it summarises and records calls, how long your plan keeps a recording, and the details it collects. These are the agent's own settings — the same values Get Agent shows under `voice` and `collectFields` — and `followUp`, the WhatsApp and/or SMS the agent s… - [Update Post-call Settings](https://docs.thinnest.ai/api-reference/post-call/update-post-call-settings.md): Changes what an agent does after each call; send only what you are changing. `collectFields` replaces the whole list, and an empty list stops collecting (details already collected are kept). Any other key is refused — the rest of the agent belongs to Update Agent. `followUp` sets the WhatsApp and/or… - [Get Call Recording](https://docs.thinnest.ai/api-reference/recordings/get-call-recording.md): One call's audio as MP3, streamed — it plays inline, or with `download=1` saves as `call-{id}.mp3`. `Range` requests are honoured so a player can seek, and nothing is cached. A recording lands about a minute after the call ends (`404` with `Retry-After` until then) and is deleted when your plan's re… - [Get Recording By Signed Link](https://docs.thinnest.ai/api-reference/recordings/get-recording-by-signed-link.md): The signed link a call report hands out as `recording.url`, for a CRM user to click: it needs **no API key**, because the signature is the permission. Use the URL exactly as the report gives it; add `&download=1` to save rather than play. The link stops working at its `expiresAt`, which is when your… - [List Conversations](https://docs.thinnest.ai/api-reference/conversations/list-conversations.md): Your workspace's conversations, newest first. `since` keeps only those a customer has written in at or after that moment — the way to find what a missed `message.received` webhook would have told you, including a conversation whose very first message you never heard about. Go back a few minutes from… - [List Conversation Messages](https://docs.thinnest.ai/api-reference/conversations/list-conversation-messages.md): One conversation's messages, newest first: the customer's, your agent's, and replies a teammate sent from the inbox (`author: "teammate"`). Your team's internal notes are left out. Photos, voice notes, videos and documents a customer sent come back as links valid for **eight hours** — download what… - [Reply to Conversation](https://docs.thinnest.ai/api-reference/conversations/reply-to-conversation.md): Your own agent platform answers a WhatsApp customer — the other half of the `message.received` webhook. Send exactly one of `text`, `media`, `template` or `form`; text, media and forms need the customer's 24-hour window open, a template does not. Only works on a number with **Connect External Agent/… - [Update Conversation Status](https://docs.thinnest.ai/api-reference/conversations/update-conversation-status.md): The inbox's three moves: `resolved` marks it done and fires the `conversation.resolved` webhook, `active` hands it back to the agent, and `human_handling` takes it over so the agent stays quiet until it is handed back. An internal note records which API key made the change; the customer never sees i… - [Assign Conversation](https://docs.thinnest.ai/api-reference/conversations/assign-conversation.md): Make a conversation a teammate's job, by their email — or `null` to put it back in the pool. The teammate is notified when it really moves to them. Assigning does **not** silence the agent; taking it over with Update Conversation Status does. List your teammates with `GET /members`. The shared inbox… - [Send Message](https://docs.thinnest.ai/api-reference/messages/send-message.md): Sends one approved template to one number and records it in that customer's conversation. Marketing templates are refused for a customer who opted out; utility and authentication templates are not, since an order confirmation is not something a customer opts out of. Each send is charged like any Wha… - [Send One-Time Code](https://docs.thinnest.ai/api-reference/one-time-codes/send-one-time-code.md): Sends a code you generated to a WhatsApp number, using your approved authentication template — the code goes into the message **and** the copy-code button. We do not generate, store, expire or check the code; that stays yours. One number may be sent at most 5 codes in 10 minutes, and the workspace a… - [List Code Templates](https://docs.thinnest.ai/api-reference/one-time-codes/list-code-templates.md): Your workspace's authentication templates — drafts, those in review and approved ones — newest first. - [Create Code Template](https://docs.thinnest.ai/api-reference/one-time-codes/create-code-template.md): Saves an authentication template as a **draft**. WhatsApp writes the words; you choose how long the code lasts, whether to add "For your security, do not share this code.", and the button — `copy_code` (works everywhere) or `one_tap` (hands the code to your Android app, which needs `apps`). Nothing… - [Get Code Template](https://docs.thinnest.ai/api-reference/one-time-codes/get-code-template.md): One authentication template, with its review status and WhatsApp's reason when it was rejected. - [Update Code Template](https://docs.thinnest.ai/api-reference/one-time-codes/update-code-template.md): Changes any of a **draft**'s fields; the ones you leave out keep their values. Once a template has been submitted, WhatsApp has the text and it can no longer be edited — make a new one instead. A **build** key may do this. - [Delete Code Template](https://docs.thinnest.ai/api-reference/one-time-codes/delete-code-template.md): Deletes the template — at WhatsApp first when it was submitted, then here. WhatsApp keeps a deleted template's name reserved for 30 days, so a replacement needs a different name. Codes stop sending at once if this was your only approved one. A **build** key may do this. - [Submit Code Template](https://docs.thinnest.ai/api-reference/one-time-codes/submit-code-template.md): Sends a draft to WhatsApp for review, on your workspace's own WhatsApp Business Account — so a connected number is needed first. The status moves to `pending` only when WhatsApp took it. Review usually takes minutes; a `template.*` webhook and Get Code Template tell you how it went. A **build** key… - [List Contacts](https://docs.thinnest.ai/api-reference/contacts/list-contacts.md): Contacts with a phone number, newest first. Filter by tag, by your CRM's id, or by phone to look one person up. Contacts folded into another by a merge are left out. - [Create Contact](https://docs.thinnest.ai/api-reference/contacts/create-contact.md): Creates a contact — or, when someone is already on that number, **updates that person** instead, so a CRM that syncs the same lead twice never doubles your list. Answers `201` for a new contact and `200` for one it updated. Creating a contact is not consent: only `consent.status: "granted"` with a `… - [Get Contact](https://docs.thinnest.ai/api-reference/contacts/get-contact.md): One contact, by id. - [Update Contact](https://docs.thinnest.ai/api-reference/contacts/update-contact.md): Changes any of the fields Create Contact takes, consent included; fields you leave out keep their values, and `null` clears a field. `tags` replaces the whole list. A contact whose consent is `withdrawn` is never sent marketing, enrolled in a sequence or put in a campaign. A **build** key may do thi… - [Delete Contact](https://docs.thinnest.ai/api-reference/contacts/delete-contact.md): **Erases** the contact: their conversations and transcripts, their calls, any queued call and their campaign rows go with them, and so does any duplicate that was merged into them. This cannot be undone. Use it for a person's request to be forgotten; to stop messaging someone, set their consent to `… - [List Do-Not-Call Numbers](https://docs.thinnest.ai/api-reference/do-not-call/list-do-not-call-numbers.md): The workspace's do-not-call list, newest first. - [Add Do-Not-Call Number](https://docs.thinnest.ai/api-reference/do-not-call/add-do-not-call-number.md): Puts a number on the list; from then on no outbound call rings it. Adding a number already there changes nothing and answers `200` with the entry as it was. A **build** key may do this — it only ever stops calls. - [Get Do-Not-Call Number](https://docs.thinnest.ai/api-reference/do-not-call/get-do-not-call-number.md): Whether a number is on the list, and how it got there. - [Remove Do-Not-Call Number](https://docs.thinnest.ai/api-reference/do-not-call/remove-do-not-call-number.md): Takes a number off the list, so it can be called again. Needs a **full** key. If the person asked on a call not to be called (`source: call`), be sure they have since agreed before removing it. - [Report Event](https://docs.thinnest.ai/api-reference/events/report-event.md): Tells us something happened to a customer. Every sequence or tag rule subscribed to that event name runs: sequences that stop on it end first, then tags are added or removed, then sequences that start on it enrol the contact (unless they opted out, and only into an active sequence). The contact is c… - [List Templates](https://docs.thinnest.ai/api-reference/templates/list-templates.md): Lists your workspace's WhatsApp templates, newest first, with what a send needs from each: how many body values (`variableCount`), how many link-button values (`buttonVariableCount`) and whether the header needs a media link (`headerKind`). Only `approved` templates can be sent. - [Create Template](https://docs.thinnest.ai/api-reference/templates/create-template.md): Saves a WhatsApp template as a draft, after the console's own checks of WhatsApp's rules for the body, header, footer, buttons and an authentication template's code. Review is a separate, deliberate step — Submit Template, or `submit: true` here — because once a name is approved it can never be reus… - [Get Template](https://docs.thinnest.ai/api-reference/templates/get-template.md): Returns one WhatsApp template by name, with its parts — header text, footer, buttons — and, when WhatsApp refused it, the reason in `reviewNote`. Poll it after Submit Template to follow the review: `status` moves from `pending` to `approved` or `rejected`. Pass `language` when the name exists in mor… - [Update Template](https://docs.thinnest.ai/api-reference/templates/update-template.md): Edits a **draft** template. Send only the fields that change; the result is checked against the same rules as Create Template. Once a template has been sent for review WhatsApp has its text, so it can no longer be edited — create a new template instead. Changing `name` or `language` renames it. A **… - [Delete Template](https://docs.thinnest.ai/api-reference/templates/delete-template.md): Deletes a WhatsApp template. One that was sent for review is deleted from WhatsApp first — only that language — and from your workspace only once that works, so a refusal leaves everything as it was. This cannot be undone, and WhatsApp may keep a deleted name reserved for a while, so it may not be r… - [Submit Template](https://docs.thinnest.ai/api-reference/templates/submit-template.md): Sends a **draft** template to your own WhatsApp Business Account for review, after the same last checks as the console's Submit. The template moves to `pending` only if WhatsApp accepted it. Review usually takes minutes, occasionally days; follow it with Get Template, whose `status` becomes `approve… - [List Campaigns](https://docs.thinnest.ai/api-reference/campaigns/list-campaigns.md): Lists your workspace's broadcasts and calling campaigns, newest first, each with its live counts: recipients, sent, delivered, read, replied, failed and skipped. Filter by `status` to watch only the ones that are sending. - [Create Campaign](https://docs.thinnest.ai/api-reference/campaigns/create-campaign.md): Creates a WhatsApp broadcast (`kind: "whatsapp"`) or a calling campaign (`kind: "voice"`) as a draft, with the same checks as the console's builder: WhatsApp connected and the template approved with every blank filled, or for calls an agent with a number that answers phone calls and is licensed for… - [Get Campaign](https://docs.thinnest.ai/api-reference/campaigns/get-campaign.md): Returns one broadcast or calling campaign with its current state and counts. Poll it while a campaign is sending to follow its progress; `finishedAt` is set when it ends or is cancelled, and `lastError` says why a campaign stopped, when it did. - [Launch Campaign](https://docs.thinnest.ai/api-reference/campaigns/launch-campaign.md): Starts a draft, as the console's Send or Start button does, re-running its checks at the moment they matter: your plan must include campaigns, a calling campaign's agent must still have a number that answers phone calls (and, for promotional calls, is licensed for them), and your balance must cover… - [Pause Campaign](https://docs.thinnest.ai/api-reference/campaigns/pause-campaign.md): Stops a sending campaign from sending any more. Messages already handed to WhatsApp, and calls already placed, still complete. Resume Campaign picks up where it stopped, without messaging anyone twice. Only a `sending` campaign can be paused. A **build** key may do this, since it only ever stops sen… - [Resume Campaign](https://docs.thinnest.ai/api-reference/campaigns/resume-campaign.md): Sends a paused campaign again, to everyone it has not reached yet; nobody is messaged or called twice. It clears `lastError`, and what it sends is charged as usual. Only a `paused` campaign can be resumed; a draft is started with Launch Campaign. Needs a **full** key. - [Cancel Campaign](https://docs.thinnest.ai/api-reference/campaigns/cancel-campaign.md): Stops a draft, sending or paused campaign for good and sets `finishedAt`. Messages already handed to WhatsApp, and calls already placed, still complete. This cannot be undone, and it is also how you get rid of a draft you do not want: campaigns cannot be edited or deleted, so cancel it and create a… - [List Sequences](https://docs.thinnest.ai/api-reference/sequences/list-sequences.md): Your workspace's sequences, newest first. Deleted (archived) ones are left out. Get Sequence adds the steps, events and how many people are in each. - [Create Sequence](https://docs.thinnest.ai/api-reference/sequences/create-sequence.md): Creates a sequence as a **draft**: it sends nothing until you add a step with Add Sequence Step and turn it on with Activate Sequence. Tags are stored lower-case and hyphenated, and event names lower-case with dots, as the console stores them. A **build** key may do this. - [Get Sequence](https://docs.thinnest.ai/api-reference/sequences/get-sequence.md): One sequence with its steps in order, the events that start and stop it, and how many people are in it, finished it or left it. - [Update Sequence](https://docs.thinnest.ai/api-reference/sequences/update-sequence.md): Changes any of `name`, `exitOnReply`, `triggerTags`, `exitOnTags`, `startOn` and `stopOn`. A list you send **replaces** the old one; a list you leave out is kept. Works while the sequence runs, and applies to the people already in it — add a stop tag and they stop when they get it. Steps cannot be c… - [Delete Sequence](https://docs.thinnest.ai/api-reference/sequences/delete-sequence.md): Archives the sequence, which is how the console deletes one: it sends nothing more and leaves every list, while the record of who was sent what stays. There is no undo. A **build** key may do this. - [Add Sequence Step](https://docs.thinnest.ai/api-reference/sequences/add-sequence-step.md): Appends a message at the **end** of the sequence: an approved template, sent `delayHours` after the step before (or after the person joined, for the first step). Steps cannot be edited, reordered or removed — someone partway through a live sequence would skip a message or get one twice — so to chang… - [Activate Sequence](https://docs.thinnest.ai/api-reference/sequences/activate-sequence.md): Turns a draft or paused sequence on: messages that fall due start going out, and its tags and events start enrolling people. Refused for a sequence with no steps, which would take people in and send nothing. Needs a **full** key. - [Pause Sequence](https://docs.thinnest.ai/api-reference/sequences/pause-sequence.md): Pauses an active sequence: nothing more is sent until it is activated again. The people in it keep their place. A **build** key may do this. - [Enrol in Sequence](https://docs.thinnest.ai/api-reference/sequences/enrol-in-sequence.md): Puts one existing contact into a sequence, with values its messages can use — an order number your system knows and the console does not. The person must already be a contact; this never creates one. `enrolled: false` is a `200`, not an error: they are already in it, the number is not a contact, the… - [List Forms](https://docs.thinnest.ai/api-reference/forms/list-forms.md): Your workspace's WhatsApp forms, newest first, published or not. - [Create Form](https://docs.thinnest.ai/api-reference/forms/create-form.md): Saves a form, **unpublished** — it cannot be sent until Publish Form succeeds. Up to 8 questions; field names are what each answer comes back under. Without `agent`, the form goes to the agent holding your WhatsApp number, else your oldest agent. No connected number is needed to build one. A **build… - [Get Form](https://docs.thinnest.ai/api-reference/forms/get-form.md): One form, with its questions and whether it can be sent. - [Update Form](https://docs.thinnest.ai/api-reference/forms/update-form.md): Changes any of `name`, `category` and `form` (`form` is replaced whole). **Any** change unpublishes the form, as saving does in the console — the published copy still asks the old questions — so publish it again before sending it. A **build** key may do this. - [Delete Form](https://docs.thinnest.ai/api-reference/forms/delete-form.md): Deletes the form; it can no longer be sent. Answers already collected stay, marked as from a removed form. A **build** key may do this. - [Publish Form](https://docs.thinnest.ai/api-reference/forms/publish-form.md): Publishes the form to your workspace's **own** WhatsApp Business Account, which makes it sendable. Needs a connected WhatsApp number whose connection was finished. If WhatsApp refuses (most often because the business is not verified yet), the form stays saved and you can publish again later; a faile… - [List Phone Numbers](https://docs.thinnest.ai/api-reference/phone-numbers/list-phone-numbers.md): Every number this workspace can call from or be called on — rented and brought — with the agent that answers each. Not paged. `label` is always `null` here for a brought number; Get Phone Number reads it. - [Rent Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/rent-phone-number.md): Rents a number from Search Available Phone Numbers. **This costs money:** the first month's rent (the `monthlyPrice` the search showed) is charged from your balance at once, and again every month on the same day until you release the number. Every refusal happens before anything is bought or charged… - [Get Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/get-phone-number.md): One number this workspace holds: who answers it, who calls out on it, and its name. A number held by another workspace is `404`, the same as one that does not exist. - [Update Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/update-phone-number.md): Points a number at an agent, lends it to one for calling out, names it, or forwards its calls — any of the four. `agent` makes the number that agent's line (it stops being any other agent's; the agent must have voice switched on); `callingAgent` lets an agent call out on it without answering it (a b… - [Release Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/release-phone-number.md): Gives a number up; either way it stops being any agent's line and leaves every agent's calling pool. A **brought** number is simply forgotten: it stays yours on your own carrier account, and calls to it are declined until you repoint it. A **rented** number is **released, permanently**: it goes back… - [Move Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/move-phone-number.md): In the console, developers do this from the Numbers page: open the number's menu and choose **Move to another workspace…**. - [Get Business Details](https://docs.thinnest.ai/api-reference/phone-numbers/get-business-details.md): Where this workspace's business details stand. India issues a number only to a business it has approved, in the business's own name, so there is one application per workspace — a platform with a workspace per customer sends and reads each customer's own (with the `Thinnest-Workspace` header). Return… - [Send Business Details](https://docs.thinnest.ai/api-reference/phone-numbers/send-business-details.md): Sends the business's details for approval, as multipart/form-data: the legal name, whether it is registered for GST, and **one** document — the GST certificate if it is, otherwise its Certificate of Incorporation or its Udyam certificate (say which in `documentKind`; incorporation is assumed). PDF,… - [Search Available Phone Numbers](https://docs.thinnest.ai/api-reference/phone-numbers/search-available-phone-numbers.md): Indian local numbers you can rent, each with its monthly rent at your plan's rate in your balance's currency. Numbers somebody already holds are left out, so a page (up to twenty) can hold fewer and still have more after it: pass `nextCursor` back as `cursor`. Needs a paid plan. - [List Available Cities](https://docs.thinnest.ai/api-reference/phone-numbers/list-available-cities.md): The cities Search Available Phone Numbers accepts as `city`, with how many numbers each has. Use these spellings exactly: "Bangalore" finds numbers where "Bengaluru" finds none. Empty on the Free plan or when the stock cannot be reached. Not paged. - [Import Phone Number](https://docs.thinnest.ai/api-reference/phone-numbers/import-phone-number.md): Brings a number you own on your own carrier account. It stays on your account and you keep paying your carrier for it; we never bill it. For carriers that sign their calls with your account's secret, save the account's keys first (Save Carrier Account) — we also use them to check the number is reall… - [List Carrier Accounts](https://docs.thinnest.ai/api-reference/phone-numbers/list-carrier-accounts.md): Your own carrier accounts we hold verified keys for — the accounts your brought numbers live on — each by the last four characters of its account id, never any part of the secret. A carrier missing from the list has no keys saved: its brought numbers can answer calls (where the carrier allows) but n… - [Save Carrier Account](https://docs.thinnest.ai/api-reference/phone-numbers/save-carrier-account.md): Saves the keys of your own account with a carrier, which lets its brought numbers be confirmed, answered and called out from. The keys are checked with the carrier before anything is stored, stored sealed, and never returned. One account per carrier: switching to a different account while numbers ar… - [Get SMS Provider](https://docs.thinnest.ai/api-reference/sms/get-sms-provider.md): The workspace's SMS provider, sender header and DLT entity id. Secrets are never returned: `secretsSaved` names the ones held. - [Connect SMS Provider](https://docs.thinnest.ai/api-reference/sms/connect-sms-provider.md): Connects your SMS provider, or replaces the one connected. A secret you leave out keeps the one saved, for the same provider; switching provider needs every field. The connection's `status` goes back to `untested` until Send Test SMS succeeds. Needs a **full** key. - [Disconnect SMS Provider](https://docs.thinnest.ai/api-reference/sms/disconnect-sms-provider.md): Forgets the provider and its credentials, and switches `send_sms` off on every agent. Your templates are kept. Needs a **full** key. - [List SMS Templates](https://docs.thinnest.ai/api-reference/sms/list-sms-templates.md): The workspace's DLT templates, by name. - [Add SMS Template](https://docs.thinnest.ai/api-reference/sms/add-sms-template.md): Adds a template exactly as it was approved on your DLT portal, with `{#var#}` wherever the text changes. Each `{#var#}` takes at most 30 characters when sent. Promotional templates are not accepted: an agent may only send transactional or service messages. MSG91 and Fast2SMS send by their own templa… - [Update SMS Template](https://docs.thinnest.ai/api-reference/sms/update-sms-template.md): Changes any of a template's fields; what you leave out stays. If an agent sends this template after its calls, a body with a different number of `{#var#}` is refused until that agent's follow-up is changed. Needs a **full** key. - [Delete SMS Template](https://docs.thinnest.ai/api-reference/sms/delete-sms-template.md): Deletes a template. An agent that sent it after its calls stops sending an SMS then. Needs a **full** key. - [Send Test SMS](https://docs.thinnest.ai/api-reference/sms/send-test-sms.md): Sends one template to one Indian mobile number through your provider — a real SMS, billed by your provider — to prove the provider, header and DLT ids work together. Success sets the connection's `status` to `working`; a provider's refusal sets it to `failing` with the reason. Needs a **full** key. - [List Voices](https://docs.thinnest.ai/api-reference/voices/list-voices.md): Every voice your agents may speak with, in the picker's order: premium, then Studio. `tier` is the price band a call is billed at: `premium` or `studio`. Standard voices were retired on 23 October 2026 and are no longer listed. Studio voices — the shared Studio catalogue and your own clones (`mine:… - [List Voice Clones](https://docs.thinnest.ai/api-reference/voice-clones/list-voice-clones.md): Your workspace's cloned voices, newest first, with a short-lived link to each one's preview and the consent it was made under. - [Create Voice Clone](https://docs.thinnest.ai/api-reference/voice-clones/create-voice-clone.md): Clones a voice from a 5–30 second recording, sent as multipart/form-data with the audio as `sample`. Both consent fields must be `true` — the two promises the console shows — or nothing is stored or sent anywhere; the refusal carries the two sentences so you can show your own user the same words. Cl… - [Get Voice Clone](https://docs.thinnest.ai/api-reference/voice-clones/get-voice-clone.md): One cloned voice, with a preview link that works for sixty seconds — long enough to play, too short to share. - [Update Voice Clone](https://docs.thinnest.ai/api-reference/voice-clones/update-voice-clone.md): Renames, re-describes or re-tags a cloned voice. Its language, recording and consent are what it was made from and cannot be changed; sending any other field is refused. A **build** key may do this. - [Delete Voice Clone](https://docs.thinnest.ai/api-reference/voice-clones/delete-voice-clone.md): Forgets the voice everywhere — the voice, its recording and its preview — and moves every agent that spoke with it to a Premium voice; `movedAgents` says how many. It cannot be undone. Needs a **full** key. - [List Models](https://docs.thinnest.ai/api-reference/models/list-models.md): Every model an agent may answer with, by the name the console shows. `available` says whether your plan may pick it — the rest are listed so you can see what an upgrade adds — and `voice` whether it is quick enough to answer a call (an agent's model must be). On a workspace that brings its own keys… - [Get BYOK Status](https://docs.thinnest.ai/api-reference/bring-your-own-keys/get-byok-status.md): Whether your workspace runs on its own keys, whose keys are in use (`own`, or `developer` for a customer using its developer's), which keys you bring (`scope`: all three, only your voice, only your language model, or your language model and your voice), whether your keys for that scope are complete… - [Turn BYOK On or Off](https://docs.thinnest.ai/api-reference/bring-your-own-keys/turn-byok-on-or-off.md): Switches your workspace onto your own keys, or back onto ours, and/or chooses what you bring (`scope`). Scope `all` needs all three keys — speech-to-text, LLM and voice — added, verified and each with a model chosen; scope `voice` needs only the voice key, and speech-to-text, the LLM and telephony s… - [List BYOK Keys](https://docs.thinnest.ai/api-reference/bring-your-own-keys/list-byok-keys.md): Your workspace's own provider keys, one per job, masked to their last four characters, with the model each runs and every model its provider offered it. - [Add BYOK Key](https://docs.thinnest.ai/api-reference/bring-your-own-keys/add-byok-key.md): Adds or replaces your key for one job. The key is checked with the provider before anything is stored — a key the provider rejects is not saved — then stored encrypted and only ever shown by its last four characters. The provider's model list is pulled at the same time. Without `credentials.model`,… - [Update BYOK Key Model](https://docs.thinnest.ai/api-reference/bring-your-own-keys/update-byok-key-model.md): Changes the model a stored key runs without sending the key again. `model` must be on the key's `models`; for a model the provider launched after you added the key, send `refreshModels: true` — alone, or with the new `model`, which is then checked against the fresh list. While BYOK is on, a refreshe… - [Delete BYOK Key](https://docs.thinnest.ai/api-reference/bring-your-own-keys/delete-byok-key.md): Removes your key for one job. Refused while BYOK is on, since a workspace on its own keys always has all three — turn BYOK off first, or replace the key with Add BYOK Key. Needs a **full** key. - [List BYOK Voices](https://docs.thinnest.ai/api-reference/bring-your-own-keys/list-byok-voices.md): The voices your own voice provider offers your key — what Set Agent BYOK Voice accepts. `sample` is a clip the provider hosts, free to play, when it has one. On Cartesia the list starts with your own cloned voices, then the whole library (up to 2,000 voices); if Cartesia is slow to answer the list c… - [Preview BYOK Voice](https://docs.thinnest.ai/api-reference/bring-your-own-keys/preview-byok-voice.md): Speaks one short line in a voice of your own voice provider, on your key, and answers with the audio itself. Your provider charges you for the characters, so `text` is capped at 200; without it the voice says a short greeting of ours in `language`, or the agent's language when you name an agent. Son… - [List Webhooks](https://docs.thinnest.ai/api-reference/webhooks/list-webhooks.md): The workspace's webhook endpoints, newest first — those added by API and those added in the console alike — each with its delivery state. Filter to one agent's with `agent`. - [Create Webhook](https://docs.thinnest.ai/api-reference/webhooks/create-webhook.md): Adds an endpoint for one agent's events — or, from a developer workspace, with `includeCustomers: true`, one endpoint for every agent in every one of your customers, each delivery's `data` carrying the `workspaceId` it is about. The response carries `signingSecret` **once**: store it to verify `x-th… - [Get Webhook](https://docs.thinnest.ai/api-reference/webhooks/get-webhook.md): One endpoint, with its delivery state: how many deliveries in a row have failed, and the last status, error and time. Never the signing secret. - [Update Webhook](https://docs.thinnest.ai/api-reference/webhooks/update-webhook.md): Changes an endpoint's `url`, `events` or `enabled`; fields you leave out are kept. Switching an endpoint back on (`enabled: true`) forgives its past failures, so after an outage: fix the receiver, catch up from the API on what it missed, then `PATCH { "enabled": true }`. The agent an endpoint belong… - [Delete Webhook](https://docs.thinnest.ai/api-reference/webhooks/delete-webhook.md): Removes the endpoint. Nothing more is sent to it, and its delivery history goes with it. A **build** key may do this. - [List Webhook Deliveries](https://docs.thinnest.ai/api-reference/webhooks/list-webhook-deliveries.md): The endpoint's recent deliveries, newest first — one row per event, however many attempts it took; 7 days (or the last 50, whichever is more) are kept. `status` and `error` are from the latest attempt, `0` when your endpoint could not be reached. `attempts` counts them, and `nextRetryAt` says when t… - [Test Webhook](https://docs.thinnest.ai/api-reference/webhooks/test-webhook.md): Sends one sample `lead.captured` event to the endpoint — its `data` marked `"test": true`, with obviously fake details — the same way a real event goes: signed JSON, Slack's own message format for a Slack URL, or a ticket email for an email address. It is recorded in the delivery history as `test`,… - [Redeliver Webhook Events](https://docs.thinnest.ai/api-reference/webhooks/redeliver-webhook-events.md): Sends events to this endpoint again — the same body, event id and `sentAt` they first had, with `x-thinnest-attempt` one higher. Either `{ "deliveryId": "whd_…" }` for one delivery, sent now (the answer says whether it arrived; if it fails it joins the retry schedule), or `{ "since": "" }`… - [Get Usage](https://docs.thinnest.ai/api-reference/usage/get-usage.md): Your plan, this calendar month's (UTC) replies against its allowance, the wallet, and replies per UTC day for the last `days` — the figures on the console's Usage page. Any key may call this, a **read-only** key included. - [Get Daily Usage](https://docs.thinnest.ai/api-reference/usage/get-daily-usage.md): Replies, calls and call minutes for every UTC day in the window — the Usage page's chart, quiet days as zeros. Give a rolling `days`, or a `from`/`to` range of up to 366 days reaching back at most 730 days; a `to` past today is cut to today. Any key may call this, a **read-only** key included. - [List Call Log](https://docs.thinnest.ai/api-reference/usage/list-call-log.md): The Usage page's call log: every call made or taken, newest first, with how it ended and what it was charged. `format=csv` returns the console's export instead — the same calls, up to 10,000, as a `calls.csv` attachment (columns Started, Direction, Surface, Agent, Number, From, Outcome, Status, Seco… - [List Wallet Ledger](https://docs.thinnest.ai/api-reference/usage/list-wallet-ledger.md): The balance history — every top-up, reply, call, WhatsApp message, number rental, refund and adjustment, newest first, with the balance after each (Settings → Billing → History). A developer's charges for its customers land on its own ledger, each naming the customer; `customer` narrows to one (read… - [List Invoices](https://docs.thinnest.ai/api-reference/usage/list-invoices.md): One invoice for every payment taken, newest first — the rows under Settings → Billing → History → Invoices. Amounts are integer **minor** units (paise, cents) of `currency`, as issued — not micro-units. `from`/`to` filter on the issue date. Any key may call this, a **read-only** key included. - [Get Customers Usage](https://docs.thinnest.ai/api-reference/usage/get-customers-usage.md): Developers: what each of your customers cost you over a range, in one call — spend net of refunds, how many charges, and spend by kind. Customers with no charges in the range are left out (list them with `GET /customers`). Without `from`/`to` it is this month so far; days are UTC and a range covers… - [Get Calls Summary](https://docs.thinnest.ai/api-reference/usage/get-calls-summary.md): Call totals for the last `days` — calls, inbound, outbound, answered, missed, failed, seconds, what they cost, by surface — and a series by hour (`days=1`) or by day, bucketed in your workspace's time zone. The dashboard's calls figures. Any key may call this, a **read-only** key included. - [Get WhatsApp Summary](https://docs.thinnest.ai/api-reference/usage/get-whatsapp-summary.md): WhatsApp messages sent and received, how many were delivered, read or failed (with failure codes), a series, and what they cost you — the WhatsApp dashboard's figures. Either a rolling `days` or a `from`/`to` range (inclusive, up to 366 days), in your workspace's time zone; `from`/`to` wins when bot… - [Get Dashboard](https://docs.thinnest.ai/api-reference/analytics/get-dashboard.md): The console Dashboard's figures for the whole workspace: how many agents, numbers, knowledge documents, campaigns, keys, members, contacts and leads; conversations unread and waiting on a person; calls in the last 30 days; and the balance as the account card shows it. The period charts are `GET /cal… - [Get Agent Analytics](https://docs.thinnest.ai/api-reference/analytics/get-agent-analytics.md): What the agent's Analytics page shows: totals, conversations/replies/leads per day, conversations by hour and by channel, the questions it could not answer and the questions asked most. Windows are rolling `days`; hours and days are UTC. `resolved` and `escalated` count conversations by their curren… - [List Customers](https://docs.thinnest.ai/api-reference/customers/list-customers.md): Your customer workspaces, newest first. Deleted customers waiting to be erased are left out unless you ask for them with `archived=true`. Call it from your own workspace: with the `Thinnest-Workspace` header it is refused, because a customer has no customers of its own. - [Create Customer](https://docs.thinnest.ai/api-reference/customers/create-customer.md): Creates a workspace for one of your customers and answers with its `id` — send that id as `Thinnest-Workspace` to act inside it. Your first customer makes your workspace a developer workspace; everything a customer uses (calls, messages, replies, number rental) is charged to your balance at your pla… - [Get Customer](https://docs.thinnest.ai/api-reference/customers/get-customer.md): One customer, with how many agents, active phone numbers and contacts it has and what its usage has cost you since the 1st of this month (UTC). Deleted customers waiting to be erased are found too. - [Update Customer](https://docs.thinnest.ai/api-reference/customers/update-customer.md): Changes a customer's `name`, `externalId`, `timezone`, `allottedCallLines` or `metadata`; fields you leave out are kept. `metadata` is merged, not replaced: keys you do not mention stay, and a key set to `null` is removed. A deleted customer must be restored before it can be changed. Needs a **full*… - [Delete Customer](https://docs.thinnest.ai/api-reference/customers/delete-customer.md): Deletes a customer: requests into it answer `410` from now on, every key made for it is revoked, its webhooks are switched off, its campaigns cancelled and its sequences and scheduled callbacks stopped (a call already in progress finishes). **30 days later it is erased** — every conversation, contac… - [Restore Customer](https://docs.thinnest.ai/api-reference/customers/restore-customer.md): Brings back a deleted customer before its erase date, with everything it held. It does not restart campaigns or revive the keys that were revoked when it was deleted: start those again and mint new keys. Restoring a customer that was never deleted answers it unchanged. Needs a **full** key. - [List Customer Keys](https://docs.thinnest.ai/api-reference/customers/list-customer-keys.md): Every API key made for this customer, newest first, revoked ones included: name, prefix, access level and when it was last used. Never the key itself. Not paged. A deleted customer answers `404`. - [Create Customer Key](https://docs.thinnest.ai/api-reference/customers/create-customer-key.md): Mints an API key that works in this one customer only — to give your customer its own API access, or to run one customer's integration on a key that cannot reach the others. The full key (`ta_live_…`) is in this response **once**; store it, because it is never shown again. Its usage is still charged… - [Revoke Customer Key](https://docs.thinnest.ai/api-reference/customers/revoke-customer-key.md): Revokes one of a customer's keys, immediately: its next request answers `401`. Answers with the key as it now is. A key already revoked is `404`. Needs a **full** key. - [Get Workspace](https://docs.thinnest.ai/api-reference/workspace/get-workspace.md): The workspace's id, name, console address (`slug`), time zone and when it was made. Plan and billing are not settings and are not here. - [Update Workspace](https://docs.thinnest.ai/api-reference/workspace/update-workspace.md): Renames the workspace, changes its time zone, or sets how many days calls are kept (`callRetentionDays`) — any of them. The name appears in invitation emails, so it follows the rules for a person's name: 2 to 80 characters (a longer one is refused with a 400), no web or email address, no markup. Eve… - [List Projects](https://docs.thinnest.ai/api-reference/projects/list-projects.md): The workspace's projects, newest first, each with how many agents are in it. - [Create Project](https://docs.thinnest.ai/api-reference/projects/create-project.md): Adds a project. Every workspace starts with its default project; a second one needs a plan with teams and projects, and is refused with `402` otherwise. A **build** key may do this. - [Get Project](https://docs.thinnest.ai/api-reference/projects/get-project.md): One project, with how many agents are in it. - [Update Project](https://docs.thinnest.ai/api-reference/projects/update-project.md): Renames a project. A **build** key may do this. - [Delete Project](https://docs.thinnest.ai/api-reference/projects/delete-project.md): Deletes a project and its team grants. Refused for the default project, and while any agent is still in the project — move them first. A **build** key may do this. - [List Teams](https://docs.thinnest.ai/api-reference/teams/list-teams.md): The workspace's teams, newest first, each with its members' ids and the projects it can reach. - [Create Team](https://docs.thinnest.ai/api-reference/teams/create-team.md): Adds an empty team; put members in it and grant it projects with the team's sub-resources. Teams need a plan with teams and projects, and are refused with `402` otherwise. A **build** key may do this. - [Get Team](https://docs.thinnest.ai/api-reference/teams/get-team.md): One team, with its members' ids and the projects it can reach. - [Update Team](https://docs.thinnest.ai/api-reference/teams/update-team.md): Renames a team. A **build** key may do this. - [Delete Team](https://docs.thinnest.ai/api-reference/teams/delete-team.md): Deletes a team and its grants. A project only this team could reach opens to the whole workspace. The people stay in the workspace. A **build** key may do this. - [Add Team Member](https://docs.thinnest.ai/api-reference/teams/add-team-member.md): Puts a member of the workspace in the team, so they can reach the team's projects. Repeating it changes nothing. Answers with the team. A **build** key may do this. - [Remove Team Member](https://docs.thinnest.ai/api-reference/teams/remove-team-member.md): Takes a member out of the team; they stay in the workspace. Taking out somebody who is not in the team changes nothing. Answers with the team. A **build** key may do this. - [Grant Team Project](https://docs.thinnest.ai/api-reference/teams/grant-team-project.md): Lets the team reach a project. A project's first grant **restricts** it: from then on only the teams granted it (plus owners and admins) can see its agents. Repeating it changes nothing. Answers with the team. A **build** key may do this. - [Revoke Team Project](https://docs.thinnest.ai/api-reference/teams/revoke-team-project.md): Takes a project out of the team's reach. When that was the project's last grant, the project opens to the whole workspace again. Answers with the team. A **build** key may do this. - [List Members](https://docs.thinnest.ai/api-reference/members/list-members.md): Everybody in the workspace, with their role — so a conversation can be assigned by email, or a role changed or a person removed by `id`. Not paged: every member is in one answer, and `nextCursor` is always null. Pending invitations are listed by List Invitations. - [Get Member](https://docs.thinnest.ai/api-reference/members/get-member.md): One person in the workspace, with their role. - [Update Member](https://docs.thinnest.ai/api-reference/members/update-member.md): Changes a member's role to `admin` or `member`. A key cannot make anybody an owner — do that in the console, signed in as one — and the workspace's last owner cannot be demoted. Needs a **full** key. - [Remove Member](https://docs.thinnest.ai/api-reference/members/remove-member.md): Removes a person from the workspace. Conversations assigned to them go back to the unassigned pool. The workspace's last owner cannot be removed. Needs a **full** key. - [List Invitations](https://docs.thinnest.ai/api-reference/invitations/list-invitations.md): Pending invitations, newest first. The link in each is only ever in the email, never here. - [Create Invitation](https://docs.thinnest.ai/api-reference/invitations/create-invitation.md): Invites somebody to the workspace and emails them a link that works for 14 days (the email goes out just after the answer). Inviting an address that already has a pending invitation sends it again with a fresh 14 days and its new role, and answers `200` instead of `201`. Every seat counts — the peop… - [Get Invitation](https://docs.thinnest.ai/api-reference/invitations/get-invitation.md): One invitation, whatever its status — pending, accepted or revoked. - [Revoke Invitation](https://docs.thinnest.ai/api-reference/invitations/revoke-invitation.md): Revokes a pending invitation: its link stops working and its seat is freed. An invitation that was accepted or already revoked is `404`. Needs a **full** key. - [Get Notification Preferences](https://docs.thinnest.ai/api-reference/notifications/get-notification-preferences.md): Every notification category, with whether it is muted and what of it is emailed. A category never changed is shown, not muted and not emailed. Not paged: `nextCursor` is always null. - [Update Notification Preferences](https://docs.thinnest.ai/api-reference/notifications/update-notification-preferences.md): Changes any categories at once, keyed by category: `muted` hides it from the feed and the bell (a critical notice shows regardless), `email` chooses what is emailed. A field you leave out keeps its value. Emails go only through the email sender connected in the console's notification settings; until… - [List Saved Replies](https://docs.thinnest.ai/api-reference/saved-replies/list-saved-replies.md): The workspace's saved replies, newest first. - [Create Saved Reply](https://docs.thinnest.ai/api-reference/saved-replies/create-saved-reply.md): Adds a saved reply, offered in the inbox composer as `/shortcut`. A leading `/` on the shortcut is dropped. A shortcut already used — in any capitalisation — is `409`. A **build** key may do this. - [Get Saved Reply](https://docs.thinnest.ai/api-reference/saved-replies/get-saved-reply.md): One saved reply. - [Update Saved Reply](https://docs.thinnest.ai/api-reference/saved-replies/update-saved-reply.md): Changes a saved reply's `shortcut`, `body`, or both. A **build** key may do this. - [Delete Saved Reply](https://docs.thinnest.ai/api-reference/saved-replies/delete-saved-reply.md): Deletes a saved reply. A **build** key may do this. - [List Contact Groups](https://docs.thinnest.ai/api-reference/contact-groups/list-contact-groups.md): Every group in the workspace, by name, each with how many contacts are in it. Returned whole: `nextCursor` is always null. - [Create Contact Group](https://docs.thinnest.ai/api-reference/contact-groups/create-contact-group.md): Creates an empty group. Names are unique in the workspace whatever the capitals; a second one answers `409`. A **build** key may do this. - [Get Contact Group](https://docs.thinnest.ai/api-reference/contact-groups/get-contact-group.md): One group and how many contacts are in it. - [Rename Contact Group](https://docs.thinnest.ai/api-reference/contact-groups/rename-contact-group.md): Renames a group. Campaigns aimed at it keep reaching it. A **build** key may do this. - [Delete Contact Group](https://docs.thinnest.ai/api-reference/contact-groups/delete-contact-group.md): Deletes the group and its memberships. Its contacts stay. A campaign not yet sent that was aimed at it no longer reaches anybody through it. A **build** key may do this. - [Add Contacts To Group](https://docs.thinnest.ai/api-reference/contact-groups/add-contacts-to-group.md): Adds up to 1,000 contacts to the group. Contacts already in it are left as they are (`added` counts only the new ones). Every id must be a contact in this workspace, or nothing is added and the answer is `404` naming them. A **build** key may do this. - [Remove Contacts From Group](https://docs.thinnest.ai/api-reference/contact-groups/remove-contacts-from-group.md): Takes up to 1,000 contacts out of the group. The contacts stay; ids not in the group are ignored (`removed` counts the ones taken out). A **build** key may do this. - [What's New](https://docs.thinnest.ai/whats-new/index.md): The latest changes to ThinnestAI, newest first: October 6 to 24, 2026. - [Early October 2026](https://docs.thinnest.ai/whats-new/early-october.md): What changed in ThinnestAI from October 1 to 5, 2026. - [Late September 2026](https://docs.thinnest.ai/whats-new/late-september.md): What changed in ThinnestAI from September 25 to 30, 2026. ## OpenAPI Specs - [openapi](/api-reference/openapi.json) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.