Channels API
A channel is where conversations happen: a phone number, a WhatsApp number, an Instagram or Messenger page, the website widget or an iMessage line. Its id is what calls and campaigns use as channel_id and outbound_channel_id. A number to call from can be bought with the Phone numbers API, with an owner's or admin's approval.
channels:readchannels:write41 endpointsShow
Phone channels
A phone channel is created with POST /v1/channels: an agent on one of the workspace's numbers, with a voice from GET /v1/voices. The agent calls from the number and answers its incoming calls. Afterwards its number, its incoming calls and its voice change with the phone-number, incoming-calls and voice endpoints, and DELETE /v1/channels/:id removes it with its conversations. A number that already rings another channel moves only when the request names that channel, as the dashboard asks before it moves one.
Website widget
POST /v1/channels/web-widget creates a website widget with its agents, modes and the websites it runs on, and answers the embed_key its snippet uses. PATCH /v1/channels/:id/web-widget changes only what you send: the allowed websites are never cleared by a request that leaves them out, and [] lets the widget run on any website.
Live Room
A Live Room is a page at its own link where visitors talk with the agent while the page shows what they need. POST /v1/channels/live-room creates one from a template, with the agent that answers, and it answers visitors as soon as it exists. PATCH /v1/channels/:id/live-room changes only what you send: accepting_calls: false stops new calls at once, questions replaces the list, and the on-screen sources and the look keep what the request leaves out. The logo is uploaded in the dashboard. Live Room is available once NuTalk switches it on for the workspace.
Messaging channels
PATCH /v1/channels/:id/messaging-settings sets who gets the chats the AI hands over, WhatsApp's pace and grouping of quick messages, and whether a chat your team writes first opens on hold. While a channel is in Testing, the AI answers only its test numbers, which you add, remove and start over here. A phone channel's outbound calls can get through phone menus with PUT /v1/channels/:id/ivr-navigation.
On a WhatsApp QR line, team_first_message_holds goes further: a person's reply from the line's phone or WhatsApp Web stops the agent in that chat. It is off until you set it. Nothing hands those chats back by itself, so a teammate does it from the inbox, and turning the setting off leaves them held. A WhatsApp API or SMS line refuses it.
On Messenger and Instagram the testers are people: POST /v1/channels/:id/ai-testers makes the person of one of the channel's chats a tester, and POST /v1/channels/:id/ai-testers/codes makes a code that makes whoever sends it to the Page or account a tester for 15 minutes. GET /v1/channels/:id/ai-testers lists every channel's testers, test numbers included.
DELETE /v1/channels/:id deletes a messaging channel too: a WhatsApp, Instagram or Messenger channel stops receiving messages, a website widget or Live Room stops answering visitors, and its conversations go with it. The Zoom channel is deleted on its own page in the dashboard.
WhatsApp templates
A WhatsApp API number (connected through Meta, not linked by QR) has the message templates that start a conversation or reopen one after the 24-hour window. GET /v1/channels/:id/whatsapp-templates lists them from the copy NuTalk keeps, each language on its own, with the fields a sender gives and what NuTalk fills each one from, which PATCH …/fields chooses. A new template is PENDING until Meta reviews it. Templates belong to the WhatsApp account, not to the channel: a new one, a delete and a restore reach every channel of that account.
The business profile customers see is read and changed with GET and PATCH /v1/channels/:id/whatsapp-profile: only the fields sent change. When Meta can't charge the account, NuTalk holds its templates; once a payment method is added in Meta, POST …/whatsapp-template-hold tries them again and starts the campaigns the hold paused, so it needs campaigns:write as well. The display name, the photo, the registration, the blue check and the two-step PIN stay in the dashboard.
These endpoints run the channel's own rules as the member who created the key. Any member's key reads; every change needs a key an owner or admin created, and any other key gets 403 forbidden. While the number's connection to Meta is expired, the template endpoints answer 409 conflict with connection_expired: reconnect it in NuTalk.
/v1/channelsList channels
Lists the workspace's channels (phone numbers, WhatsApp numbers, Instagram and Messenger pages, website widgets, iMessage lines), newest first.
channels:readA WhatsApp sync channel reads status: "unknown" (and health: "warning") while its sync service is not reporting, because its last known state cannot be trusted then; status_detail gives the reason (bridge_offline or no_heartbeat) and since, the last time it reported. It is null for every other channel.
The status filter matches the current status, so a channel that reads unknown is left out of it.
A phone (voice) channel also has language, the language it speaks, voice, the voice it speaks with (id and name; change it with PUT /v1/channels/:id/voice), receives_calls, whether calls to its number ring it now (inbound_enabled is only the channel's own switch), and incoming_calls_number, the number whose calls ring it now: its own, or an earlier number still routed to it (null when none does). They are null on other channels, and the last two on a Zoom Phone channel, whose lines are set on its Zoom page. phone_number_id is its number's id, and scheduling_mode the scheduling system set on any channel (null when none was set; PUT /v1/channels/:id/scheduling).
Query parameters
limitinteger · 1–100Results per page. Default: 20.
offsetinteger · at least 0Results to skip. Default: 0.
typewhatsapp | instagram | messenger | voice | web_widget | imessage | live_roomOnly channels of this type.
statusdisconnected | pending | connected | errorOnly channels in this status.
Errors
400validation_errorA query parameter is invalid (details.errors lists each one).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl "https://www.nutalk.ai/v1/channels?type=voice&status=connected" \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": [
{
"id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"name": "Support Agent - Voice",
"type": "voice",
"status": "connected",
"health": "healthy",
"phone_number": "+525512345678",
"phone_number_id": "2f6d8b0a-4c1e-4f3a-9b5d-7e9f1a3c5b72",
"inbound_enabled": true,
"voicemail_enabled": false,
"messages_monthly": 0,
"active_conversations": 0,
"connected_at": "2026-10-02T02:23:10.004+00:00",
"created_at": "2026-10-02T02:23:10.004+00:00",
"updated_at": "2026-10-02T02:23:10.004+00:00",
"status_detail": null,
"language": "es-MX",
"voice": {
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center"
},
"receives_calls": true,
"incoming_calls_number": "+525512345678",
"scheduling_mode": null
}
],
"pagination": {
"total": 1,
"limit": 20,
"offset": 0,
"has_more": false
}
}/v1/channels/:idGet a channel
Returns one channel with its call settings (voicemail, retries, callbacks, evaluation sampling) and the agents on it.
channels:readA WhatsApp sync channel reads status: "unknown" (and health: "warning") while its sync service is not reporting, because its last known state cannot be trusted then; status_detail gives the reason (bridge_offline or no_heartbeat) and since, the last time it reported. It is null for every other channel.
A phone (voice) channel also has language, the language it speaks, voice, the voice it speaks with (id and name; change it with PUT /v1/channels/:id/voice), receives_calls, whether calls to its number ring it now (inbound_enabled is only the channel's own switch), and incoming_calls_number, the number whose calls ring it now: its own, or an earlier number still routed to it (null when none does). They are null on other channels, and the last two on a Zoom Phone channel, whose lines are set on its Zoom page. phone_number_id is its number's id, and scheduling_mode the scheduling system set on any channel (null when none was set; PUT /v1/channels/:id/scheduling).
Phone (voice) channels are created with POST /v1/channels on a number the workspace has. Connecting WhatsApp, Instagram, Messenger, Apple Messages or Zoom and installing the website widget need a person (a Meta or Zoom login, a device), so those channels are created in the dashboard.
Path parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64 \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"name": "Support Agent - Voice",
"type": "voice",
"status": "connected",
"health": "healthy",
"phone_number": "+525512345678",
"phone_number_id": "2f6d8b0a-4c1e-4f3a-9b5d-7e9f1a3c5b72",
"inbound_enabled": true,
"voicemail_enabled": false,
"messages_monthly": 0,
"active_conversations": 0,
"connected_at": "2026-10-02T02:23:10.004+00:00",
"created_at": "2026-10-02T02:23:10.004+00:00",
"updated_at": "2026-10-02T02:23:10.004+00:00",
"status_detail": null,
"language": "es-MX",
"voice": {
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center"
},
"receives_calls": true,
"incoming_calls_number": "+525512345678",
"scheduling_mode": null,
"voicemail_message": null,
"block_anonymous_callers": false,
"auto_evaluate_enabled": true,
"evaluation_sample_rate": 1,
"retry_enabled": false,
"retry_config": {},
"callbacks_enabled": false,
"agents": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Support Agent"
}
]
}
}/v1/channelsCreate a phone channel
Puts an agent on one of the workspace's numbers with a voice of the list, as the dashboard's new phone channel does: the agent calls from the number and answers its incoming calls. The channel runs on the workspace's NuTalk call line and counts toward the plan's channels. Only type: "voice" is created here: WhatsApp, Instagram, Messenger, Apple Messages, the website widget and Zoom are connected in the dashboard, and numbers are bought or verified there.
channels:writeWorkspace keys only · acts as the key's creatorThis puts an agent in front of real callers: calls to the number reach it as soon as the channel exists. Confirm with the user first.
The channel is created whole or not at all: when the number can't be put on it, the new channel is deleted again.
Creating never waits for approval, except with confirm_move_from_channel_id: taking another channel's incoming calls is a change, so it waits for an owner's or admin's approval when the key's changes do, as the same move through PUT /v1/channels/{id}/incoming-calls does.
The change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Request body
typevoicerequiredvoice: a phone channel.
agent_iduuidrequiredThe agent that answers and calls on the number: one of the workspace's, not archived. An agent that isn't deployed yet answers once it is (POST /v1/agents/:id/deploy).
phone_number_iduuidThe number, by its id (a channel's phone_number_id). Send this or phone_number.
phone_numberstring · up to 16The number in E.164 (+528112345678): one the workspace bought or verified in NuTalk. Send this or phone_number_id.
namestring · 1–200 charactersThe channel's name. Default: the agent's name and " - Voice".
languagees-MX | en-USThe language the channel speaks. Default: the voice's.
voice_idstring · up to 64A voice of GET /v1/voices. Default: the agent's own voice when it is on the list, else Regina.
receive_callsbooleanWhether the number's incoming calls ring the new channel. Default: yes for a number bought through NuTalk (unless its calls ring in another workspace); a verified number only places calls.
confirm_move_from_channel_iduuidWhen the number's calls ring another of your channels: that channel's id (the 409 inbound_number_in_use gives it), confirming they move here. That channel stops receiving them.
Show 5 more fields
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errortype is not voice (other channels are connected in the dashboard), or the voice is not on the list (details.reason VOICE_NOT_OFFERED).403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.403forbiddenThe workspace has all the channels its plan allows (details.reason CHANNEL_LIMIT_REACHED: delete one, or change the plan in Settings → Billing) or no phone channels (CHANNEL_TYPE_NOT_ENABLED).404not_foundNo agent with this id in your workspace.404not_foundNo phone number with this id (or this number) in your workspace (numbers of other workspaces answer the same).409conflictThe agent is archived (details.reason AGENT_ARCHIVED), or NuTalk's voice servers have no free line for the workspace right now (VOICE_CAPACITY_UNAVAILABLE: try again later).409conflictThe number can't be a channel's number now (details.reason): its purchase failed (CALLER_ID_UNAVAILABLE), it waits for the carrier's approval (NUMBER_NOT_ACTIVE), its verification isn't finished (CALLER_ID_NOT_VERIFIED), it is suspended (phone_number_unavailable) or it is an AiBox line (number_managed_in_dashboard).409conflictThe number's incoming calls can't come here as asked (details.reason): it rings another of your channels (inbound_number_in_use, with details.channel_id and details.channel_name: confirm the move with confirm_move_from_channel_id), it answers on your AI PBX (number_answers_on_ai_pbx: remove its line on the AI PBX page first), it rings in another workspace (inbound_number_in_other_workspace), a verified number only places calls (verified_number), or its calls follow its carrier's settings (carrier_routes_number).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "voice",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"phone_number": "+525512345678",
"name": "Support line",
"voice_id": "9Godp7dNohUvXk6qp0gS"
}'GET /v1/channels/:id answers it{
"success": true,
"data": {
"id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"name": "Support line",
"type": "voice",
"status": "connected",
"health": "healthy",
"phone_number": "+525512345678",
"phone_number_id": "2f6d8b0a-4c1e-4f3a-9b5d-7e9f1a3c5b72",
"inbound_enabled": true,
"voicemail_enabled": false,
"voicemail_message": null,
"block_anonymous_callers": false,
"auto_evaluate_enabled": true,
"evaluation_sample_rate": 1,
"retry_enabled": false,
"retry_config": {},
"callbacks_enabled": false,
"messages_monthly": 0,
"active_conversations": 0,
"connected_at": "2026-10-02T02:23:10.004+00:00",
"created_at": "2026-10-02T02:23:10.004+00:00",
"updated_at": "2026-10-02T02:23:10.004+00:00",
"status_detail": null,
"language": "es-MX",
"voice": {
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center"
},
"receives_calls": true,
"incoming_calls_number": "+525512345678",
"scheduling_mode": null,
"agents": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Support Agent"
}
]
}
}/v1/channels/:id/phone-numberChange a channel's number
Gives a phone channel another of the workspace's numbers, as the channel page's number picker does: the agent calls from it from now on. Where the number's incoming calls ring changes only when you say so: receive_calls: true routes them to this channel, false takes them off it, and without it they stay where they ring (an earlier number still routed here keeps ringing the channel).
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorWith receive_calls: true, callers of the number reach the agent at once: confirm with the user first.
The change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
phone_number_iduuidThe new number, by its id (a channel's phone_number_id). Send this or phone_number.
phone_numberstring · up to 16The new number in E.164 (+528112345678): one the workspace bought or verified in NuTalk. Send this or phone_number_id.
receive_callsbooleantrue: the number's incoming calls ring this channel. false: they stop ringing it. Left out: they stay as they are.
confirm_move_from_channel_iduuidWhen the number's calls ring another of your channels: that channel's id (the 409 inbound_number_in_use gives it), confirming they move here. That channel stops receiving them.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorThe channel is not a phone (voice) channel (details.reason channel_not_voice): messaging channels are set up in the dashboard.403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).404not_foundNo phone number with this id (or this number) in your workspace (numbers of other workspaces answer the same).409conflictThe number can't be a channel's number now (details.reason): its purchase failed (CALLER_ID_UNAVAILABLE), it waits for the carrier's approval (NUMBER_NOT_ACTIVE), its verification isn't finished (CALLER_ID_NOT_VERIFIED), it is suspended (phone_number_unavailable) or it is an AiBox line (number_managed_in_dashboard).409conflictThe number's incoming calls can't come here as asked (details.reason): it rings another of your channels (inbound_number_in_use, with details.channel_id and details.channel_name: confirm the move with confirm_move_from_channel_id), it answers on your AI PBX (number_answers_on_ai_pbx: remove its line on the AI PBX page first), it rings in another workspace (inbound_number_in_other_workspace), a verified number only places calls (verified_number), or its calls follow its carrier's settings (carrier_routes_number).409conflictThe channel answers on its AiBox (details.reason channel_has_voice_device: its line changes in the dashboard), or it already receives calls on another number (channel_has_inbound_number: turn its incoming calls off first). receive_calls: false with a number NuTalk doesn't route, a Twilio or verified one (receive_calls_needs_switch): change the number without it, then stop the calls with PUT /v1/channels/{id}/incoming-calls. Nothing changed.409conflictThe channel is the Zoom channel, managed on its own page in the dashboard (details.reason ZOOM_CHANNEL_MANAGED).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/phone-number \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+525512345678",
"receive_calls": true
}'incoming_calls_number, the number whose calls ring it (an earlier number while its calls weren't moved; null when none does). moved_from_channel_id names the channel its calls moved from, if they did.{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"phone_number_id": "2f6d8b0a-4c1e-4f3a-9b5d-7e9f1a3c5b72",
"phone_number": "+525512345678",
"receives_calls": true,
"incoming_calls_number": "+525512345678",
"moved_from_channel_id": null
}
}/v1/channels/:id/incoming-callsTurn a channel's incoming calls on or off
The channel page's incoming-calls switch: receive_calls: true makes calls to the channel's number ring it, and its agent answers them; false stops them (the call is rejected: callers hear busy). A number whose calls ring another of your channels moves here only with confirm_move_from_channel_id, and that channel stops receiving them.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorTurning calls on puts the agent in front of real callers: confirm with the user first. Turning them off is a stop, so it never waits for approval.
The change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
receive_callsbooleanrequiredWhether calls to the channel's number ring it.
confirm_move_from_channel_iduuidWhen the number's calls ring another of your channels: that channel's id (the 409 inbound_number_in_use gives it), confirming they move here. That channel stops receiving them.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorThe channel is not a phone (voice) channel (details.reason channel_not_voice): messaging channels are set up in the dashboard.403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).409conflictThe channel has no number (details.reason no_phone_number: give it one with PUT /v1/channels/:id/phone-number), or its number can't take calls now (phone_number_not_active, phone_number_unavailable).409conflictThe number's incoming calls can't come here as asked (details.reason): it rings another of your channels (inbound_number_in_use, with details.channel_id and details.channel_name: confirm the move with confirm_move_from_channel_id), it answers on your AI PBX (number_answers_on_ai_pbx: remove its line on the AI PBX page first), it rings in another workspace (inbound_number_in_other_workspace), a verified number only places calls (verified_number), or its calls follow its carrier's settings (carrier_routes_number).409conflictThe channel is the Zoom channel, managed on its own page in the dashboard (details.reason ZOOM_CHANNEL_MANAGED).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/incoming-calls \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receive_calls": true
}'changed is false when they already did (or didn't); moved_from_channel_id and moved_from_channel_name name the channel the calls moved from.{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"receives_calls": true,
"changed": true,
"phone_number": "+525512345678",
"moved_from_channel_id": null,
"moved_from_channel_name": null
}
}/v1/channels/:id/voiceChange a channel's voice
Changes how a phone channel speaks: its voice (one of GET /v1/voices), its language and the voice's settings, as the channel's Voice editor saves them. Everything else stays as the channel has it. A newly picked voice starts with the settings its demo was recorded with (speed 1, stability 0.5, similarity 0.75), unless voice_settings says otherwise; a channel keeps a voice it already has even when it left the list.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorThe change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
voice_idstring · up to 64A voice of GET /v1/voices.
languagees-MX | en-USThe language the channel speaks (and understands): its speech recognition follows it. Unchanged when left out, even with another voice.
voice_settingsobjectThe voice's settings; the ones left out keep their value.
voice_settings.speednumber · 0.7–1.3How fast it speaks (1: normal).
voice_settings.stabilitynumber · 0–1Higher sounds steadier, lower more expressive.
voice_settings.similaritynumber · 0–1How closely it keeps to the original voice.
Show 2 more fields
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorNothing to change was sent, or the voice is not on the list (details.reason VOICE_NOT_OFFERED).400validation_errorThe channel is not a phone (voice) channel (details.reason channel_not_voice): messaging channels are set up in the dashboard.402validation_errorThe workspace's plan has no call line for the channel yet.403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).409conflictNuTalk's voice servers have no free line for the workspace (details.reason VOICE_CAPACITY_UNAVAILABLE), or the channel's call settings need to be saved once in the dashboard first (voice_settings_in_dashboard).409conflictThe channel is the Zoom channel, managed on its own page in the dashboard (details.reason ZOOM_CHANNEL_MANAGED).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/voice \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"voice_id": "9Godp7dNohUvXk6qp0gS",
"voice_settings": {
"speed": 1.1
}
}'{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"voice": {
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center"
},
"language": "es-MX",
"voice_settings": {
"speed": 1.1,
"stability": 0.5,
"similarity": 0.75
}
}
}/v1/voicesList the voices
The voices a phone channel can speak with: the same list every voice picker in the dashboard offers, featured ones first, with a recording of each. Regina (default: true) is the one a new channel starts with when neither the request nor its agent picks another.
channels:readQuery parameters
languagees-MX | en-USOnly the voices that speak this language.
Errors
400validation_errorA query parameter is invalid (details.errors lists each one).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl "https://www.nutalk.ai/v1/voices?language=es-MX" \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": [
{
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center",
"description": "Young, friendly and clear. Built for phone support and sales.",
"language": "es-MX",
"gender": "female",
"age": "young",
"preview_url": "https://www.nutalk.ai/voice-previews/9Godp7dNohUvXk6qp0gS.mp3",
"default": true
}
]
}/v1/channels/:idDelete a channel
Deletes a channel of any type, as the dashboard does. A phone channel's number stops ringing it and becomes free for another channel, and campaigns that called from it lose their number. A WhatsApp, Instagram or Messenger channel stops receiving messages: NuTalk unsubscribes from its account's webhooks at Meta. A website widget or Live Room stops answering visitors, and an Apple Messages channel's Mac is unlinked. Its conversations and their messages are permanently deleted: delete_message_history: true (in the body or the query string) confirms that. The Zoom channel is deleted on its own page in the dashboard, which retires its lines.
channels:writeWaits for approvalWorkspace keys only · acts as the key's creatorNothing brings the channel or its history back: confirm with the user first.
The change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Query parameters
delete_message_historytrue | falsetrue confirms the delete (or send it in the body).
Request body
delete_message_historybooleantrue (here or in the query string, and required in one of them): confirms that the channel's conversations and messages are permanently deleted with it.
Unless its key was set not to wait, nothing is removed yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errordelete_message_history is not true (details.reason confirmation_required).403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).409conflictThe channel is the Zoom channel, managed on its own page in the dashboard (details.reason ZOOM_CHANNEL_MANAGED).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X DELETE https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64 \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"delete_message_history": true
}'{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"deleted": true,
"message_history_deleted": true,
"conversations_deleted": 12,
"messages_deleted": 148
}
}/v1/channels/:idUpdate a channel
Changes the settings you send: the channel's name, its automatic evaluation (on or off, the share of finished conversations evaluated, and on messaging channels how long a silence ends a conversation) and, on a phone channel, whether it refuses callers with a hidden or unknown number. Numbers, connections and the widget's look are set in the dashboard.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorThe change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
namestring · 1–200 charactersThe channel's name.
auto_evaluate_enabledbooleanEvaluate the channel's finished conversations and calls against the agent's goals and competencies.
evaluation_sample_ratenumber · 0–1The share of finished conversations evaluated (1: every one).
conversation_inactivity_timeout_minutesinteger · 5–43,200Messaging channels only: minutes of silence after which a conversation counts as finished (and is evaluated).
block_anonymous_callersbooleanPhone (voice) channels only: refuse calls with a hidden, restricted or unknown caller ID.
Show 1 more field
Bringing numbers from your phone provider or releasing them, adding a card, the Mexican compliance profile, connecting WhatsApp, Instagram, Messenger or Zoom, assigning AiBox lines, the widget's avatar and voice for calls, voicemail settings, and a WhatsApp number's other settings (its display name, photo, registration, blue check and two-step PIN). These stay in the dashboard.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorNo field to change was sent, or a setting doesn't apply to the channel's type.403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.403forbiddenA Zoom channel is renamed by a key whose creator is not an owner or admin (details.reason ZOOM_MANAGERS_ONLY).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64 \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Support line",
"evaluation_sample_rate": 0.5,
"block_anonymous_callers": true
}'GET /v1/channels/:id answers it{
"success": true,
"data": {
"id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"name": "Support line",
"type": "voice",
"status": "connected",
"health": "healthy",
"phone_number": "+525512345678",
"phone_number_id": "2f6d8b0a-4c1e-4f3a-9b5d-7e9f1a3c5b72",
"inbound_enabled": true,
"voicemail_enabled": false,
"voicemail_message": null,
"block_anonymous_callers": true,
"auto_evaluate_enabled": true,
"evaluation_sample_rate": 0.5,
"retry_enabled": false,
"retry_config": {},
"callbacks_enabled": false,
"messages_monthly": 0,
"active_conversations": 0,
"connected_at": "2026-10-02T02:23:10.004+00:00",
"created_at": "2026-10-02T02:23:10.004+00:00",
"updated_at": "2026-10-12T18:20:05.117+00:00",
"status_detail": null,
"language": "es-MX",
"voice": {
"id": "9Godp7dNohUvXk6qp0gS",
"name": "Regina - Contact Center"
},
"receives_calls": true,
"incoming_calls_number": "+525512345678",
"scheduling_mode": null,
"agents": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Support Agent"
}
]
}
}/v1/channels/:id/agentPut an agent on a channel
Makes the agent the one that answers on the channel, with its deployed version, as the dashboard's channel picker does: any other agent on the channel is taken off it (a website widget's chat and calls both go to this agent), and later deploys of the agent move the channel to the new version. The agent must be deployed and not archived.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorCustomers reach the agent at once: on a messaging channel, whether the AI answers them also depends on the channel's AI mode (PUT /v1/channels/:id/ai-mode).
The change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
agent_iduuidrequiredThe agent to put on the channel.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.403forbiddenThe channel is a Zoom channel and the key's creator is not an owner or admin.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).404not_foundNo agent with this id in your workspace.409conflictThe agent is archived (details.reason AGENT_ARCHIVED) or has no deployed version, or the website widget's settings are missing.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/agent \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "550e8400-e29b-41d4-a716-446655440000"
}'{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"agent_version_id": "2ea87934-6e03-4db7-80f2-ac753b724c82"
}
}/v1/channels/:id/agentTake the agent off a channel
Takes an agent off the channel, as the agent page's unlink does: everything that makes it answer there goes (the channel's binding to its version, its widget roles, the assignment), and nothing of another agent's. The channel stays connected, with its settings, and has no agent until one is put on it. Name the agent with agent_id (in the body or the query string); without it, the channel's only agent is taken off.
channels:writeWaits for approvalWorkspace keys only · acts as the key's creatorThe change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Query parameters
agent_iduuidThe agent to take off (or send it in the body).
Request body
agent_iduuidThe agent to take off. Default: the channel's only agent.
Unless its key was set not to wait, nothing is removed yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).404not_foundNo agent with this id in your workspace.409conflictThe channel has more than one agent and agent_id is missing (details.agent_ids), or it is a Zoom channel, which always has an agent (details.reason ZOOM_CHANNEL_NEEDS_AGENT).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X DELETE https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/agent \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "550e8400-e29b-41d4-a716-446655440000"
}'unlinked is false when the agent (or, without agent_id, any agent) didn't answer on the channel: nothing changed.{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"unlinked": true
}
}/v1/channels/:id/ai-modeSwitch who answers a channel
Switches who answers a messaging channel's chats (WhatsApp, Instagram, Messenger, website widget, Apple Messages): off, the team answers (the AI only answers the chats a person let it answer); testing, the AI answers only the channel's test numbers (phone-number channels); live, the AI answers new conversations, and with live_scope: all existing chats too from their next message; paused, the emergency stop; resume, the AI back on exactly as it was before the pause. It goes through the dashboard's one switch, under the channel's lock, and is recorded in the channel's activity.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorThis puts the AI in front of real customers (or takes it away): switch with the same care as in the dashboard. Only owners and admins switch it: the key's creator must be one of them.
Path parameters
iduuidrequiredThe channel id.
Request body
modeoff | testing | live | paused | resumerequiredWho answers.
live_scopenew | allWith live only: new (only conversations that start from now; the default when the channel was off or testing) or all (existing chats too, from the customer's next message; nothing older is answered).
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errortesting on a channel whose chats are not phone numbers (details.reason TESTING_NEEDS_PHONE_NUMBERS).403forbiddenThe member who created the key is not an owner or admin, has left the workspace, or the key is a reseller key.404not_foundNo messaging channel with this id in your workspace (a phone channel has no AI mode).409conflictresume on a channel that is not paused (NOT_PAUSED) or has no state to go back to (RESUME_NEEDS_MODE), or live with new on a channel live for every chat (LIVE_CANNOT_NARROW: turn it off first).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-mode \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "live",
"live_scope": "new"
}'changed is false when the channel already was in that mode; open_chats counts the open chats the AI and the team answer.{
"success": true,
"data": {
"channel_id": "8a44ec22-04c7-4352-b90a-0a35d5aee0ec",
"mode": "live",
"live_scope": "new",
"changed": true,
"resumed": false,
"paused_from": null,
"testing_available": false,
"test_numbers": 0,
"open_chats": {
"ai": 0,
"team": 14
},
"mode_changed_at": "2026-10-12T18:25:40.902+00:00"
}
}/v1/channels/:id/schedulingSet a channel's scheduling system
Sets the only scheduling system the agent on the channel may book with: calcom, business (Business appointments), clinic, restaurant, or none to turn booking off on this channel. A system can be chosen only when the workspace has it (its module, or a connected Cal.com), and an agent books one way only: when its booking method was chosen, the channel takes that method or none.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorThe change runs the dashboard's channel rules as the member who created the key: the key needs channels:write and that member a role that changes channels (owner, admin or builder). A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
modenone | calcom | business | clinic | restaurantrequiredThe scheduling system.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorThe workspace doesn't have this system (details.reason: module_missing, calcom_not_connected, ai_channels_not_wired), or the agent books with another one (scheduling_mode_not_agent_system).403forbiddenThe member who created the key has a role that can't change channels or has left the workspace, or the key is a reseller key.404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).409conflictThe change would give the channel's agent a second way to book (details.reason booking_method_conflict).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PUT https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/scheduling \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "clinic"
}'null: none was set). With business, a warning with code agent_cannot_book_business says the channel's agent has no meeting type it can book: the change is saved, customers who ask for a meeting are told the team will confirm it, and the workspace's owners, admins and builders are notified. Choose the agent's meeting types to fix it.{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"mode": "clinic",
"previous_mode": null
}
}/v1/channels/web-widgetCreate a website widget
Creates a website widget channel, as Channels → Website widget does: an agent that chats and one that takes calls (each with a deployed version; the call agent defaults to the chat agent), the modes the workspace has, the websites it runs on, its greeting and its look. The answer carries embed_key, which the website's snippet uses; it is public by design.
channels:writeWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Once its snippet is on a website, the agent answers its visitors.
Request body
namestring · up to 120The channel's name (default: the agent's name and "Website Widget").
chat_agent_iduuidThe agent that chats; it needs a deployed version.
voice_agent_iduuidThe agent that takes calls (default: the chat agent).
modesstring[] · 1–2 itemsWhat visitors can do: chat, voice (calls) or both. A mode must be one the workspace has.
default_modechat | voiceThe mode it opens in; one of its modes.
allowed_domainsstring[] · 0–50 itemsThe websites it runs on; [] lets it run on any website.
greetingstring · up to 500What it says first.
consent_textstring | null · up to 2,000A consent notice shown before visitors start.
themeobjectIts look; only the settings sent change.
theme.accentstringA hex color such as #14b8a6.
theme.positionbottom-right | bottom-leftWhere the launcher sits.
theme.assistant_namestring | null · up to 60The name shown on the widget.
theme.localeauto | en | esIts language; auto follows the visitor's browser.
Show 9 more fields
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).403forbiddenA mode the workspace doesn't have (details.reason WIDGET_MODE_NOT_INCLUDED: it is added in Billing), the plan's channel limit, or the member who created the key can't create channels.404not_foundAn agent isn't the workspace's.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/web-widget \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Website",
"chat_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"modes": [
"chat",
"voice"
],
"allowed_domains": [
"example.com",
"www.example.com"
],
"theme": {
"accent": "#14b8a6",
"assistant_name": "Sofía"
}
}'{
"success": true,
"data": {
"channel_id": "8a44ec22-04c7-4352-b90a-0a35d5aee0ec",
"name": "Website",
"embed_key": "ww_00000000aaaa4aaa8aaa000000000001",
"chat_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"voice_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"modes": [
"chat",
"voice"
],
"default_mode": "chat",
"allowed_domains": [
"example.com",
"www.example.com"
],
"greeting": "Hi! Would you like to chat or start a call?",
"consent_text": null,
"theme": {
"accent": "#14b8a6",
"position": "bottom-right",
"assistant_name": "Sofía",
"locale": "auto"
},
"capture_fields": {
"name": true,
"email": true,
"phone": false,
"require_before_start": false
}
}
}/v1/channels/:id/web-widgetGet a website widget's settings
The website widget's agents, modes, the websites it runs on, greeting, consent notice, look, the visitor details it asks for and its embed key.
channels:readPath parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a website widget (details.reason not_web_widget).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/web-widget \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"channel_id": "8a44ec22-04c7-4352-b90a-0a35d5aee0ec",
"name": "Website",
"embed_key": "ww_00000000aaaa4aaa8aaa000000000001",
"chat_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"voice_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"modes": [
"chat",
"voice"
],
"default_mode": "chat",
"allowed_domains": [
"example.com",
"www.example.com"
],
"greeting": "Hi! Would you like to chat or start a call?",
"consent_text": null,
"theme": {
"accent": "#14b8a6",
"position": "bottom-right",
"assistant_name": "Sofía",
"locale": "auto"
},
"capture_fields": {
"name": true,
"email": true,
"phone": false,
"require_before_start": false
}
}
}/v1/channels/:id/web-widgetChange a website widget
Changes the settings sent; the rest stay as saved (the websites it runs on are never cleared by a request that leaves them out). A mode switched on must be one the workspace has; one already on stays. capture_fields sets the visitor details it asks for and whether it asks before they start.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
chat_agent_iduuidThe agent that chats; it needs a deployed version.
voice_agent_iduuidThe agent that takes calls (default: the chat agent).
modesstring[] · 1–2 itemsWhat visitors can do: chat, voice (calls) or both. A mode must be one the workspace has.
default_modechat | voiceThe mode it opens in; one of its modes.
allowed_domainsstring[] · 0–50 itemsThe websites it runs on; [] lets it run on any website.
greetingstring · up to 500What it says first.
consent_textstring | null · up to 2,000A consent notice shown before visitors start.
themeobjectIts look; only the settings sent change.
theme.accentstringA hex color such as #14b8a6.
theme.positionbottom-right | bottom-leftWhere the launcher sits.
theme.assistant_namestring | null · up to 60The name shown on the widget.
theme.localeauto | en | esIts language; auto follows the visitor's browser.
capture_fieldsobjectThe visitor details it asks for.
capture_fields.namebooleanAsk the visitor's name.
capture_fields.emailbooleanAsk their email.
capture_fields.phonebooleanAsk their phone.
capture_fields.require_before_startbooleanAsk before the chat or call starts.
Show 13 more fields
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a website widget (details.reason not_web_widget), or an agent has no deployed version.403forbiddenA mode switched on the workspace doesn't have (WIDGET_MODE_NOT_INCLUDED), or the member who created the key can't change channels.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/web-widget \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"allowed_domains": [
"example.com",
"shop.example.com"
],
"greeting": "Hi! How can I help?"
}'{
"success": true,
"data": {
"channel_id": "8a44ec22-04c7-4352-b90a-0a35d5aee0ec",
"name": "Website",
"embed_key": "ww_00000000aaaa4aaa8aaa000000000001",
"chat_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"voice_agent_id": "550e8400-e29b-41d4-a716-446655440000",
"modes": [
"chat",
"voice"
],
"default_mode": "chat",
"allowed_domains": [
"example.com",
"www.example.com"
],
"greeting": "Hi! Would you like to chat or start a call?",
"consent_text": null,
"theme": {
"accent": "#14b8a6",
"position": "bottom-right",
"assistant_name": "Sofía",
"locale": "auto"
},
"capture_fields": {
"name": true,
"email": true,
"phone": false,
"require_before_start": false
}
}
}/v1/channels/:id/messaging-settingsGet a messaging channel's settings
For a WhatsApp, Instagram, Messenger or Apple Messages channel: who gets its chats when the AI hands them over (default_operator_id, a teammate), WhatsApp's human-like timing and grouping of quick messages in a row, and whether a team message from outside NuTalk holds the chat (team_first_message_holds: the first message on Apple Messages, Instagram and Messenger, a reply from the phone or WhatsApp Web on a WhatsApp QR line). A setting the channel doesn't take is null. The AI mode is GET /v1/channels/{id}.
channels:readPath parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a messaging channel (details.reason not_messaging_channel).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/messaging-settings \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"type": "whatsapp",
"default_operator_id": "4c8e2a6b-1d3f-4e5a-9b7c-0f2d4a6c8e14",
"humanlike_timing": true,
"turn_grouping": true,
"team_first_message_holds": null
}
}/v1/channels/:id/messaging-settingsChange a messaging channel's settings
Changes the settings sent; the rest stay as saved, and never the channel's transport or its AI mode (PUT /v1/channels/{id}/ai-mode). A setting the channel doesn't take is refused. Setting an Instagram or Messenger channel's default operator also assigns them every chat nobody has, so it needs conversations:write too.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
default_operator_iduuid | nullA teammate who gets the chats the AI hands over: an owner, admin, operator, clinic manager, clinic messages or receptionist (who take chats in the inbox); null for none. WhatsApp, Instagram and Messenger.
humanlike_timingbooleanWhatsApp: the AI answers with a person's pace.
turn_groupingbooleanWhatsApp: quick messages in a row get one answer.
team_first_message_holdsbooleanApple Messages, Instagram, Messenger: a chat the team writes first opens on hold, with the AI waiting. WhatsApp QR lines: a person's reply from the line's phone or WhatsApp Web stops the agent in that chat until a teammate hands it back. Off on WhatsApp QR lines until set; nothing hands those chats back by itself, and turning it off leaves them held. Reminders, follow-ups and campaign messages in those chats follow the agent's automations (appointment_reminders.remind_held_chats, follow_ups.follow_up_held_chats, campaign_messages.send_to_held_chats). A WhatsApp API or SMS line refuses it.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for this setting), has left the workspace, or the key is a reseller key.400validation_errorThe default operator isn't a teammate of the workspace who takes chats (a viewer or a builder doesn't), the channel isn't a messaging channel, or it doesn't take a setting sent (details.errors names it; on WhatsApp, team_first_message_holds is for QR lines only).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/messaging-settings \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"default_operator_id": "4c8e2a6b-1d3f-4e5a-9b7c-0f2d4a6c8e14",
"humanlike_timing": false
}'{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"type": "whatsapp",
"default_operator_id": "4c8e2a6b-1d3f-4e5a-9b7c-0f2d4a6c8e14",
"humanlike_timing": false,
"turn_grouping": true,
"team_first_message_holds": null
}
}/v1/channels/:id/ai-test-numbersList a channel's test numbers
The numbers the AI answers while the channel is in Testing (AI mode testing), with the AI's last reply to each and whether it remembers earlier messages. WhatsApp and Apple Messages channels.
channels:readPath parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp or Apple Messages channel (details.reason not_testing_channel).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-test-numbers \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": [
{
"id": "3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a",
"phone_number": "+525512345678",
"created_at": "2026-10-20T16:00:00.000Z",
"last_ai_reply_at": "2026-10-26T18:20:00.000Z",
"last_ai_reply_status": "sent",
"remembers": true,
"last_reset_at": null
}
]
}/v1/channels/:id/ai-test-numbersAdd a test number
Adds a number the AI answers while the channel is in Testing, from the next message it sends; that phone's existing chat is answered too. At most 10 per channel. Answers the channel's test numbers. Only add your team's own phones.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
phone_numberstringrequiredThe number in E.164, with its country code.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp or Apple Messages channel (details.reason not_testing_channel).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for this setting), has left the workspace, or the key is a reseller key.409conflictThe number is already a test number (TEST_NUMBER_EXISTS), or the channel has 10 (TEST_NUMBERS_LIMIT).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-test-numbers \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "+525512345678"
}'{
"success": true,
"data": [
{
"id": "3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a",
"phone_number": "+525512345678",
"created_at": "2026-10-20T16:00:00.000Z",
"last_ai_reply_at": "2026-10-26T18:20:00.000Z",
"last_ai_reply_status": "sent",
"remembers": true,
"last_reset_at": null
}
]
}/v1/channels/:id/ai-test-numbers/:number_idRemove a test number
The AI stops answering the number while the channel is in Testing. A stop, so it never waits for an owner's approval.
channels:writeWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
number_iduuidrequiredThe test number's id, from GET /v1/channels/{id}/ai-test-numbers.
Errors
404not_foundNo channel or test number with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp or Apple Messages channel (details.reason not_testing_channel).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for this setting), has left the workspace, or the key is a reseller key.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X DELETE https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-test-numbers/3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"id": "3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a",
"deleted": true
}
}/v1/channels/:id/ai-test-numbers/:number_id/start-overStart the AI over with a test number
The test number's next message is answered as if it were the first: the AI forgets the earlier messages (messages), what it remembers about the person (memory), or both. Nothing is deleted. It starts the person over, as Start over does in the dashboard: every chat of that phone in the workspace, on any channel, not only this channel's.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
number_iduuidrequiredThe test number's id, from GET /v1/channels/{id}/ai-test-numbers.
Request body
messagesbooleanrequiredForget the earlier messages.
memorybooleanrequiredForget what it remembers about the person.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel or test number with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp or Apple Messages channel (details.reason not_testing_channel).403forbiddenThe member who created the key can't change channels (owner, admin or builder), has left the workspace, or the key is a reseller key.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-test-numbers/3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a/start-over \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": true,
"memory": true
}'{
"success": true,
"data": {
"id": "3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a",
"messages": true,
"memory": true,
"started_over": true
}
}/v1/channels/live-roomCreate a Live Room
Creates a Live Room, as Channels → Live Room does: a page at its own link where visitors talk with the agent and the page shows what they need as they talk. It starts from a template's questions and screens and the workspace's brand, with the agent that answers (it needs a deployed version) and books the way that agent books. Answers the room as GET /v1/channels/{id}/live-room does, with its url and its embed_key (public by design: a website's snippet carries it).
channels:writeWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
It answers visitors as soon as it is created: share its link, or embed it on a website.
Request body
namestring · up to 80requiredThe channel's name.
slugstringrequiredIts link: 3 to 48 lowercase letters, numbers and single hyphens, unique across NuTalk.
templatebook_visit | book_meeting | answer_questions | blankrequiredWhat it starts from: book_visit (clinic visits), book_meeting (business meetings), answer_questions or blank. The last two book nothing: the team follows up.
agent_iduuidrequiredThe agent that answers.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorThe link's shape (details.reason SLUG_INVALID) or a reserved one (SLUG_RESERVED), or the agent has no deployed version.403forbiddenThe plan doesn't include Live Room or its channel limit is reached, the agent is archived, or the member who created the key can't create channels.404not_foundNuTalk hasn't switched Live Room on for the workspace, or the agent isn't the workspace's.409conflictThe link is taken (details.reason SLUG_TAKEN, with a free one close to it in details.suggestion).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/live-room \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Live Room",
"slug": "clinica-sol",
"template": "book_visit",
"agent_id": "550e8400-e29b-41d4-a716-446655440000"
}'{
"success": true,
"data": {
"channel_id": "5e1f7a3b-9c2d-4e6f-8a1b-2c3d4e5f6a7b",
"name": "Live Room",
"slug": "clinica-sol",
"url": "https://www.nutalk.ai/r/clinica-sol",
"embed_key": "lr_clinica-sol",
"template": "book_visit",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"accepting_calls": true,
"questions": [
{
"id": "service",
"kind": "service",
"label": {
"en": "What would you like to book?",
"es": "¿Qué te gustaría agendar?"
},
"choices": [],
"required": true
},
{
"id": "name",
"kind": "name",
"label": {
"en": "Your name",
"es": "Tu nombre"
},
"choices": [],
"required": true
}
],
"on_screen": {
"services": true,
"places": true,
"team": false,
"knowledge": false,
"prices": true,
"knowledge_ids": []
},
"look": {
"business_name": "Clínica Sol",
"logo_url": null,
"accent": "#0b7476",
"theme": "dark",
"background": "soft",
"font": "nutalk",
"orb": "sphere",
"motion": "full",
"notes": "beside",
"captions": true,
"texts": {
"en": {
"title": "Talk with Sofía",
"sub": "Book your visit in a minute.",
"start": "Start talking"
},
"es": {
"title": "Habla con Sofía",
"sub": "Agenda tu visita en un minuto.",
"start": "Empezar a hablar"
}
}
},
"allowed_domains": [
"clinicasol.mx"
],
"max_call_seconds": 600,
"consent": {
"en": "",
"es": ""
}
}
}/v1/channels/:id/live-roomGet a Live Room's settings
The Live Room's link and embed key, the agent that answers, whether visitors can talk now, the questions it asks, what it may show on screen, its look, the websites that embed it, the longest call and the recording notice. The agent is changed with PUT /v1/channels/{id}/agent.
channels:readPath parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a Live Room (details.reason not_live_room).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/live-room \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"channel_id": "5e1f7a3b-9c2d-4e6f-8a1b-2c3d4e5f6a7b",
"name": "Live Room",
"slug": "clinica-sol",
"url": "https://www.nutalk.ai/r/clinica-sol",
"embed_key": "lr_clinica-sol",
"template": "book_visit",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"accepting_calls": true,
"questions": [
{
"id": "service",
"kind": "service",
"label": {
"en": "What would you like to book?",
"es": "¿Qué te gustaría agendar?"
},
"choices": [],
"required": true
},
{
"id": "name",
"kind": "name",
"label": {
"en": "Your name",
"es": "Tu nombre"
},
"choices": [],
"required": true
}
],
"on_screen": {
"services": true,
"places": true,
"team": false,
"knowledge": false,
"prices": true,
"knowledge_ids": []
},
"look": {
"business_name": "Clínica Sol",
"logo_url": null,
"accent": "#0b7476",
"theme": "dark",
"background": "soft",
"font": "nutalk",
"orb": "sphere",
"motion": "full",
"notes": "beside",
"captions": true,
"texts": {
"en": {
"title": "Talk with Sofía",
"sub": "Book your visit in a minute.",
"start": "Start talking"
},
"es": {
"title": "Habla con Sofía",
"sub": "Agenda tu visita en un minuto.",
"start": "Empezar a hablar"
}
}
},
"allowed_domains": [
"clinicasol.mx"
],
"max_call_seconds": 600,
"consent": {
"en": "",
"es": ""
}
}
}/v1/channels/:id/live-roomChange a Live Room
Changes the settings sent; the rest stay as saved. questions replaces the whole list; on_screen, look, consent and the texts change only what they name. accepting_calls: false stops new calls at once and never waits for approval.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key, keeping every setting the request leaves out as saved. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
accepting_callsbooleanWhether visitors can talk now. false stops new calls at once; the page then offers a form the team follows up on.
slugstringIts link: https://www.nutalk.ai/r/<slug>, 3 to 48 lowercase letters, numbers and single hyphens, unique across NuTalk. A link that was shared stops working when it changes.
allowed_domainsstring[] · 0–20 itemsThe websites that may embed it ([]: any).
max_call_secondsinteger · 300–1,200The longest call: 300, 600 (default), 900 or 1200 seconds.
consentobjectThe recording notice before the call, per language (en, es, up to 400 characters); empty shows NuTalk's default. A language left out stays as saved.
questionsarray · 0–12 itemsWhat the agent asks, in order, replacing the list: each with its own id (lowercase letters, digits, _), a kind (service and location offer the business's own; choice takes 2 to 8 choices; name, phone, email, text), its label per language and required. Name, phone and email answers fill the contact; the rest go with the appointment.
on_screenobjectWhat the agent may show on screen: services, places, team, knowledge and prices (off: services show without prices). The ones left out stay as saved; the knowledge items allowed on screen are chosen in the dashboard.
lookobjectIts look: business_name, accent (a hex color), theme (dark, light, auto), background (soft, plain, tint), font (nutalk, inter, system), orb (sphere, halo, minimal), motion (full, reduced), notes (beside, hidden), captions, and texts per language (title, sub, start). What it leaves out stays as saved; the logo is uploaded in the dashboard.
Show 4 more fields
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a Live Room (details.reason not_live_room).400validation_errorA setting the room refuses (details.field names it, as look.business_name or questions.2): a question without its own id or wording, a choice question without 2 to 8 choices, a website that isn't an address, a reserved or malformed link.403forbiddenThe member who created the key can't change channels (owner, admin or builder), has left the workspace, or the key is a reseller key.409conflictThe link is taken (details.reason SLUG_TAKEN, with a free one in details.suggestion).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/live-room \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"accepting_calls": false,
"look": {
"texts": {
"es": {
"title": "Habla con Sofía"
}
}
}
}'{
"success": true,
"data": {
"channel_id": "5e1f7a3b-9c2d-4e6f-8a1b-2c3d4e5f6a7b",
"name": "Live Room",
"slug": "clinica-sol",
"url": "https://www.nutalk.ai/r/clinica-sol",
"embed_key": "lr_clinica-sol",
"template": "book_visit",
"agent_id": "550e8400-e29b-41d4-a716-446655440000",
"accepting_calls": false,
"questions": [
{
"id": "service",
"kind": "service",
"label": {
"en": "What would you like to book?",
"es": "¿Qué te gustaría agendar?"
},
"choices": [],
"required": true
},
{
"id": "name",
"kind": "name",
"label": {
"en": "Your name",
"es": "Tu nombre"
},
"choices": [],
"required": true
}
],
"on_screen": {
"services": true,
"places": true,
"team": false,
"knowledge": false,
"prices": true,
"knowledge_ids": []
},
"look": {
"business_name": "Clínica Sol",
"logo_url": null,
"accent": "#0b7476",
"theme": "dark",
"background": "soft",
"font": "nutalk",
"orb": "sphere",
"motion": "full",
"notes": "beside",
"captions": true,
"texts": {
"en": {
"title": "Talk with Sofía",
"sub": "Book your visit in a minute.",
"start": "Start talking"
},
"es": {
"title": "Habla con Sofía",
"sub": "Agenda tu visita en un minuto.",
"start": "Empezar a hablar"
}
}
},
"allowed_domains": [
"clinicasol.mx"
],
"max_call_seconds": 600,
"consent": {
"en": "",
"es": ""
}
}
}/v1/channels/:id/ai-testersList a channel's testers
Who the AI answers while the channel is in Testing (AI mode testing): a WhatsApp or Apple Messages channel's test numbers (kind phone), or the people who are a Messenger or Instagram channel's testers (kind messenger or instagram, with their name and chat), and how each was added (added_via: number, chat or code). With the AI's last reply to each and whether it remembers earlier messages.
channels:readPath parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp, Apple Messages, Messenger or Instagram channel (details.reason not_testing_channel).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-testers \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": [
{
"id": "4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b",
"kind": "messenger",
"phone_number": null,
"name": "Ana López",
"conversation_id": "5f0c2b1e-8d3a-4c6e-9b7f-2a4d6e8c0b13",
"added_via": "code",
"code_id": "6a8c0e2f-4b5d-4f7a-8c9e-0a1b2c3d4e5f",
"created_at": "2026-10-27T15:41:05.000Z",
"last_ai_reply_at": "2026-10-27T15:43:20.000Z",
"last_ai_reply_status": "delivered",
"remembers": false,
"last_reset_at": null
}
]
}{
"success": true,
"data": [
{
"id": "3d5e7f9a-1b2c-4d4e-8f6a-7b8c9d0e1f2a",
"kind": "phone",
"phone_number": "+525512345678",
"name": null,
"conversation_id": null,
"added_via": "number",
"code_id": null,
"created_at": "2026-10-20T16:00:00.000Z",
"last_ai_reply_at": "2026-10-26T18:20:00.000Z",
"last_ai_reply_status": "sent",
"remembers": true,
"last_reset_at": null
}
]
}/v1/channels/:id/ai-testersAdd a tester from a chat
Makes the person of one of a Messenger or Instagram channel's chats a tester: while the channel is in Testing the AI answers them from their next message. At most 10 per channel. Find the chat with GET /v1/conversations?channel_id=…. Answers the channel's testers. Only add your team's own people.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
conversation_iduuidrequiredOne of the channel's chats: its person becomes a tester.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel or conversation (a chat of another channel) with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp, Apple Messages, Messenger or Instagram channel (details.reason not_testing_channel).400validation_errorThe channel is a WhatsApp or Apple Messages channel, whose testers are phone numbers: add one with POST /v1/channels/{id}/ai-test-numbers (details.reason use_test_numbers).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for testers), has left the workspace, or the key is a reseller key.409conflictThe person is already a tester (TESTER_EXISTS), or the channel has 10 (TESTERS_LIMIT).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-testers \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conversation_id": "5f0c2b1e-8d3a-4c6e-9b7f-2a4d6e8c0b13"
}'{
"success": true,
"data": [
{
"id": "4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b",
"kind": "messenger",
"phone_number": null,
"name": "Ana López",
"conversation_id": "5f0c2b1e-8d3a-4c6e-9b7f-2a4d6e8c0b13",
"added_via": "chat",
"code_id": null,
"created_at": "2026-10-27T15:41:05.000Z",
"last_ai_reply_at": "2026-10-27T15:43:20.000Z",
"last_ai_reply_status": "delivered",
"remembers": false,
"last_reset_at": null
}
]
}/v1/channels/:id/ai-testers/:tester_idRemove a tester
The AI stops answering the tester (a test number or a person) while the channel is in Testing; their chat goes back to your team. A stop, so it never waits for an owner's approval.
channels:writeWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
tester_iduuidrequiredThe tester's id, from GET /v1/channels/{id}/ai-testers (a test number's is its id in ai-test-numbers).
Errors
404not_foundNo channel or tester with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp, Apple Messages, Messenger or Instagram channel (details.reason not_testing_channel).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for testers), has left the workspace, or the key is a reseller key.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X DELETE https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-testers/4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"id": "4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b",
"deleted": true
}
}/v1/channels/:id/ai-testers/:tester_id/start-overStart the AI over with a tester
The tester's next message is answered as if it were the first: the AI forgets the earlier messages (messages), what it remembers about the person (memory), or both. Nothing is deleted. A test number starts over as a person, in every chat of that phone in the workspace; a Messenger or Instagram tester in their chat on this channel.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
tester_iduuidrequiredThe tester's id, from GET /v1/channels/{id}/ai-testers (a test number's is its id in ai-test-numbers).
Request body
messagesbooleanrequiredForget the earlier messages.
memorybooleanrequiredForget what it remembers about the person.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel or tester with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp, Apple Messages, Messenger or Instagram channel (details.reason not_testing_channel).403forbiddenThe member who created the key can't start a tester over (owners, admins, builders and operators can), has left the workspace, or the key is a reseller key.409conflictThe Messenger or Instagram tester's chat is gone, so there's nothing to start over (NO_CHAT).Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-testers/4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b/start-over \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": true,
"memory": true
}'{
"success": true,
"data": {
"id": "4e6f8a0b-2c3d-4e5f-9a7b-8c9d0e1f2a3b",
"messages": true,
"memory": true,
"started_over": true
}
}/v1/channels/:id/ai-testers/codesMake a tester code
Makes a tester code for a Messenger or Instagram channel, as "Add me with a code" does: for 15 minutes, whoever sends it as a message to the Page or account (link opens that chat) becomes a tester, up to the channel's 10, and NuTalk answers them "You're a tester". The code is answered only here, once: NuTalk keeps its sha256, never the code. Share it with your team only. GET /v1/channels/{id}/ai-testers then lists who it added (their code_id).
channels:writeWorkspace keys only · acts as the key's creatorA change runs the dashboard's own rules as the member who created the key. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp, Apple Messages, Messenger or Instagram channel (details.reason not_testing_channel).400validation_errorThe channel is a WhatsApp or Apple Messages channel, whose testers are phone numbers: add one with POST /v1/channels/{id}/ai-test-numbers (details.reason use_test_numbers).403forbiddenThe member who created the key isn't an owner or admin (the role the dashboard asks for testers), has left the workspace, or the key is a reseller key.403forbiddenThe key's changes wait for an owner's or admin's approval (details.reason CHANGES_WAIT_FOR_APPROVAL): a code makes whoever sends it a tester at once, so such a key adds testers from their chats instead, which waits. A control plane key makes none either (CONTROL_PLANE_KEY): the control plane keeps every answer, and a code is never kept.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/ai-testers/codes \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"id": "6a8c0e2f-4b5d-4f7a-8c9e-0a1b2c3d4e5f",
"code": "NT-48Q2",
"expires_at": "2026-10-27T15:56:00.000Z",
"link": "https://m.me/104000000000001",
"asset_name": "Café Aurora"
}
}/v1/channels/:id/whatsapp-templatesList a WhatsApp number's templates
The templates of the number's WhatsApp account, each language on its own, from the copy NuTalk keeps (Meta's updates keep it current; synced_at says when NuTalk last read the whole account). fields lists what a sender gives when sending one, with what NuTalk fills each from (source, set with PATCH …/fields). Send an approved one with POST /v1/conversations/{id}/messages. Deleted templates only with status=DELETED.
channels:readWorkspace keys only · acts as the key's creatorRead as the member who created the key (any role that sees the workspace). A reseller key is refused.
Path parameters
iduuidrequiredThe channel id.
Query parameters
statusall | APPROVED | PENDING | REJECTED | PAUSED | DISABLED | IN_APPEAL | PENDING_DELETION | DELETED | LIMIT_EXCEEDED | ARCHIVED | UNKNOWNOnly this status; all is every one but deleted. Default: all.
categoryMARKETING | UTILITY | AUTHENTICATIONOnly this category.
searchstring · up to 100Words in the name or the text.
limitinteger · 1–100Results per page. Default: 20.
offsetinteger · at least 0Results to skip. Default: 0.
Show 1 more field
Errors
400validation_errorA query parameter is invalid (details.errors lists each one).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl "https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates?status=APPROVED" \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": [
{
"id": "1234567890123456",
"name": "appointment_reminder",
"language": "es_MX",
"category": "UTILITY",
"status": "APPROVED",
"display_name": "Appointment reminder",
"components": [
{
"type": "BODY",
"text": "Hola {{first_name}}, te esperamos el {{date}} a las {{time}}.",
"example": {
"body_text_named_params": [
{
"param_name": "first_name",
"example": "Ana"
}
]
}
}
],
"fields": [
{
"part": "body",
"key": "first_name",
"source_key": "first_name",
"button": null,
"source": "contact.first_name",
"label": "First name",
"fallback": "paciente",
"example": "Ana"
},
{
"part": "body",
"key": "date",
"source_key": "date",
"button": null,
"source": "appointment.date",
"label": "Date",
"fallback": null,
"example": "24 de octubre"
}
],
"quality_score": {
"score": "GREEN"
},
"rejected_reason": null,
"rejection_info": null,
"pause": null,
"paused_until": null,
"archived_at": null,
"locked": false,
"locked_note": null,
"previous_category": null,
"submitted_at": "2026-10-20T16:00:00.000Z",
"status_since": "2026-10-20T16:04:12.000Z"
}
],
"pagination": {
"total": 1,
"limit": 20,
"offset": 0,
"has_more": false
},
"synced_at": "2026-10-26T17:55:00.000Z"
}/v1/channels/:id/whatsapp-templatesCreate a WhatsApp template
Sends a new template to Meta for review, as Manage Templates does. It belongs to the number's WhatsApp account (every channel of that account sees it) and is PENDING until Meta decides. Name it with lowercase letters, digits and _; give examples of its fields.
channels:writeWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
namestring · up to 512requiredLowercase letters, digits and _, starting with a letter.
languagestringrequiredMeta's language code (es_MX).
categoryMARKETING | UTILITY | AUTHENTICATIONrequiredMeta's category.
componentsobject[]requiredThe message's parts: a BODY, and optionally a HEADER, a FOOTER and BUTTONS.
components[].typeHEADER | BODY | FOOTER | BUTTONSrequiredThe part of the message.
components[].formatTEXT | IMAGE | VIDEO | DOCUMENTA header's kind.
components[].textstringThe text, with numbered fields ({{1}}); the body takes up to 1,024 characters, the footer 60.
components[].exampleobjectExamples of the fields for Meta's review: header_text (a list), body_text (a list of lists).
components[].buttonsobject[]For BUTTONS: the buttons.
Show 5 more fields
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.409conflictThe account already has a template with this name.429rate_limitedThe account reached Meta's limit on new templates (100 an hour).403forbiddenThe key wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.409conflictThe number's connection to Meta expired (details.reason connection_expired): reconnect it in NuTalk.503service_unavailableMeta didn't answer: try again later.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "appointment_reminder",
"language": "es_MX",
"category": "UTILITY",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, te esperamos el {{2}}.",
"example": {
"body_text": [
[
"Ana",
"24 de octubre"
]
]
}
}
]
}'{
"success": true,
"data": {
"id": "1234567890123456",
"name": "appointment_reminder",
"language": "es_MX",
"category": "UTILITY",
"status": "PENDING"
}
}/v1/channels/:id/whatsapp-templates/:template_nameGet a WhatsApp template
One template of the number's WhatsApp account, every language of it, from NuTalk's copy.
channels:readWorkspace keys only · acts as the key's creatorRead as the member who created the key (any role that sees the workspace). A reseller key is refused.
Path parameters
iduuidrequiredThe channel id.
template_namestring · up to 512requiredThe template's name: lowercase letters, digits and _, as WhatsApp holds it.
Errors
404not_foundNo channel or template with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates/appointment_reminder \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"name": "appointment_reminder",
"languages": [
{
"id": "1234567890123456",
"name": "appointment_reminder",
"language": "es_MX",
"category": "UTILITY",
"status": "APPROVED",
"display_name": "Appointment reminder",
"components": [
{
"type": "BODY",
"text": "Hola {{first_name}}, te esperamos el {{date}} a las {{time}}.",
"example": {
"body_text_named_params": [
{
"param_name": "first_name",
"example": "Ana"
}
]
}
}
],
"fields": [
{
"part": "body",
"key": "first_name",
"source_key": "first_name",
"button": null,
"source": "contact.first_name",
"label": "First name",
"fallback": "paciente",
"example": "Ana"
},
{
"part": "body",
"key": "date",
"source_key": "date",
"button": null,
"source": "appointment.date",
"label": "Date",
"fallback": null,
"example": "24 de octubre"
}
],
"quality_score": {
"score": "GREEN"
},
"rejected_reason": null,
"rejection_info": null,
"pause": null,
"paused_until": null,
"archived_at": null,
"locked": false,
"locked_note": null,
"previous_category": null,
"submitted_at": "2026-10-20T16:00:00.000Z",
"status_since": "2026-10-20T16:04:12.000Z"
}
]
}
}/v1/channels/:id/whatsapp-templates/:template_nameDelete a WhatsApp template
Deletes the template from the number's WhatsApp account at Meta: every language of it, or only the one language names. It is gone for every channel and campaign of that account, and a campaign step that sends it stops working.
channels:writeWaits for approvalWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
template_namestring · up to 512requiredThe template's name: lowercase letters, digits and _, as WhatsApp holds it.
Query parameters
languagestringOnly this language, as Meta codes it (es_MX); without it, every language of the template.
Unless its key was set not to wait, nothing is removed yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorA query parameter is invalid (details.errors lists each one).404not_foundNo such channel, or WhatsApp holds no such template (details.reason TEMPLATE_NOT_FOUND: it is already gone).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.403forbiddenThe key wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.409conflictThe number's connection to Meta expired (details.reason connection_expired): reconnect it in NuTalk.503service_unavailableMeta didn't answer: try again later.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X DELETE "https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates/appointment_reminder?language=es_MX" \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"name": "appointment_reminder",
"language": "es_MX",
"deleted": true
}
}/v1/channels/:id/whatsapp-templates/:template_name/unarchiveRestore an archived WhatsApp template
Restores one archived language of a template: WhatsApp archives a template unused for 12 months, and restoring it brings back the status it had. Its status reads UNKNOWN until NuTalk's next read of the account says which.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
template_namestring · up to 512requiredThe template's name: lowercase letters, digits and _, as WhatsApp holds it.
Query parameters
languagestringrequiredThe language, as Meta codes it (es_MX, en_US, es): each language of a template is its own.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorA query parameter is invalid (details.errors lists each one).404not_foundNo channel or template with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.409conflictWhatsApp didn't restore it (its own reason in the message).403forbiddenThe key wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.409conflictThe number's connection to Meta expired (details.reason connection_expired): reconnect it in NuTalk.503service_unavailableMeta didn't answer: try again later.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST "https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates/appointment_reminder/unarchive?language=es_MX" \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"name": "appointment_reminder",
"language": "es_MX",
"restored": true
}
}/v1/channels/:id/whatsapp-templates/:template_name/fieldsSet what fills a WhatsApp template's fields
Saves what fills each field of one language of a template when someone sends it, as the Templates tab does: the contact's data, one of the workspace's contact fields, the contact's next appointment, the business's name, or typed by the sender. field_sources is keyed by the field's source_key (GET lists it: first_name, 1, header.1) and replaces the language's sources. It stays in NuTalk: WhatsApp never sees it, so it needs no review.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
template_namestring · up to 512requiredThe template's name: lowercase letters, digits and _, as WhatsApp holds it.
Query parameters
languagestringrequiredThe language, as Meta codes it (es_MX, en_US, es): each language of a template is its own.
Request body
field_sourcesobjectrequiredBy the field's source_key, up to 50 fields, each {label, source, fallback}: label (up to 40 characters) is how the field is called; source is what fills it: contact.first_name, contact.last_name, contact.full_name, contact.phone, contact.email, contact.custom.<field key>, appointment.date, appointment.time, appointment.service, appointment.with, appointment.place, business.name, or ask (the sender types it); fallback (up to 200, optional) is what goes for a contact source when the contact has no value.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorA name isn't a field of this template, or a contact field isn't the workspace's (details.fields lists them).404not_foundNo channel or template with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.403forbiddenThe key wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH "https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-templates/appointment_reminder/fields?language=es_MX" \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"field_sources": {
"first_name": {
"label": "First name",
"source": "contact.first_name",
"fallback": "paciente"
},
"date": {
"label": "Date",
"source": "appointment.date"
}
}
}'{
"success": true,
"data": {
"name": "appointment_reminder",
"language": "es_MX",
"field_sources": {
"first_name": {
"label": "First name",
"source": "contact.first_name",
"fallback": "paciente"
},
"date": {
"label": "Date",
"source": "appointment.date",
"fallback": null
}
}
}
}/v1/channels/:id/whatsapp-profileGet a WhatsApp number's business profile
The business profile customers see on the number (about, description, category, address, email, websites, photo) as WhatsApp last answered it, asked again when older than five minutes, with its name and blue check. two_step_pin says whether NuTalk keeps the number's two-step PIN, never the PIN; refusal says why WhatsApp's last ask got no answer.
channels:readWorkspace keys only · acts as the key's creatorRead as the member who created the key (any role that sees the workspace). A reseller key is refused.
Path parameters
iduuidrequiredThe channel id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.503service_unavailableMeta didn't answer: try again later.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-profile \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"profile": {
"about": "Citas de lunes a sábado.",
"description": "Clínica dental en Monterrey.",
"category": "HEALTH",
"address": "Av. Constitución 100, Monterrey",
"email": "citas@clinic.example.com",
"websites": [
"https://clinic.example.com"
],
"photo_url": null
},
"number": {
"display_phone_number": "+52 81 5555 0123",
"verified_name": "Clinica Dental",
"name_status": "APPROVED",
"is_official": false,
"blue_check_status": null,
"business_verification": "verified"
},
"answered_at": "2026-10-26T18:00:00.000Z",
"refusal": null,
"two_step_pin": true,
"can_edit": true
}
}/v1/channels/:id/whatsapp-profileChange a WhatsApp number's business profile
Changes the fields sent on WhatsApp, as the Profile tab does: only those go to WhatsApp, the others stay as they are there. Customers see the change at once. NuTalk checks WhatsApp's limits first; when WhatsApp still refuses, nothing changes and its own words come back with the field they name. The name, the photo and the blue check stay in the dashboard (the channel's Profile tab).
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Path parameters
iduuidrequiredThe channel id.
Request body
aboutstring · 1–139 charactersThe short line under the name.
descriptionstring · up to 512What the business does.
categoryALCOHOL | APPAREL | AUTO | BEAUTY | EDU | ENTERTAIN | EVENT_PLAN | FINANCE | GOVT | GROCERY | HEALTH | HOTEL | NONPROFIT | ONLINE_GAMBLING | OTC_DRUGS | OTHER | PHYSICAL_GAMBLING | PROF_SERVICES | RESTAURANT | RETAIL | TRAVEL | Meta's category; empty for none.
addressstring · up to 256The address.
emailstring · up to 128A contact email.
websitesstring[] · 0–2 itemsUp to two websites; the list replaces the ones WhatsApp shows.
Show 2 more fields
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
400validation_errorThe body is not JSON, or a field is missing or invalid (details.errors lists each field).400validation_errorA field breaks WhatsApp's limits (details.issues), or WhatsApp refused it (details.reason refused, details.field).409conflictWhatsApp hasn't answered with the profile yet (profile_not_read), or the number's connection can't change it (no_access, expired).404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.403forbiddenThe key wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.503service_unavailableMeta didn't answer: try again later.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X PATCH https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-profile \
-H "Authorization: Bearer $NUTALK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"about": "Citas de lunes a sábado, 9 a 19 h.",
"websites": [
"https://clinic.example.com"
]
}'{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"profile": {
"about": "Citas de lunes a sábado.",
"description": "Clínica dental en Monterrey.",
"category": "HEALTH",
"address": "Av. Constitución 100, Monterrey",
"email": "citas@clinic.example.com",
"websites": [
"https://clinic.example.com"
],
"photo_url": null
},
"number": {
"display_phone_number": "+52 81 5555 0123",
"verified_name": "Clinica Dental",
"name_status": "APPROVED",
"is_official": false,
"blue_check_status": null,
"business_verification": "verified"
},
"answered_at": "2026-10-26T18:00:00.000Z",
"refusal": null,
"two_step_pin": true,
"can_edit": true
}
}/v1/channels/:id/whatsapp-template-holdTry a held WhatsApp account's templates again
"I added a card": when Meta refused a template for payment, NuTalk holds the account's templates (a send answers whatsapp_payment_hold) and pauses the campaigns that send them. After you add a payment method in Meta, this sends the account's next template to Meta as a try and starts the paused campaigns again so one of theirs can be it. Meta's answer to the try ends the hold, or keeps it. The campaigns it starts again send to customers, so it needs campaigns:write as well.
channels:writeCan wait for approvalWorkspace keys only · acts as the key's creatorIt runs the dashboard's own rules as the member who created the key: templates and the business profile belong to the WhatsApp account, so that member must be an owner or admin. A key whose creator has left the workspace, and a reseller key, are refused.
Meta charges the try, and the campaigns that start again send to customers: confirm with the user first.
Path parameters
iduuidrequiredThe channel id.
Nothing changes yet: the call answers 202 with data.change_request, and runs once an owner or admin approves it in Settings → API keys. Follow it with GET /v1/change-requests/:id.
Errors
404not_foundNo channel with this id in your workspace (ids of other workspaces answer the same).400validation_errorThe channel isn't a WhatsApp API number (details.reason not_whatsapp_api_number): a number linked by QR has no templates or business profile of its own.409conflictThe account's templates aren't on hold.403forbiddenThe key lacks campaigns:write (the campaigns the try starts again send to customers), or it wasn't created by an owner or admin, its creator has left the workspace, or it is a reseller key.Plus the errors every request can return (401, 403, 429, 500): Errors.
curl -X POST https://www.nutalk.ai/v1/channels/9f19ef32-eaef-452c-bebc-14d9759cdb64/whatsapp-template-hold \ -H "Authorization: Bearer $NUTALK_API_KEY"
{
"success": true,
"data": {
"channel_id": "9f19ef32-eaef-452c-bebc-14d9759cdb64",
"held_at": "2026-10-25T15:00:00.000Z",
"refused_at": "2026-10-26T09:00:00.000Z",
"try_requested_at": "2026-10-26T18:10:00.000Z",
"campaigns_resumed": 2
}
}