A valid request URL is required to generate request examples{
"success": true,
"data": {
"phoneNumber": "+14155551234",
"aiPaused": true,
"pausedAt": "2026-09-24T16:30:00.000Z",
"pausedBy": "key_3f9a12",
"note": "handled by Kiwi ops (ticket 8812)",
"conversationId": "conv_9d2f01",
"webhookSubscribed": true
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Pause the AI for a contact
Stop the AI from answering ONE person’s texts so your own system — your software, or your team working through the API — can handle the conversation, then turn the AI back on with resumeSMSContactAI when you are done. The pause is per person and covers their texts to any of your numbers that an agent answers. It silences the AI, not your team: a number that routes straight to your team keeps ringing your team, and the person’s texts to it reach your team as before (the event says handledBy: direct_dial). WHILE THE PAUSE IS ON:
- Every text the person sends is still received, recorded on its conversation and shown in Observe. The AI just does not reply.
- Each of those texts is delivered to your webhooks subscribed to
sms.message.received(createWebhook), withaiPaused: trueandhandledBy: api— that is your system’s cue to answer. - Answer with sendSMSMessage (POST /sms/messages) from the number they texted. A message to a person who texted you within the last 24 hours is a reply (
kind: replyon the receipt), so it is not held to quiet hours unless your workspace uses the strict posture. Consent, opt-outs (STOP), the send cap and the first-contact disclosure apply exactly as they do to every send. - The pause holds until you clear it. It never expires on its own. * If the AI is already composing a reply to the person when you pause, that reply is not sent: their text is recorded and delivered to your webhooks with
handledBy: api, like every text during the pause. The races either way are a few milliseconds wide: a reply already being sent at the instant you pause still goes out, and a text that arrives at the instant you resume can still be delivered to you as paused. CHECK THE RESPONSE’SwebhookSubscribed. It is true when the workspace has an active webhook subscribed tosms.message.received. When it is false, nothing will tell your system that the person texted — their texts are still recorded and shown in Observe, but no one answers them. Create a webhook for the event (createWebhook), or re-enable a disabled or auto-disabled one (updateWebhook withstatus: active), then rely on the pause. WHAT OUTRANKS THE PAUSE. A teammate who has taken the thread over keeps it: the person’s texts go to that teammate, not to your system (the event sayshandledBy: seat), and sendSMSMessage answers 409conversation_busy(seat_owns_thread) for that person from any of your numbers, so your system never talks over a person. A conversation handed to an external agent through the Agent Bridge stays with that agent, and group texts are always handled by your team. The pause covers text messages only — calls from the number still reach your agent. MARKER. When the pause begins and the person has an open text conversation, an “AI paused” marker is added to it, so Observe shows when the AI was paused and by whom. Idempotent: pausing a contact that is already paused keeps the originalpausedAtandpausedBy(who first paused it) and adds no second marker. A non-emptynotereplaces the stored note; an empty or omitted note keeps it. You may pause a number that has never texted you — the pause is in place for their first text.
A valid request URL is required to generate request examples{
"success": true,
"data": {
"phoneNumber": "+14155551234",
"aiPaused": true,
"pausedAt": "2026-09-24T16:30:00.000Z",
"pausedBy": "key_3f9a12",
"note": "handled by Kiwi ops (ticket 8812)",
"conversationId": "conv_9d2f01",
"webhookSubscribed": true
}
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"type": "about:blank",
"title": "<string>",
"status": 123,
"detail": "<string>",
"instance": "<string>",
"code": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
Flowyte secret API key (Authorization: Bearer flowyte_sk_live_…). Scope-gated; is scoped to your organization — a key can never reach another tenant. The listed scopes in each operation's apiKey requirement are the scopes that key must hold. The tokenUrl is nominal: keys are minted in the dashboard.
- Token URL
- /api/v1/api-keys
Path Parameters
The contact's number in E.164 format (e.g. +14155551234).
Body
Optional context for pausing the AI for one contact. The body may be omitted.
Why the AI is paused or who is handling the conversation (at most 500 characters, whitespace-trimmed). Shown on getSMSContact and on the conversation's "AI paused" marker in Observe. An empty or omitted note keeps the one already stored.
500"handled by Kiwi ops (ticket 8812)"