← All action domains

Telephony

105 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.

Add a step or objection handler

call_scripts.add_stepwriteadmin only

Add one entry to a call script. A 'step' is appended to the end of the ordered path through the call; an 'objection' is a handler and must name which objection it answers. Titles and bodies may use fields such as {{first_name | "there"}}; any tag the script cannot fill is saved as written and listed back in unknown_fields.

Parameters

FieldTypeRequiredDescription
script_idstring (uuid)requiredThe script to add to.
kind"step" | "objection"optional'step' is part of the ordered path through the call; 'objection' is a handler reached for when the customer pushes back. Default: "step"
titlestringrequiredShort name for this part, e.g. “Open + reason for the call”. May use fields, filled from the person on the call when it connects: {{first_name}}, {{company_name}}, {{industry}}, {{deal.stage}}, {{custom.<key>}} and the rest listed by call_scripts.fields. Add a fallback for blanks with {{first_name | "there"}}.
bodystringoptionalThe words, or the beats to hit. This is what a rep reads on screen mid-call. May use fields, filled from the person on the call when it connects: {{first_name}}, {{company_name}}, {{industry}}, {{deal.stage}}, {{custom.<key>}} and the rest listed by call_scripts.fields. Add a fallback for blanks with {{first_name | "there"}}.
objection_key"price" | "budget_timing" | "needs_approval" | "using_competitor" | "happy_with_current" | "no_perceived_need" | … 7 moreoptionalRequired when kind is 'objection'. Which objection this answers, from the same closed list the call analytics use.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.add_step \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "script_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "title": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_add_step at https://app.chirply.io/api/mcp, same bearer token, same input.

Read where a live call is in its script

call_scripts.assist_readingread

Take one reading of a call in progress: which step of its script the conversation appears to be in, and whether the customer just raised an objection the script has a handler for. Reads the call's transcript only — it never speaks to the customer and changes nothing about the call. Requires the script to have assist switched on and the number to have transcription on. Uses and bills its own OpenRouter account.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to read.
script_idstring (uuid)optionalRead against this script instead of the call's default.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.assist_reading \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_assist_reading at https://app.chirply.io/api/mcp, same bearer token, same input.

Create a call script

call_scripts.createwriteadmin only

Create an empty call script. Add its steps afterwards with call_scripts.add_step. Nothing is shown to a rep until the script has at least one step.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat this script is called, e.g. “Outbound cold call”.
descriptionstringoptionalWho it's for and when to use it. Shown under the name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a call script

call_scripts.deletewriteconfirmadmin only

Permanently delete a call script and every step and objection handler in it. This cannot be undone. Any call queue or phone number pointing at it simply stops offering a script.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe script to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a step or objection handler

call_scripts.delete_stepwriteconfirmadmin only

Permanently delete one entry from a call script. This cannot be undone. The remaining entries keep their order.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe entry to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.delete_step \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_delete_step at https://app.chirply.io/api/mcp, same bearer token, same input.

Insert field

call_scripts.fieldsread

List every field a call script step can use — the contact's own details, their open deal, their history as a customer, the rep and the account, then this account's contact custom fields — each with the exact tag to write (for example {{first_name}}) and an example value. This is the list behind the editor's Insert field picker. Read-only.

Parameters

FieldTypeRequiredDescription
querystringoptionalOnly fields whose tag, name or group contains every word of this, e.g. “deal” or “first”.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.fields \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "example"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_fields at https://app.chirply.io/api/mcp, same bearer token, same input.

Open the script for this call

call_scripts.for_callread

Answer “which script is this live call on?” in one hop: the script the call opens with by default (taken from the call queue it was dialed from, then from the line it is on), every other script a rep could switch to, and the latest AI assist reading already taken on the call. This is exactly what the in-call script panel paints itself from. Step titles and bodies come back PERSONALIZED — every field such as {{first_name}} or {{deal.stage}} is filled from the call's own contact (or from contact_id when given), a blank field shows its fallback or nothing, and no raw tag is ever returned; the words as written stay alongside in title_template and body_template, and personalized_for names who they were filled from. Read-only — it never speaks to the customer, changes nothing about the call, and unlike call_scripts.assist_reading it takes no NEW reading, so it costs nothing.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid) (or null)optionalThe live call to resolve a script for. Omit or pass null to get just the switchable options with no default.
script_idstring (uuid)optionalReturn this script instead of the call's default — what happens when a rep picks a different one from the panel.
contact_idstring (uuid)optionalFill the script's fields from this contact instead of the call's own. With script_id and no call_id, this previews a script for a contact before anyone dials.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.for_call \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "script_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_for_call at https://app.chirply.io/api/mcp, same bearer token, same input.

Read a call script

call_scripts.getread

Read one call script in full — its ordered steps and its objection handlers. Read-only.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe script to read.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List call scripts

call_scripts.listread

List this account's call scripts, with how many steps and objection handlers each one has. Read-only.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
active_onlybooleanoptionalOnly scripts currently offered on calls. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Preview as

call_scripts.previewread

Show exactly what a rep would read: fills every field in a piece of script text — or in every step of a saved script — from one contact, or from the built-in sample person when no contact is given, and lists any tag that can't be filled. This is the editor's Preview as box. Read-only; it saves nothing, calls no one and costs nothing.

Parameters

FieldTypeRequiredDescription
textstringoptionalScript text to preview, tags and all — e.g. a step you are about to save. Give this or script_id.
script_idstring (uuid)optionalPreview every step and objection handler of this saved script instead of loose text.
contact_idstring (uuid)optionalFill the fields from this contact. Omit to preview with the sample person the editor uses.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.preview \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "example",
    "script_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_preview at https://app.chirply.io/api/mcp, same bearer token, same input.

Reorder a call script

call_scripts.reorder_stepswriteadmin only

Set the order of a script's steps (or of its objection handlers) by giving their ids in the order you want. Pass every id of that kind — any left out keeps a stale position.

Parameters

FieldTypeRequiredDescription
script_idstring (uuid)requiredThe script to reorder.
ordered_idsarray of (string (uuid))requiredEvery entry id of one kind, in the order they should run.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.reorder_steps \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "script_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "ordered_ids": [
      "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_reorder_steps at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a call script

call_scripts.updatewriteadmin only

Rename a call script, change what it's for, switch it on or off for calls, or turn the AI assist on or off. Turning assist ON means the AI reads the live transcript of every call using this script and spends this account's own OpenRouter credit doing so; it never speaks to the customer. Omitted fields are left alone.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe script to edit.
namestringoptionalNew name.
descriptionstringoptionalNew description.
is_activebooleanoptionalfalse hides it from the in-call picker without deleting it.
assist_enabledbooleanoptionaltrue lets the AI follow live calls on this script and highlight the rep's place. Requires transcription on the phone number; costs AI credit per call.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a step or objection handler

call_scripts.update_stepwriteadmin only

Rewrite one entry of a call script in place. Supplying a field replaces it; the entry keeps its position. Titles and bodies may use fields such as {{first_name | "there"}}; any tag the script cannot fill is saved as written and listed back in unknown_fields.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe step or objection handler to edit.
script_idstring (uuid)requiredThe script it belongs to.
kind"step" | "objection"optional'step' is part of the ordered path through the call; 'objection' is a handler reached for when the customer pushes back. Default: "step"
titlestringrequiredShort name for this part. May use fields, filled from the person on the call when it connects: {{first_name}}, {{company_name}}, {{industry}}, {{deal.stage}}, {{custom.<key>}} and the rest listed by call_scripts.fields. Add a fallback for blanks with {{first_name | "there"}}.
bodystringoptionalWhat the rep reads on screen. May use fields, filled from the person on the call when it connects: {{first_name}}, {{company_name}}, {{industry}}, {{deal.stage}}, {{custom.<key>}} and the rest listed by call_scripts.fields. Add a fallback for blanks with {{first_name | "there"}}.
objection_key"price" | "budget_timing" | "needs_approval" | "using_competitor" | "happy_with_current" | "no_perceived_need" | … 7 moreoptionalRequired when kind is 'objection'.

Example

curl -X POST https://app.chirply.io/api/v1/actions/call_scripts.update_step \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "script_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "title": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool call_scripts_update_step at https://app.chirply.io/api/mcp, same bearer token, same input.

Add AI agent to call

calls.add_ai_agentwriteconfirm

Add a selected active AI voice agent as a speaking participant in a live conference call. The agent hears and can speak with everyone in the conference. This bills the account's Twilio voice usage and its configured AI model usage for the additional leg.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe call that the AI agent should join.
agent_idstring (uuid)requiredThe active AI voice agent to add.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.add_ai_agent \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "agent_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_add_ai_agent at https://app.chirply.io/api/mcp, same bearer token, same input.

Add someone to a live call

calls.add_partywriteconfirm

DIAL A THIRD PERSON into a call that is happening right now, escalating it to a conference so all three can talk. This RINGS A REAL PHONE and bills the account's own Twilio for the extra leg.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to add someone to.
tostringrequiredThe number to dial in, in any format.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.add_party \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "to": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_add_party at https://app.chirply.io/api/mcp, same bearer token, same input.

Add AI partner to call

calls.attach_partnerwriteconfirm

Connect a speaker-aware AI partner to an existing call, initially listening when human leads. Uses the account's Twilio conference, extra voice leg, per-speaker real-time transcription, ConversationRelay and AI model usage. The AI knows supervisor speech separately from customer speech and supports private coaching.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.
agent_idstring (uuid)requiredThe active ConversationRelay AI agent to join this call.
lead"human" | "ai"optionalhuman leads while the AI listens and helps when asked; ai lets the AI lead the customer conversation and act on coaching. Default: "human"
goalstringoptionalOptional goal for this specific call. Blank uses the selected agent's saved goals, knowledge and permissions.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.attach_partner \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "agent_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_attach_partner at https://app.chirply.io/api/mcp, same bearer token, same input.

Decline

calls.declinewriteconfirm

Decline a still-ringing INBOUND call without answering it, so it falls through to whatever the line does next — voicemail, or the number's fallback. The caller is not hung up on and never hears a rejection. Because a machine caller has no browser leg of its own, this declines the ring for the WHOLE account rather than for one person's softphone: everybody's phone stops, and the caller moves on. That cannot be taken back for this call. Refused once somebody has picked up — end an answered call with calls.hangup instead. To choose the destination yourself, use calls.send_to_voicemail or calls.forward_incoming.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe ringing inbound call to decline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.decline \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_decline at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a call

calls.deletewriteconfirm

Permanently delete a call from the log, along with its recorded audio. This cannot be undone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe call to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a recording's audio

calls.delete_recording_audiowriteconfirm

Permanently delete ONLY a call's recorded audio from storage, keeping the call log entry and its transcript. This cannot be undone — the audio is gone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe call whose audio to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.delete_recording_audio \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_delete_recording_audio at https://app.chirply.io/api/mcp, same bearer token, same input.

Drop a missed call

calls.drop_missed_callwriteconfirm

RING A REAL PERSON'S PHONE for a few seconds and hang up before they can answer, so their phone shows a missed call from one of the account's numbers. Whatever that number answers with — an AI receptionist, a phone menu, a ring group — is what they reach when they call it back. This dials a real phone on the account's own Twilio account; a drop nobody answers costs no call minutes, but one answered inside the ring window connects briefly and is billed. Contacts on the do-not-contact list, opted out of calls or voicemail drops, or inside their own quiet hours are skipped rather than dialled. The drop is logged as a call and lands on the contact's timeline.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
contact_idstring (uuid)optionalThe contact to drop a missed call on. Supplies the number to ring and the timeline the drop is recorded on. Give this, or `to_e164`, or both.
to_e164stringoptionalThe number to ring, in any format. Defaults to the contact's own phone number.
phone_number_idstring (uuid)optionalThe account line the missed call comes from — and the one they ring back, so point it at whatever should answer them. Defaults to the account's first active number.
ring_secondsintegeroptionalHow long their phone rings before the call hangs up, 5–20 seconds (default 10, about two rings). Longer is more noticeable; shorter makes it less likely they answer.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.drop_missed_call \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "to_e164": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_drop_missed_call at https://app.chirply.io/api/mcp, same bearer token, same input.

Forward a ringing call

calls.forward_incomingwriteconfirm

Forward a still-ringing INBOUND call to another number without answering it. This RINGS A REAL PHONE and bills the account's own Twilio for the forwarded leg. When the receiving line opts into transparent forwarding, the original caller's number is presented.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe ringing inbound call.
tostringrequiredThe number to forward to.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.forward_incoming \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "to": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_forward_incoming at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a call

calls.getread

Fetch one call from the log with its full detail: both numbers, duration, disposition, notes, recording URL (when the audio is still stored) and transcript. Also returns `kind` — what placed the call, e.g. sales_bridge, ai_agent, predictive or manual — and `kind_label`/`kind_description`, the exact badge wording and tooltip the Calls list shows for it. When `kind` is sales_bridge, sales_bridges.list_runs with this call's id finds the dispatch and every agent leg behind it.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe call's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Call costs

calls.get_costsread

Read one call's current Twilio voice charges across linked legs, stored AI and ConversationRelay cost estimates, and attributed AI-credit debits. Unknown charges stay null. Provider subtotal excludes recording, transcription, conferencing, premium speech and post-call AI provider charges. Credits are separate to avoid double-counting. Queries Twilio read-only; starts no calls, sends no messages and debits no credits.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe call-log record in the current account whose costs to inspect.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.get_costs \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_get_costs at https://app.chirply.io/api/mcp, same bearer token, same input.

End a live call

calls.hangupwriteconfirm

END a call that is happening right now, dropping every remaining party. This disconnects real people mid-conversation and cannot be undone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to end.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.hangup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_hangup at https://app.chirply.io/api/mcp, same bearer token, same input.

Leave call

calls.leave_supervisionwrite

Disconnect only your own supervisor leg while the rep/AI and customer continue their live call. This does not end their conference. Charges for your disconnected leg stop; remaining participants continue normal provider usage.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.
participant_idstring (uuid)requiredYour supervisor participant from calls.supervision_state.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.leave_supervision \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "participant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_leave_supervision at https://app.chirply.io/api/mcp, same bearer token, same input.

List calls

calls.listread

List the call log, newest first — inbound and outbound, with duration, disposition, recording state and transcript availability. Every call also carries `kind`: WHAT PLACED IT, so a sales-bridge dispatch, an AI agent's call, a predictive-dialer pass and a number somebody typed into the dialer are told apart instead of all reading as plain outbound calls. Filter by kind, direction, status, contact, line, voicemails, or whether a recording was kept.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
direction"inbound" | "outbound"optionalOnly inbound or only outbound calls.
status"queued" | "ringing" | "in_progress" | "completed" | "busy" | "failed" | … 2 moreoptionalOnly calls in this status.
kindarray of ("manual" | "inbound" | "sales_bridge" | "ai_agent" | "queue" | "predictive" | … 5 more)optionalOnly calls of these kinds — what placed the call. Pass one to match the Calls list's own kind filter, which picks a single kind at a time, or several to group them (e.g. ["sales_bridge","predictive","voice_campaign"] for everything an automation dialed). manual — Someone on your team dialed it — softphone, mobile app, or click-to-call. inbound — Someone called one of your numbers. sales_bridge — A sales bridge rang your agent pool so the first to press 1 got the lead. ai_agent — Your AI voice agent placed or answered the call. queue — Worked from a call queue. predictive — Dialed by a predictive dialer session. voice_campaign — Sent by a voice broadcast campaign. rvm — A voicemail dropped without ringing the phone. call_tracking — Came through a call-tracking number, so the source is attributed. web_widget — A visitor asked to be called back from the website call widget. other — Chirply couldn't tell what placed this call. Omit for every kind. Rows recorded before Chirply tracked this read "other" unless their origin could be backfilled.
contact_idstring (uuid)optionalOnly calls linked to this contact.
phone_number_idstring (uuid)optionalOnly calls on this line.
disposition_idstring (uuid)optionalOnly calls with this disposition.
is_voicemailbooleanoptionalOnly (or exclude) voicemail recordings.
has_recordingbooleanoptionaltrue returns only calls whose audio is still stored.
querystringoptionalText to match in either party's number or the call notes.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool calls_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Active calls

calls.list_activeread

List ongoing calls in this account, including AI and human calls. Members see their own calls; owners and admins can supervise the account. Reading incurs no voice charges.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.list_active \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool calls_list_active at https://app.chirply.io/api/mcp, same bearer token, same input.

List calls with no outcome

calls.list_needing_dispositionread

List calls that have ended but still have no outcome recorded — the review queue. This is where calls taken on a desk phone or the mobile app land, since no browser was open to ask at the time. Read-only; it changes nothing.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.list_needing_disposition \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool calls_list_needing_disposition at https://app.chirply.io/api/mcp, same bearer token, same input.

Who's available

calls.list_presenceread

List who in this account is currently able to answer an inbound call, and who is not. Covers both the browser phone and registered mobile apps, with each person's name and email and when they were last seen. This is the answer to “why is nobody picking up the main line?” — a number whose inbound routing is set to the team only rings people who are available here, so an empty list means every caller goes to voicemail. Read-only.

Parameters

FieldTypeRequiredDescription
available_onlybooleanoptionaltrue returns only the people who can actually be rung right now, hiding anyone away or long since gone. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.list_presence \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "available_only": false
  }'
Test with your API key

Over MCP the same operation is the tool calls_list_presence at https://app.chirply.io/api/mcp, same bearer token, same input.

Calls by outcome

calls.outcomes_reportread

Roll up the call log by recorded outcome for a date window: how many calls landed on each outcome (with percentages), total calls, how many were answered (connect rate), how many have an outcome recorded versus still missing one, and a per-teammate breakdown with each person's connect rate and commonest outcome. Spam and voicemail drops are excluded, matching the Calls page. Read-only — it counts existing calls and changes nothing.

Parameters

FieldTypeRequiredDescription
daysintegeroptionalHow many days back from now the report covers. Ignored when 'from' is given. Default: 30
fromstring (date-time)optionalInclusive ISO start of the window; overrides 'days'.
tostring (date-time)optionalExclusive ISO end of the window. Defaults to now.
queue_idstring (uuid)optionalOnly calls dialed from this call queue.
rep_idstring (uuid)optionalOnly calls attributed to this team member — the person who placed the call or, for inbound calls, whoever recorded its outcome.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.outcomes_report \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "days": 30,
    "from": "2026-09-17T15:00:00Z"
  }'
Test with your API key

Over MCP the same operation is the tool calls_outcomes_report at https://app.chirply.io/api/mcp, same bearer token, same input.

Place a call

calls.placewriteconfirm

PLACE A REAL OUTBOUND PHONE CALL from one of the account's numbers. This DIALS A REAL PERSON immediately and bills its own Twilio account for the minutes. The call is logged, and when a contact is named the call also lands on that contact's timeline. If the from-number has recording switched on, the call is recorded.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
to_e164stringrequiredThe number to dial, in any format.
phone_number_idstring (uuid)requiredThe line to call from — it supplies the caller ID.
contact_idstring (uuid)optionalContact this call is for, so it shows on their timeline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.place \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "to_e164": "example",
    "phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_place at https://app.chirply.io/api/mcp, same bearer token, same input.

Call with AI

calls.prepare_pairedwriteconfirm

Attach an AI agent and leader choice to a queued browser call before dialing. The browser then joins and the AI must connect before the customer is dialed. Calls bill the account's Twilio voice, conference, per-speaker transcription, ConversationRelay and AI provider usage. Does not dial by itself; the authenticated browser voice connection starts the prepared call.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.
agent_idstring (uuid)requiredThe active ConversationRelay AI agent joining from the start.
lead"human" | "ai"requiredhuman leads while the AI listens and helps when asked; ai lets the AI lead the customer conversation and act on coaching.
goalstringoptionalOptional goal for this specific call. Blank uses the selected agent's saved goals, knowledge and permissions.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.prepare_paired \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "agent_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "lead": "human"
  }'
Test with your API key

Over MCP the same operation is the tool calls_prepare_paired at https://app.chirply.io/api/mcp, same bearer token, same input.

Listen to call

calls.prepare_supervisionwriteconfirm

Prepare a live call for supervision by placing its existing legs in a conference. A direct AI call reconnects its agent with saved context. Owners and admins can supervise other reps; members can supervise their own calls. Conference and any added AI leg/transcription incur the account's provider usage charges. Returns a call reference for an authenticated browser Voice SDK connection using SuperviseCallId; this preparation itself does not open a microphone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.prepare_supervision \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_prepare_supervision at https://app.chirply.io/api/mcp, same bearer token, same input.

Keypad

calls.send_digitswriteconfirm

Play touch tones only to the live recipient to navigate their phone menu. A choice can trigger a real IVR action and existing Twilio voice/conference usage continues. Shared calls keep their AI session and microphone audience. Direct browser calls use the Voice SDK keypad; other ordinary calls are promoted to a conference. Use the same request_id for a retry: delivery is at most once and accepted does not prove the menu acted on it.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe connected call to press keys on.
digitsstringrequiredKeys 0–9, * and #, with w for a half-second pause. Do not send secrets to untrusted recipients.
request_idstring (uuid)optionalUnique reference for this intentional press; reuse on retries to avoid double selection. A fresh reference is generated when omitted.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.send_digits \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "digits": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_send_digits at https://app.chirply.io/api/mcp, same bearer token, same input.

Send a ringing call to voicemail

calls.send_to_voicemailwriteconfirm

Send a still-ringing INBOUND call straight to voicemail without answering it. The caller hears the account's greeting and can leave a message.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe ringing inbound call.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.send_to_voicemail \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_send_to_voicemail at https://app.chirply.io/api/mcp, same bearer token, same input.

Set a call's outcome

calls.set_dispositionwriteconfirm

Record a call's disposition (outcome) and note, the same as picking one in the power dialer or the call log. Setting a disposition FIRES ITS ATTACHED ACTIONS against the call's contact — which can send real SMS or email, enrol them in a campaign, or move a deal — and runs any automation set to fire when a call outcome is recorded. It is not a passive edit.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe call to mark.
disposition_idstring (uuid) (or null)requiredThe disposition to apply, or null to clear the outcome.
notesstringoptionalFree-text note about this call, saved alongside the outcome.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_disposition \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "disposition_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_disposition at https://app.chirply.io/api/mcp, same bearer token, same input.

Hold

calls.set_holdwrite

Put the other party on hold on a call that is happening right now, or take them off it. On hold they hear hold music instead of this side and cannot hear anything said here. Escalates the call into a conference if it isn't one already (a brief, silent transition). NOTE: the app has no hold button today — this is the same participant-hold the warm-transfer flow uses internally, and for now it is a machine-only control. Trivially reversible by calling again with on_hold=false.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to hold or resume.
on_holdbooleanoptionaltrue puts the other party on hold; false brings them back. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_hold \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_hold at https://app.chirply.io/api/mcp, same bearer token, same input.

Who leads

calls.set_leadwriteconfirm

Hand a supervised call to the AI or take the lead yourself. Human mode keeps you leading and lets the AI answer when you address it or ask for input. AI mode allows it to speak to the real customer and use its existing authorized tools; normal provider usage is billed.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.
lead"human" | "ai"requiredhuman leads while the AI listens and helps when asked; ai lets the AI lead the customer conversation and act on coaching.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_lead \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "lead": "human"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_lead at https://app.chirply.io/api/mcp, same bearer token, same input.

Mute

calls.set_mutewrite

Mute or unmute THIS side of a call that is happening right now — the account's own leg, exactly like the Mute button on the in-call bar. The other party stays connected and keeps talking; they simply stop hearing you. Escalates the call into a conference if it isn't one already (a brief, silent transition), because muting one participant is a conference operation. Trivially reversible by calling again with muted=false.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to mute or unmute.
mutedbooleanoptionaltrue mutes this side's microphone; false unmutes it. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_mute \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_mute at https://app.chirply.io/api/mcp, same bearer token, same input.

Available for calls

calls.set_presencewrite

Set whether a member is available to take inbound calls on the browser phone — the softphone's Available/Away switch. A line whose inbound routing is set to the team rings everyone currently available, so switching someone off stops inbound calls reaching them, and switching everybody off means nobody's phone rings and callers fall through to voicemail. Availability lapses on its own about a minute after the browser stops heartbeating, so this is a way to take somebody OFF the rota, not a way to keep them on it.

Parameters

FieldTypeRequiredDescription
availablebooleanrequiredtrue puts them on the rota for inbound team calls; false takes them off.
user_idstring (uuid)optionalWhich member's availability to set. Defaults to the calling user. An API key has no user of its own, so it must name one — deliberately broader than the browser, where a person may only write their own row, so a desk phone or a workforce tool can put an agent on or off the rota.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_presence \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "available": true
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_presence at https://app.chirply.io/api/mcp, same bearer token, same input.

Who hears me

calls.set_supervision_modewriteconfirm

Change your supervisor microphone between listening, private coaching and speaking to everyone. This sends real live audio when unmuted. Coach mode with an AI supports private questions and answers heard only by your connection. AI/model and Twilio announcement usage are billed to the connected providers. Muted transitions and immutable speech channels protect private speech. Existing voice/conference/transcription usage continues. Only your own supervisor connection can be changed.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.
participant_idstring (uuid)requiredYour supervisor participant from calls.supervision_state.
mode"listen" | "coach" | "everyone"requiredlisten hears the call with your mic muted; coach speaks only to the selected rep; everyone speaks publicly.
coach_participant_idstring (uuid)optionalThe connected human rep or AI participant to hear private coaching; required for coach mode.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_supervision_mode \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "participant_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "mode": "listen"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_supervision_mode at https://app.chirply.io/api/mcp, same bearer token, same input.

Set the voicemail greeting

calls.set_voicemail_greetingwriteconfirmadmin only

Set one phone number's voicemail greeting. Twilio speaks built-in voices live; ElevenLabs generates and stores finished audio immediately using its own OWN account and SPENDS ITS TTS CREDITS. Recording or uploading a clip is available in the app.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
phone_number_idstring (uuid)requiredThe phone number whose voicemail greeting changes.
source"twilio" | "elevenlabs"optionalTwilio speaks live, or ElevenLabs generates saved audio and spends credits. Default: "twilio"
greetingstring (or null)requiredThe spoken greeting, or null to fall back to the default.
voicestring (or null)optionalA Twilio <Say> voice from the curated catalog (e.g. 'Polly.Joanna-Neural'). Anything else is ignored.
elevenlabs_voice_idstring (or null)optionalA voice id from its own ElevenLabs account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.set_voicemail_greeting \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "greeting": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_set_voicemail_greeting at https://app.chirply.io/api/mcp, same bearer token, same input.

Start in-app call

calls.start_softphonewriteconfirm

Prepare a real outbound VoIP call from the signed-in mobile softphone. The mobile app immediately connects the caller to the recipient through its own Twilio account, so the recipient's phone rings and Twilio bills the account for call minutes.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
to_e164stringrequiredThe real phone number to call, in any common format.
phone_number_idstring (uuid)requiredThe account phone-number id to display as caller ID.
contact_idstring (uuid)optionalOptional CRM contact id so the call appears on that contact's timeline.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.start_softphone \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "to_e164": "example",
    "phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_start_softphone at https://app.chirply.io/api/mcp, same bearer token, same input.

Suggest a call's outcome

calls.suggest_dispositionread

Read a call's transcript and suggest which of the account's own call outcomes fits, with a confidence score and the reason. It only suggests — nothing is saved and no actions fire; pass the answer to calls.set_disposition to apply it. Requires a transcript, so the number must have transcription switched on. Uses and bills its own OpenRouter account.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe call to read.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.suggest_disposition \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_suggest_disposition at https://app.chirply.io/api/mcp, same bearer token, same input.

Call roles and microphone

calls.supervision_stateread

Read the roles, live connections, current leader and supervisor microphone audiences on a call. Does not expose private coaching text or place calls.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe active call in this account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.supervision_state \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_supervision_state at https://app.chirply.io/api/mcp, same bearer token, same input.

Transfer a live call

calls.transferwriteconfirm

Blind-transfer a call that is happening right now: DIAL the target and hand the other party straight over, dropping this side. This RINGS A REAL PHONE, bills the account's own Twilio, and cannot be taken back once the transfer lands. Use calls.warm_transfer_start to consult first.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to transfer.
tostringrequiredThe number to transfer to.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.transfer \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "to": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_transfer at https://app.chirply.io/api/mcp, same bearer token, same input.

Cancel a warm transfer

calls.warm_transfer_cancelwriteconfirm

Back out of a consultative transfer: drop the target's leg and take the caller off hold so this side keeps the call.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call being transferred.
target_call_sidstringrequiredThe target leg's CallSid, as returned by calls.warm_transfer_start.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.warm_transfer_cancel \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "target_call_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_warm_transfer_cancel at https://app.chirply.io/api/mcp, same bearer token, same input.

Complete a warm transfer

calls.warm_transfer_completewriteconfirm

Finish a consultative transfer: take the caller off hold, connect them to the target, and drop this side out of the call. Cannot be taken back.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call being transferred.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.warm_transfer_complete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool calls_warm_transfer_complete at https://app.chirply.io/api/mcp, same bearer token, same input.

Start a warm transfer

calls.warm_transfer_startwriteconfirm

Step one of a consultative transfer on a live call: DIAL the target, put the other party on hold, and let this side speak to the target privately. RINGS A REAL PHONE and bills the account's own Twilio. Finish with calls.warm_transfer_complete or back out with calls.warm_transfer_cancel.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
call_idstring (uuid)requiredThe live call to transfer.
tostringrequiredThe number to consult and transfer to.

Example

curl -X POST https://app.chirply.io/api/v1/actions/calls.warm_transfer_start \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "call_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "to": "example"
  }'
Test with your API key

Over MCP the same operation is the tool calls_warm_transfer_start at https://app.chirply.io/api/mcp, same bearer token, same input.

Attach an IVR to a number

ivr.attach_numberwriteadmin only

Point one of the account's phone numbers at this IVR flow, so incoming calls to that line walk the menu. The flow must be live. A line already answering with an AI receptionist, a forward, a conference room or a different IVR is refused rather than silently repointed.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow to attach.
phone_number_idstring (uuid)requiredThe phone number that should answer with it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.attach_number \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_attach_number at https://app.chirply.io/api/mcp, same bearer token, same input.

Create an IVR phone menu

ivr.createwrite

Create a new, empty IVR flow and return its id. Deliberately off air and unattached — pointing a live number at a flow with no steps would answer real callers with silence. Draw it with ivr.update, then publish and attach it.

Parameters

FieldTypeRequiredDescription
namestringoptionalWhat to call this phone menu. Default: "Untitled IVR"

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Untitled IVR"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete an IVR phone menu

ivr.deletewriteconfirm

Permanently delete an IVR flow. This cannot be undone. Any line answering with it is first sent back to the team simulring and named in the result. A flow that ANOTHER flow hands calls to is refused, because deleting it would leave that other flow hanging up on real callers.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Detach an IVR from a number

ivr.detach_numberwriteadmin only

Stop a phone number answering with this IVR flow and send it back to the team simulring. Omit the number to release every line pointing at the flow.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow to detach.
phone_number_idstring (uuid)optionalThe single line to release. Omit to release them all.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.detach_number \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_detach_number at https://app.chirply.io/api/mcp, same bearer token, same input.

Generate with AI voice

ivr.generate_prompt_audiowriteconfirm

Speak a line of a phone menu in an ElevenLabs voice and store it, returning the permanent URL to put on that step with ivr.update. SPENDS REAL MONEY: every call renders the text on its OWN ElevenLabs account and consumes its credits, so re-rendering the same line ten times costs ten times — and there is no cached preview to fall back on. Needed because Twilio's built-in <Say> voices cannot speak ElevenLabs: choosing a cloned or premium voice for a menu prompt means rendering it up front and playing the file on the call. Twilio's own voices (Polly, Google) are spoken live and never come through here. Nothing is dialed and no caller hears anything until the URL is saved onto a step and the menu is published.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
textstringrequiredExactly what the caller will hear, e.g. "Thanks for calling. Press 1 for sales, 2 for support." Write it the way it should be spoken — this is rendered verbatim.
voice_idstringoptionalA voice id from its own ElevenLabs account (ai_agents.list_voices). Omit to use the voice saved on the ElevenLabs connection, or the platform default.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.generate_prompt_audio \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "example"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_generate_prompt_audio at https://app.chirply.io/api/mcp, same bearer token, same input.

Open an IVR phone menu

ivr.getread

Fetch one IVR flow: its full node/edge graph as drawn in the builder, whether it is live, any validation issues that would stop it answering a real line, and every phone number currently pointing at it.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List IVR phone menus

ivr.listread

List the account's IVR flows (phone menus) built in the visual builder, with whether each is live and which lines it answers.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
is_activebooleanoptionalOnly live (true) or off-air (false) flows.
querystringoptionalText to match in the flow's name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool ivr_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Publish an IVR phone menu

ivr.publishwriteconfirm

Put an IVR flow LIVE so it can answer real callers, or take it off air. Publishing is refused when the flow has issues that would misroute a caller (a dead hand-off, a missing or paused AI agent, an unconnected key). TAKING IT OFF AIR CHANGES WHERE CALLS GO: an off-air menu cannot answer, so every line pointing at it is sent back to the team simulring and named in the result.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow to publish or unpublish.
livebooleanoptionalfalse takes the flow off air. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.publish \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_publish at https://app.chirply.io/api/mcp, same bearer token, same input.

Save an IVR phone menu

ivr.updatewrite

Rename an IVR flow and/or replace its node/edge graph — the same graph the visual builder saves, and the one the live call runtime walks for both inbound calls and outbound voice campaigns. The flat greeting/options summary is recompiled automatically. A flow that is already LIVE is refused if the new graph would misroute a real caller.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe IVR flow to save.
namestringoptionalNew name for the flow.
flowobjectoptionalThe complete graph. Replaces the stored one wholesale.
flow.versionintegeroptionalGraph schema version.
flow.nodesarray of (map of string → object)requiredBuilder nodes: {id, type, label, position, data}.
flow.edgesarray of (map of string → object)optionalBuilder edges: {id, source, sourceHandle, target}. Default: []

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Upload audio

ivr.upload_prompt_audiowrite

Store a recorded clip for one step of a phone menu to play, and get back the permanent URL to put on that step with ivr.update. Send the bytes base64-encoded, up to 10 MB. IT MUST BE PLAYABLE ON A PHONE CALL: WAV, MP3, AIFF, GSM or u-law only — Twilio rejects anything else outright and the caller hears dead air, so a clip in another format is refused here rather than stored. Best results come from 8 kHz mono WAV, which is what the builder's own recorder produces. Costs nothing and calls nobody; it stores one file.

Parameters

FieldTypeRequiredDescription
audio_base64stringrequiredThe clip's raw bytes, base64-encoded. A `data:` URL prefix and line breaks are accepted and stripped. Decoded size must be 10 MB or less.
format"wav" | "mp3" | "aiff" | "gsm" | "ulaw"optionalWhat the bytes actually are. Twilio plays only these five; the value chosen here decides the stored file's extension and content type. Default: "wav"

Example

curl -X POST https://app.chirply.io/api/v1/actions/ivr.upload_prompt_audio \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "audio_base64": "example"
  }'
Test with your API key

Over MCP the same operation is the tool ivr_upload_prompt_audio at https://app.chirply.io/api/mcp, same bearer token, same input.

Archive a phone number

numbers.archivewriteadmin only

Hide a number from the dialer and every from-number picker WITHOUT releasing it on Twilio or changing its routing — for a line you run elsewhere but want out of the way. Billing continues. Clears the default-outbound preference if it pointed here. Reverse it with numbers.restore.

Parameters

FieldTypeRequiredDescription
idstring (uuid)optionalThe id of the phone number to archive.
provider_sidstringoptionalFor a Twilio number that isn't set up here: its IncomingPhoneNumber SID, hidden from the numbers console only.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.archive \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "provider_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_archive at https://app.chirply.io/api/mcp, same bearer token, same input.

Buy a phone number

numbers.buywriteconfirmadmin only

PURCHASE a phone number on its own Twilio account. This SPENDS REAL MONEY — Twilio bills the tenant an upfront and a monthly fee for the number immediately, and it can only be undone by releasing it. By default the number is also routed into this account (voice + SMS webhooks) and added to the dialer.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
phone_numberstringrequiredThe E.164 number to buy, exactly as returned by numbers.search_available.
configurebooleanoptionalRoute voice + SMS into this account and add it to the dialer right away. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.buy \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "phone_number": "+15551234567"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_buy at https://app.chirply.io/api/mcp, same bearer token, same input.

Set where a number's calls arrive

numbers.configure_routingwriteadmin only

Point one Twilio number's inbound voice and/or SMS webhooks at this account, at a custom https URL, or turn the channel off. This changes configuration on its own Twilio account and takes effect on the next call. Addressed by the Twilio number SID, so it also works for numbers that aren't in the dialer yet.

Parameters

FieldTypeRequiredDescription
number_sidstringrequiredThe Twilio IncomingPhoneNumber SID (starts with 'PN').
voice_mode"chirply" | "custom" | "off"optionalWhere inbound voice goes. Omit to leave voice untouched.
voice_urlstringoptionalThe https voice webhook, required when voice_mode is 'custom'.
sms_mode"chirply" | "custom" | "off"optionalWhere inbound SMS goes. Omit to leave SMS untouched.
sms_urlstringoptionalThe https SMS webhook, required when sms_mode is 'custom'.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.configure_routing \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "number_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_configure_routing at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a phone number

numbers.getread

Fetch one phone number with every setting on its settings page: label, inbound destination and its target, call recording, transcription, forwarding preferences and missed-call text back.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Look up known line types

numbers.get_line_typeread

Read the cached line type (mobile / landline / VoIP / toll-free) and carrier for one or more phone numbers. Reads the platform's shared lookup cache only, so it is instant and costs nothing; numbers nobody has ever paid to look up simply come back unknown. Use numbers.queue_line_type_lookup to pay for the unknown ones.

Parameters

FieldTypeRequiredDescription
phonesstring[]requiredPhone numbers in any format; they're normalized to E.164.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.get_line_type \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "phones": [
      "+15551234567"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool numbers_get_line_type at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a number's call & text schedule

numbers.get_schedulereadadmin only

Fetch the ordered timezone-aware windows that decide how one number handles incoming calls and texts. Read-only; the normal number settings remain the fallback outside every matching window.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number whose schedule to read.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.get_schedule \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_get_schedule at https://app.chirply.io/api/mcp, same bearer token, same input.

List phone numbers

numbers.listread

List the phone numbers this account uses, with each one's inbound destination, recording preferences, missed-call text-back settings and status. Read-only — costs nothing.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
statusstringoptionalOnly numbers in this status ('active' or 'archived').
inbound_mode"team" | "voicemail" | "ai_agent" | "ivr" | "forward" | "conference" | … 1 moreoptionalOnly numbers whose incoming calls go to this destination.
querystringoptionalText to match in the number or its label.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool numbers_list at https://app.chirply.io/api/mcp, same bearer token, same input.

Look up line types (paid)

numbers.queue_line_type_lookupwriteconfirm

Queue phone numbers for a Twilio Lookup line-type check. This SPENDS REAL MONEY — each number not already in the shared cache is billed to its own Twilio account (roughly $0.008 each). Numbers already known, or already queued, are skipped for free. Nothing is queued at all when the account has switched automatic lookup off (numbers.set_auto_line_type_lookup) or has no Twilio connected. Results land asynchronously; read them back with numbers.get_line_type.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
phonesstring[]requiredPhone numbers to look up, in any format.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.queue_line_type_lookup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "phones": [
      "+15551234567"
    ]
  }'
Test with your API key

Over MCP the same operation is the tool numbers_queue_line_type_lookup at https://app.chirply.io/api/mcp, same bearer token, same input.

Release a phone number

numbers.releasewriteconfirmadmin only

PERMANENTLY release a phone number back to Twilio and remove it from this account. This CANNOT BE UNDONE — the number is gone from the account, anyone who calls it reaches nobody, and it may not be re-purchasable. Billing for it stops. Use numbers.archive instead to simply hide a number you want to keep.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number to release.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.release \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_release at https://app.chirply.io/api/mcp, same bearer token, same input.

Restore an archived number

numbers.restorewriteadmin only

Bring an archived number back into the dialer and the numbers console.

Parameters

FieldTypeRequiredDescription
idstring (uuid)optionalThe id of the phone number to restore.
provider_sidstringoptionalFor an external Twilio number: its IncomingPhoneNumber SID.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.restore \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "provider_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_restore at https://app.chirply.io/api/mcp, same bearer token, same input.

Scan the database for line types

numbers.scan_line_typeswriteconfirmadmin only

One-time sweep: queue EVERY not-yet-known phone number across this account's contacts and staged leads for a line-type lookup. This SPENDS REAL MONEY — each unknown number is billed to the account's own Twilio (roughly $0.008 each), and a large database can mean thousands of lookups.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.scan_line_types \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool numbers_scan_line_types at https://app.chirply.io/api/mcp, same bearer token, same input.

Search available numbers

numbers.search_availablereadadmin only

Search its own Twilio account for local, toll-free, or mobile numbers available to buy. Filter by country, beginning prefix, locality, digit/keypad-letter pattern, and required voice/SMS/MMS capabilities; use the returned cursor to load every matching page. This only searches — nothing is purchased and nothing is billed.

Parameters

FieldTypeRequiredDescription
countrystringoptionalISO country code, e.g. 'US' or 'CA'. Default: "US"
number_type"local" | "toll_free" | "mobile"optionalTwilio inventory to search: local, toll-free, or mobile numbers. Default: "local"
area_codestringoptionalLegacy US/Canada area-code filter, e.g. '317'. Prefer starts_with.
starts_withstringoptionalBeginning phone-number prefix. Use E.164 such as '+1415' for unambiguous global matching; US/CA/GB/AU national prefixes are also accepted.
containsstringoptionalDigits or keypad letters the number must contain, e.g. '555' or 'CHIRP'. Cannot be combined with starts_with.
localitystringoptionalCity or locality to restrict inventory to, where Twilio supports it.
voice_enabledbooleanoptionalOnly return numbers that can receive voice calls. Default: false
sms_enabledbooleanoptionalOnly return numbers that can receive SMS messages. Default: false
mms_enabledbooleanoptionalOnly return numbers that can receive MMS messages. Default: false
cursorstringoptionalOpaque next_cursor returned by the previous search to load its next page.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.search_available \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "country": "US",
    "number_type": "local"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_search_available at https://app.chirply.io/api/mcp, same bearer token, same input.

Toggle automatic line-type lookup

numbers.set_auto_line_type_lookupwriteadmin only

Turn automatic line-type lookup on or off for this account. When on, every new phone number that enters the CRM is looked up on its own Twilio account (a small per-number charge) unless the platform already knows it. Stored alongside the Twilio credentials it spends.

Parameters

FieldTypeRequiredDescription
enabledbooleanrequiredtrue turns automatic lookup on.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.set_auto_line_type_lookup \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled": true
  }'
Test with your API key

Over MCP the same operation is the tool numbers_set_auto_line_type_lookup at https://app.chirply.io/api/mcp, same bearer token, same input.

Set the default outbound number

numbers.set_default_outboundwriteadmin only

Set (or clear) the account's default outbound caller ID and SMS sender. The number must already be active in this account.

Parameters

FieldTypeRequiredDescription
e164string (or null)requiredThe E.164 number to use by default, or null to clear it.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.set_default_outbound \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "e164": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_set_default_outbound at https://app.chirply.io/api/mcp, same bearer token, same input.

Save missed-call text back

numbers.set_missed_call_text_backwriteconfirmadmin only

Enable, disable, or edit one number's missed-call text back. When enabled, every unanswered inbound call immediately sends one REAL SMS from that same number, billed to its own Twilio account. Callers who opted out of SMS are skipped, and webhook retries never send a duplicate for the same call. Two optional gates narrow when it sends: only outside the account's business hours (from the Business profile), and only to callers who aren't already a contact.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number to configure.
enabledbooleanrequiredWhether unanswered inbound calls should trigger an automatic SMS.
messagestringrequiredThe SMS body sent to the caller after a missed call.
send_when"always" | "after_hours"optionalWhen the text is allowed to send: 'always' texts every missed call (the default); 'after_hours' texts only while the account's business hours (Settings → Business profile) say the office is CLOSED, so an open office can call back instead. Omit to keep the number's current setting.
unknown_callers_onlybooleanoptionalWhen true, only callers who are NOT already a contact in this account are texted; existing contacts are skipped so a human follow-up isn't preempted. Omit to keep the number's current setting.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.set_missed_call_text_back \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "enabled": true,
    "message": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_set_missed_call_text_back at https://app.chirply.io/api/mcp, same bearer token, same input.

Save call & text schedule

numbers.set_schedulewriteconfirmadmin only

Replace one number's complete ordered schedule, interpreted in the account timezone from Business profile. The first local-time window that matches controls both incoming calls and texts; outside it, the normal number settings apply. Enabling static, responder or AI text behavior causes REAL automatic SMS, billed to the tenant's Twilio account, whenever matching messages arrive. Call destinations take effect on the next inbound call.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number whose complete schedule is replaced.
enabledbooleanrequiredMaster switch; false keeps the saved windows but ignores them.
rulesobject[]requiredOrdered windows; the first matching item wins.
rules[].labelstring (or null)optionalHuman label such as Business hours, After hours, or Holiday.
rules[].daysarray of ("mon" | "tue" | "wed" | "thu" | "fri" | "sat" | … 1 more)requiredLocal weekdays when this window begins.
rules[].start_timestringrequiredLocal start in 24-hour HH:MM format.
rules[].end_timestringrequiredLocal end in HH:MM; end at/before start crosses midnight.
rules[].starts_onstring (or null)optionalOptional first local date, YYYY-MM-DD.
rules[].ends_onstring (or null)optionalOptional last local date, YYYY-MM-DD.
rules[].action"inherit" | "team" | "ai_agent" | "ivr" | "forward" | "conference" | … 2 morerequiredCall handling inside this window; inherit uses the number's normal call destination.
rules[].ai_agent_idstring (uuid) (or null)optionalCall AI agent when action is ai_agent.
rules[].ivr_menu_idstring (uuid) (or null)optionalLive phone menu when action is ivr.
rules[].forward_e164string (or null)optionalOutside number when action is forward.
rules[].conference_roomstring (or null)optionalRoom name when action is conference; blank derives one from the line.
rules[].messagestring (or null)optionalClosure message, or custom voicemail greeting, for message/voicemail actions.
rules[].sms_mode"inherit" | "inbox" | "static" | "autoresponder" | "ai_agent"optionalText handling inside this window; inherit uses the number's normal SMS behavior. Default: "inherit"
rules[].sms_static_replystring (or null)optionalAutomatic text when sms_mode is static.
rules[].sms_autoresponder_idstring (uuid) (or null)optionalAttached keyword responder; null means all active SMS responders.
rules[].sms_ai_agent_idstring (uuid) (or null)optionalAI agent that replies when sms_mode is ai_agent.
rules[].is_activebooleanoptionalWhether this window participates in matching. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.set_schedule \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "enabled": true,
    "rules": [
      {
        "days": [
          "mon"
        ],
        "start_time": "example",
        "end_time": "example",
        "action": "inherit"
      }
    ]
  }'
Test with your API key

Over MCP the same operation is the tool numbers_set_schedule at https://app.chirply.io/api/mcp, same bearer token, same input.

Save inbound text routing

numbers.set_sms_routingwriteconfirmadmin only

Choose what one number does with incoming SMS outside scheduled windows. Inbox stores the message without replying; static immediately sends fixed text; autoresponder runs one attached keyword rule (or all active rules when no id is supplied); ai_agent automatically replies from the chosen agent using the thread and its Brain. Static, responder and AI modes SEND REAL SMS from the tenant's own Twilio account and incur carrier charges when a message arrives.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number to configure.
mode"inbox" | "static" | "autoresponder" | "ai_agent"requiredinbox | static | autoresponder | ai_agent.
static_replystring (or null)optionalFixed automatic reply required for static mode.
autoresponder_idstring (uuid) (or null)optionalSpecific SMS responder, or null for all active SMS responders.
ai_agent_idstring (uuid) (or null)optionalActive AI agent required for ai_agent mode.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.set_sms_routing \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "mode": "inbox"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_set_sms_routing at https://app.chirply.io/api/mcp, same bearer token, same input.

Stop using a number in this account

numbers.stop_using_in_chirplywriteadmin only

Reverse of 'use in this account': clear this account's voice + SMS routing on Twilio and remove the number from the dialer. The number stays on the Twilio account and keeps billing — this does not release it. Clears the default-outbound preference if it pointed here.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number to stop using in this account.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.stop_using_in_chirply \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_stop_using_in_chirply at https://app.chirply.io/api/mcp, same bearer token, same input.

Save a number's settings

numbers.update_settingswriteadmin only

Update any setting on one phone number's settings page: its internal label, which teammates can use the line, where incoming calls go (team simulring, direct voicemail, an AI receptionist, an IVR phone menu, a blind forward, or a conference room), how long the team rings and where unanswered team calls go, destination targets, call recording, transcription and recording announcements, transparent-forward caller ID, and whether it is the account's default outbound caller ID. Omitted fields are left alone. Does not touch Twilio's own webhook routing — use numbers.configure_routing for that.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe phone number to edit.
friendly_namestring (or null)optionalInternal label shown in the dialer and pickers.
assigned_tostring (uuid) (or null)optionalLegacy single-person assignment, from team.list_members, or null for a shared line. Setting this replaces the full assigned_user_ids list. Omit to leave assignment unchanged; use assigned_user_ids to choose multiple people.
assigned_user_idsarray of (string (uuid))optionalEvery teammate whose softphone should offer this line, from team.list_members. Pass an empty list to share it with the whole team. Managers can still use every line. With multiple people, new inbound messages remain unassigned for the team. Omit to leave assignment unchanged.
record_callsbooleanoptionalRecord calls on this number (audio is stored in the platform's own R2 bucket).
transcribe_callsbooleanoptionalTranscribe calls on this number using Twilio's transcription.
recording_announcebooleanoptionalPlay a 'this call may be recorded' announcement before connecting.
forward_original_caller_idbooleanoptionalWhen forwarding a ringing call, show the ORIGINAL caller's number.
script_idstring (uuid) (or null)optionalThe call script that opens beside the phone for calls on this line, or null for none. Whether the AI follows the conversation is set on the script itself, not here.
inbound_mode"team" | "voicemail" | "ai_agent" | "ivr" | "forward" | "conference" | … 1 moreoptionalWho answers incoming calls first: team | voicemail | ai_agent | ivr | forward | conference.
team_ring_countintegeroptionalApproximate ring cycles, from 1 to 12, before an unanswered team call continues.
team_fallback_mode"voicemail" | "ai_agent" | "ivr" | "conference" | "forward"optionalWhat happens after the team does not answer: voicemail | ai_agent | ivr | conference | forward.
ai_agent_idstring (uuid) (or null)optionalThe AI receptionist used when the primary or unanswered-team destination is ai_agent.
ivr_menu_idstring (uuid) (or null)optionalThe live IVR flow used when the primary or unanswered-team destination is ivr.
forward_e164string (or null)optionalOutside number used when the primary or unanswered-team destination is forward.
conference_roomstring (or null)optionalRoom used when the primary or unanswered-team destination is conference; blank derives one.
default_outboundbooleanoptionalMake (or stop making) this the account's default outbound caller ID.

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.update_settings \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_update_settings at https://app.chirply.io/api/mcp, same bearer token, same input.

Use a Twilio number in this account

numbers.use_in_chirplywriteadmin only

One click: route a Twilio number's voice AND SMS into this account and add it to the dialer so it can place calls and send messages. With route_inbound=false it is added for outgoing calls and texts only and its Twilio routing is left exactly as it is — for a caller-ID or test line that should receive nothing. Changes configuration on the org's own Twilio account only when routing; addressed by the Twilio number SID. Does not buy anything.

Parameters

FieldTypeRequiredDescription
number_sidstringrequiredThe Twilio IncomingPhoneNumber SID to start using.
route_inboundbooleanoptionaltrue (default): point the number's incoming calls AND texts at this account, then add it. false: add it for outgoing calls and texts only, leaving its Twilio routing exactly as it is — use this for a caller-ID or test line that should receive nothing. Default: true

Example

curl -X POST https://app.chirply.io/api/v1/actions/numbers.use_in_chirply \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "number_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool numbers_use_in_chirply at https://app.chirply.io/api/mcp, same bearer token, same input.

Turn off calling to this country

regions.disable_callingwriteconfirmadmin only

SWITCHES OFF calling to one country on its own Twilio account. Every call placed to it after this is refused before it is dialed, for every user in the account — including calls made by dialers, campaigns and AI agents. Use it to close down a destination that is being abused or is not needed; it takes effect immediately.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
countrystringoptionalISO 3166-1 alpha-2 country code to switch off, e.g. “MX”. Give this or `phone`.
phonestringoptionalAny phone number in the country to switch off. Give this or `country`.

Example

curl -X POST https://app.chirply.io/api/v1/actions/regions.disable_calling \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "country": "example",
    "phone": "+15551234567"
  }'
Test with your API key

Over MCP the same operation is the tool regions_disable_calling at https://app.chirply.io/api/mcp, same bearer token, same input.

Turn on calling to this country

regions.enable_callingwriteconfirmadmin only

SWITCHES ON INTERNATIONAL CALLING to one country on its own Twilio account, immediately and for every user in the account. Calls placed after this are billed by Twilio at that country's international rates, which can be many times the domestic rate. Premium-rate and known toll-fraud number ranges stay OFF unless they are asked for by name — those are the ranges that turn a compromised account into a very large bill, so enabling them is a separate, deliberate decision.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
countrystringoptionalISO 3166-1 alpha-2 country code to switch on, e.g. “MX”. Give this or `phone`.
phonestringoptionalAny phone number in the country to switch on — typically the number a call just failed to reach. Give this or `country`.
include_high_riskbooleanoptionalAlso allow premium-rate and known toll-fraud ranges in that country. Leave false unless someone has explicitly asked for them; this is the setting fraud runs up bills through. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/regions.enable_calling \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "country": "example",
    "phone": "+15551234567"
  }'
Test with your API key

Over MCP the same operation is the tool regions_enable_calling at https://app.chirply.io/api/mcp, same bearer token, same input.

Check calling to a country

regions.get_callingread

Answers whether its own Twilio account is allowed to call one particular country, named either by ISO code or by giving any phone number in it. Reading is free; when a phone number is given its country is resolved through a Twilio Lookup requested without any billable data packages, so that is free as well.

Parameters

FieldTypeRequiredDescription
countrystringoptionalISO 3166-1 alpha-2 country code, e.g. “MX”. Give this or `phone`.
phonestringoptionalAny phone number in the country to ask about, in any format. Its country is resolved for you. Give this or `country`.

Example

curl -X POST https://app.chirply.io/api/v1/actions/regions.get_calling \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "country": "example",
    "phone": "+15551234567"
  }'
Test with your API key

Over MCP the same operation is the tool regions_get_calling at https://app.chirply.io/api/mcp, same bearer token, same input.

Countries you can call

regions.list_callingread

Lists every country with whether its own Twilio account is currently allowed to call it. A brand new Twilio account can only call its own country, and calls to anywhere switched off are refused before they are placed — this is what that setting says right now. Reads its own Twilio account and costs nothing. Note this is the CALLING list only; Twilio keeps texting permissions on a separate switch it publishes no API for, so use regions.texting_status for that.

Parameters

FieldTypeRequiredDescription
enabled_onlybooleanoptionalReturn only the countries calling is already switched on for, instead of all ~240. Default: false
searchstringoptionalFilter by country name or ISO code, e.g. “mex” or “MX”.

Example

curl -X POST https://app.chirply.io/api/v1/actions/regions.list_calling \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "enabled_only": false,
    "search": "example"
  }'
Test with your API key

Over MCP the same operation is the tool regions_list_calling at https://app.chirply.io/api/mcp, same bearer token, same input.

Why texting this country is blocked

regions.texting_statusread

Explains a blocked international TEXT (Twilio error 21408) and says exactly who can unblock it and where. Unlike calling, Twilio publishes no API for messaging geo-permissions — it states they cannot be changed programmatically, for security reasons — so neither Chirply nor any agent can switch a country on, and there is no endpoint to read the current setting from either. This returns the country the number belongs to, the Twilio console page that owns the setting, and the account SID that page has to be opened against, so a human can finish it in about thirty seconds. Costs nothing.

Parameters

FieldTypeRequiredDescription
phonestringoptionalThe number a text failed to reach, in any format. Its country is resolved for you. Give this or `country`.
countrystringoptionalISO 3166-1 alpha-2 country code, e.g. “MX”. Give this or `phone`.

Example

curl -X POST https://app.chirply.io/api/v1/actions/regions.texting_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+15551234567",
    "country": "example"
  }'
Test with your API key

Over MCP the same operation is the tool regions_texting_status at https://app.chirply.io/api/mcp, same bearer token, same input.

Create a sales bridge

sales_bridges.createwriteadmin only

Create a sales bridge: a name, the line to call from, an optional whisper played to the agent who answers, an optional SMS sent to each agent on dispatch, and the pool of agent phones to ring. Creating it dials nobody — use sales_bridges.start_run for that.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat to call this sales bridge.
phone_number_idstring (uuid) (or null)optionalThe line used as caller ID when dialing agents and the lead.
whisper_messagestring (or null)optionalLead-context whisper spoken to the agent before connecting. Merge fields allowed.
whisper_voicestring (or null)optionalA curated Twilio <Say> voice for the whisper. Anything else is ignored.
agent_smsstring (or null)optionalOptional SMS sent to each PSTN agent on dispatch. Merge fields allowed.
dial_timeoutintegeroptionalSeconds to ring each agent, clamped to 5–120. Defaults to 30.
record_callsbooleanoptionalRecord the bridged call. Default: false
recording_announcebooleanoptionalAnnounce that the call may be recorded. Default: false
is_activebooleanoptionalA paused bridge refuses to start runs. Default: true
agentsobject[]optionalThe agent pool, in ring order. Each row needs a number or a member. Default: []
agents[].e164string (or null)optionalThe agent's phone number.
agents[].user_idstring (uuid) (or null)optionalA member's id, to ring their browser softphone instead.
agents[].labelstring (or null)optionalDisplay label for this agent.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a sales bridge

sales_bridges.deletewriteconfirmadmin only

Permanently delete a sales bridge and its agent pool. This cannot be undone. Past runs are removed with it.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe sales bridge to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a sales bridge

sales_bridges.getread

Fetch one sales bridge with its whisper script, caller-ID line, dial timeout, recording preferences and its full agent pool in ring order.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe sales bridge's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a sales bridge run

sales_bridges.get_runread

Fetch one sales-bridge run with every agent leg it dialed and how each leg ended, plus `call_id` — the call-log row for the bridged conversation, which calls.get returns with `kind: "sales_bridge"`. Read-only; it dials nobody.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe run's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.get_run \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_get_run at https://app.chirply.io/api/mcp, same bearer token, same input.

List sales bridges

sales_bridges.listread

List the account's sales bridges — the press-1 simulring connectors that ring a pool of agents for one hot lead.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
is_activebooleanoptionalOnly active (true) or paused (false) bridges.
querystringoptionalText to match in the bridge's name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_list at https://app.chirply.io/api/mcp, same bearer token, same input.

List sales bridge runs

sales_bridges.list_runsread

List recent sales-bridge dispatches with their outcome — ringing, claimed, bridged, completed, no answer, failed or canceled — and which agent won each one. This is the whole history of what the bridge has dialed, not just what one screen happens to show: every run is here as soon as it starts. Each run carries `call_id`, the call-log row for the bridged conversation (that row's `kind` is `sales_bridge`), so a run can be followed into the call log and a call followed back to its run with the `call_id` filter. Read-only; it dials nobody.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
sales_bridge_idstring (uuid)optionalOnly runs of this bridge.
status"ringing" | "claimed" | "bridged" | "completed" | "no_answer" | "failed" | … 1 moreoptionalOnly runs in this status.
contact_idstring (uuid)optionalOnly runs dispatched for this contact — their sales-bridge history.
call_idstring (uuid)optionalOnly the run behind this call-log row. Use it to answer "which bridge placed this call, and who else was rung?" for any call whose `kind` is sales_bridge.
lead_e164stringoptionalOnly runs dispatched to this lead's phone number, in any format — it is normalized to E.164 before matching.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.list_runs \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_list_runs at https://app.chirply.io/api/mcp, same bearer token, same input.

Start a sales bridge

sales_bridges.start_runwriteconfirm

Dispatch a sales bridge for one lead RIGHT NOW: it RINGS EVERY AGENT IN THE POOL simultaneously and, on the first press of 1, bridges that agent to the lead. This places multiple REAL CALLS and bills the account's own Twilio for every leg, plus an SMS per agent when the bridge has one. Numbers on the do-not-contact list are refused. Follow the dispatch with sales_bridges.get_run; the bridged conversation lands in the call log as a call whose `kind` is `sales_bridge`.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
sales_bridge_idstring (uuid)requiredThe sales bridge to run.
lead_e164stringoptionalThe lead's phone number. Required unless contact_id is given.
contact_idstring (uuid)optionalA contact to call — their stored phone is used and the run is linked to them.

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.start_run \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "sales_bridge_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_start_run at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a sales bridge

sales_bridges.updatewriteadmin only

Update a sales bridge's settings. Omitted fields are left alone. Supplying `agents` REPLACES the whole pool in the order given.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe sales bridge to edit.
namestringoptionalNew name for this sales bridge.
phone_number_idstring (uuid) (or null)optionalThe line used as caller ID when dialing agents and the lead. null clears it.
whisper_messagestring (or null)optionalLead-context whisper spoken to the agent before connecting. Merge fields allowed; null clears it.
whisper_voicestring (or null)optionalA curated Twilio <Say> voice for the whisper. Anything else is ignored.
agent_smsstring (or null)optionalSMS sent to each PSTN agent on dispatch — a real text billed to the account's own Twilio on every run. Merge fields allowed; null stops it.
dial_timeoutintegeroptionalSeconds to ring each agent, clamped to 5–120.
record_callsbooleanoptionalRecord the bridged call. Recording laws vary by state — pair with recording_announce.
recording_announcebooleanoptionalAnnounce to both parties that the call may be recorded.
is_activebooleanoptionalfalse pauses the bridge — runs are refused.
agentsobject[]optionalReplaces the ENTIRE agent pool, in ring order. Each row needs a number or a member; anyone left out stops being dialed.
agents[].e164string (or null)optionalThe agent's phone number.
agents[].user_idstring (uuid) (or null)optionalA member's id, to ring their browser softphone instead.
agents[].labelstring (or null)optionalDisplay label for this agent.
clear_whisper_audiobooleanoptionaltrue removes the uploaded whisper recording so the text is spoken. Attach a new recording with sales_bridges.upload_whisper_audio. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.update \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Upload whisper audio

sales_bridges.upload_whisper_audiowriteadmin only

Attach a pre-recorded whisper clip to a sales bridge — the audio played privately to the AGENT who answers, before they are bridged to the lead; the lead never hears it. The clip is stored permanently in the account's storage and REPLACES any whisper recording the bridge already had, which cannot be recovered. From the next run onward the recording is played instead of the spoken whisper_message text. Uploading dials nobody and sends nothing — sales_bridges.start_run is what places calls.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe sales bridge the whisper clip belongs to.
audio_base64stringrequiredThe clip's raw bytes, base64-encoded. A `data:` URL prefix and line breaks are accepted and stripped. Decoded size must be 10 MB or less.
format"wav" | "mp3" | "aiff" | "gsm" | "ulaw"optionalWhat the bytes actually are. Twilio plays only these five; the value chosen here decides the stored file's extension and content type. Default: "wav"

Example

curl -X POST https://app.chirply.io/api/v1/actions/sales_bridges.upload_whisper_audio \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "audio_base64": "example"
  }'
Test with your API key

Over MCP the same operation is the tool sales_bridges_upload_whisper_audio at https://app.chirply.io/api/mcp, same bearer token, same input.

Save Twilio credentials

telephony.connect_twiliowriteconfirmadmin only

Connect (or update) its own Twilio account. Every call, message and number purchase made here is billed to these credentials, so pointing them at a different account changes who pays. The auth token and API-key secret are encrypted before storage; leaving either blank on an update keeps the stored value.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
account_sidstringrequiredTwilio Account SID (starts with 'AC').
auth_tokenstringoptionalTwilio auth token. Required on first connect; blank keeps the stored one.
api_key_sidstringoptionalOptional API Key SID (starts with 'SK'), used by the browser softphone.
api_key_secretstringoptionalOptional API Key secret. Blank keeps the stored one.
twiml_app_sidstringoptionalOptional TwiML App SID (starts with 'AP') for browser-phone routing.

Example

curl -X POST https://app.chirply.io/api/v1/actions/telephony.connect_twilio \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "account_sid": "example"
  }'
Test with your API key

Over MCP the same operation is the tool telephony_connect_twilio at https://app.chirply.io/api/mcp, same bearer token, same input.

Check the Twilio connection

telephony.get_connectionread

Report whether this account has connected its own Twilio account, and the connection's current status. Never returns the auth token or API key secret — those are stored encrypted and are not readable.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/telephony.get_connection \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool telephony_get_connection at https://app.chirply.io/api/mcp, same bearer token, same input.

Test the Twilio connection

telephony.test_connectionwriteadmin only

Verify the stored Twilio credentials by fetching the account from Twilio, and update the connection's status to reflect the result.

Parameters

No parameters — POST an empty body.

Example

curl -X POST https://app.chirply.io/api/v1/actions/telephony.test_connection \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{}'
Test with your API key

Over MCP the same operation is the tool telephony_test_connection at https://app.chirply.io/api/mcp, same bearer token, same input.

Add contacts to a campaign

voice_campaigns.add_recipientswriteconfirm

Enqueue more contacts into an existing voice campaign. On a RUNNING campaign they WILL BE CALLED — real calls billed to the account's own Twilio — as soon as the dispatcher reaches them. Contacts already on the campaign, and contacts without a dialable number, are skipped.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
campaign_idstring (uuid)requiredThe campaign to add to.
contact_idsarray of (string (uuid))optionalExplicit contacts to enqueue.
list_idstring (uuid)optionalEnqueue every contact on this saved list.
lifecyclestringoptionalEnqueue every contact with a phone in this lifecycle stage.
scheduled_atstring (date-time)optionalWhen to dial them. Defaults to the campaign's own start time.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.add_recipients \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_add_recipients at https://app.chirply.io/api/mcp, same bearer token, same input.

Call one contact with a menu or message

voice_campaigns.call_contactwriteconfirm

Place a single outbound IVR (or spoken-message) call to one contact. This CALLS A REAL PERSON and bills the account's own Twilio. Implemented as a one-recipient campaign so it goes through the same dispatcher — quiet hours, do-not-contact and pacing all apply, and the same IVR runtime walks the flow.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
contact_idstring (uuid)requiredThe contact to call.
from_phone_number_idstring (uuid)requiredThe line to call from.
ivr_menu_idstring (uuid)optionalAn IVR flow to run on answer. Omit to speak a message instead.
messagestringoptionalThe message to speak, when no IVR flow is given.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.call_contact \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "from_phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_call_contact at https://app.chirply.io/api/mcp, same bearer token, same input.

Create a voice campaign

voice_campaigns.createwriteconfirm

Create and LAUNCH an outbound voice campaign. This CALLS REAL PEOPLE — every contact in the chosen audience is dialed from its own Twilio account and billed to it, starting immediately unless a future start time is given. Content is either an IVR phone menu (the live runtime walks the same flow the builder draws), a spoken message, or an AI agent. Every answered call also offers a keypad opt-out (“press 9 to be removed”) unless opt_out_enabled is false — that is the only way somebody being dialed can stop the calls, so leave it on. Uploading pre-recorded broadcast audio is only possible in the app.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
namestringrequiredWhat to call this campaign.
from_phone_number_idstring (uuid)requiredThe line to call from.
content_kind"ivr" | "tts" | "ai"optionalWhat the callee hears: an IVR menu, a spoken message, or an AI agent. Default: "tts"
ivr_menu_idstring (uuid)optionalThe IVR flow to run when content_kind is 'ivr'.
tts_messagestringoptionalThe message to speak when content_kind is 'tts'.
hybrid_audio_asset_idstring (uuid)optionalFor TTS content, a reusable prerecorded audio asset to play after the merge-personalized introduction.
hybrid_pause_secondsintegeroptionalWhole-second transition pause between the personalized intro and recording. Default: 0
intro_tts_provider"twilio" | "elevenlabs"optionalHow hybrid introductions are spoken. ElevenLabs renders one clip per recipient and spends the account's credits. Default: "twilio"
intro_tts_voice_idstringoptionalElevenLabs voice id for personalized hybrid introductions.
ai_agent_idstring (uuid)optionalThe AI agent to hand answered calls to when content_kind is 'ai'.
ai_goalstring (or null)optionalPer-campaign goal overriding the AI agent's standing goals.
voicemail_messagestring (or null)optionalA different script to leave when a machine answers.
voicemail_timing"immediate" | "after_beep"optionalPlay as soon as AMD classifies the machine, or wait for its greeting and beep to finish. Default: "after_beep"
uncertain_action"live" | "voicemail" | "hangup"optionalWhich branch to use when answering-machine detection is uncertain. Default: "live"
wait_for_detectionbooleanoptionalFor IVR campaigns, wait for AMD before playing prompts or accepting keypresses; this adds a brief pause for live people. Default: false
tts_voicestring (or null)optionalA curated Twilio <Say> voice. Anything else falls back to the default.
sms_followup_textstring (or null)optionalOptional SMS sent after the call connects.
audience_kind"lifecycle" | "list" | "contacts"optionalHow the audience is chosen. Default: "lifecycle"
list_idstring (uuid)optionalThe saved list, when audience_kind is 'list'.
lifecyclestringoptionalRestrict to this lifecycle stage, when audience_kind is 'lifecycle'.
contact_idsarray of (string (uuid))optionalExplicit contacts, when audience_kind is 'contacts'.
scheduled_atstring (date-time)optionalISO 8601 start time. Omit to start dialing right now.
timezonestringoptionalIANA timezone used for quiet hours and per-recipient scheduling. Default: "UTC"
machine_detectionbooleanoptionalDetect answering machines. Always on for AI campaigns. Default: false
recordbooleanoptionalRecord the calls. Default: false
respect_quiet_hoursbooleanoptionalHold calls outside the quiet-hours window below. Default: false
quiet_start_localstringoptionalEarliest local dial time (HH:MM). Default: "08:00"
quiet_end_localstringoptionalLatest local dial time (HH:MM). Default: "21:00"
max_concurrencyintegeroptionalSimultaneous calls, clamped to 1–100. Default: 10
opt_out_enabledbooleanoptionalWhether the callee is offered a key to press to be removed from the list. On by default. Ignored for content_kind 'ivr', where the opt-out is an Unsubscribe action node inside the menu instead. Default: true
opt_out_digitstringoptionalThe single keypad digit 0–9 the callee presses to opt out. Defaults to 9. Default: "9"
opt_out_channelsarray of ("email" | "sms" | "whatsapp" | "call" | "rvm")optionalWhat that keypress actually stops: 'call' and 'rvm' (the default — they are on a call saying stop calling me), plus optionally 'sms' and 'email'. An empty array falls back to the voice default rather than announcing a key that does nothing. Default: ["call","rvm"]
opt_out_promptstring (or null)optionalWhat the callee HEARS, with {{digit}} standing in for the key — e.g. "To be removed from our list, press {{digit}} at any time.". null uses that default. This sentence is read to every person the campaign reaches, so it is the one line nobody on the team hears before a stranger does.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.create \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Example",
    "from_phone_number_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_create at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete a voice campaign

voice_campaigns.deletewriteconfirm

Permanently delete a voice campaign, its recipient queue and its stored broadcast audio. This cannot be undone. A running campaign stops.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe campaign to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.delete \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Open a voice campaign

voice_campaigns.getread

Fetch one voice campaign with its content (IVR menu, spoken message, recorded audio or AI agent), schedule, quiet-hours and concurrency settings, and its recipient tallies.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe campaign's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.get \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_get at https://app.chirply.io/api/mcp, same bearer token, same input.

List voice campaigns

voice_campaigns.listread

List the account's outbound voice campaigns (call blasts and outbound IVR) with their status, schedule and per-recipient tallies.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
status"draft" | "scheduled" | "running" | "paused" | "completed" | "canceled"optionalOnly campaigns in this status.
querystringoptionalText to match in the campaign's name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.list \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "limit": 25,
    "offset": 0
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_list at https://app.chirply.io/api/mcp, same bearer token, same input.

List campaign recipients

voice_campaigns.list_recipientsread

List a voice campaign's recipients with each one's dial status, attempt count, answering-machine verdict and last keypad selection.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
campaign_idstring (uuid)requiredThe campaign whose recipients to list.
status"pending" | "dialing" | "completed" | "no_answer" | "voicemail" | "uncertain" | … 3 moreoptionalOnly recipients in this status.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.list_recipients \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_list_recipients at https://app.chirply.io/api/mcp, same bearer token, same input.

Save opt-out settings

voice_campaigns.set_opt_outwriteconfirm

Change how somebody being dialed by a running voice campaign can get off the list — whether the “press a key to be removed” offer is made at all, which key, what pressing it stops (calls, voicemail drops, texts, emails), and the exact sentence read to them. This is deliberately editable WHILE the campaign dials, because “I set the wrong key and it's calling people right now” needs fixing in the next thirty seconds. Changes apply to calls placed from now on; anyone already dialed keeps whatever they heard. TURNING IT OFF REMOVES THE ONLY WAY A CALLEE CAN STOP THE CALLS — the campaign itself keeps running. Campaigns that play an IVR menu opt people out through an Unsubscribe action node in the menu instead, and are refused here.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe campaign whose opt-out settings change.
opt_out_enabledbooleanoptionalWhether the callee is offered a key to press to be removed from the list. Turning this OFF on a running campaign removes the only way a person being dialed can stop the calls — the campaign keeps going either way.
opt_out_digitstringoptionalThe single keypad digit 0–9 the callee presses to opt out. Defaults to 9.
opt_out_channelsarray of ("email" | "sms" | "whatsapp" | "call" | "rvm")optionalWhat that keypress actually stops: 'call' and 'rvm' (the default — they are on a call saying stop calling me), plus optionally 'sms' and 'email'. An empty array falls back to the voice default rather than announcing a key that does nothing.
opt_out_promptstring (or null)optionalWhat the callee HEARS, with {{digit}} standing in for the key — e.g. "To be removed from our list, press {{digit}} at any time.". null uses that default. This sentence is read to every person the campaign reaches, so it is the one line nobody on the team hears before a stranger does.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.set_opt_out \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_set_opt_out at https://app.chirply.io/api/mcp, same bearer token, same input.

Start, pause or cancel a campaign

voice_campaigns.set_statuswriteconfirm

Change a voice campaign's status. Setting it to 'running' STARTS OR RESUMES DIALING REAL PEOPLE and billing the account's own Twilio. 'paused' holds the queue; 'canceled' stops it for good and marks every not-yet-dialed recipient as skipped, which cannot be undone.

Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe campaign to change.
status"running" | "paused" | "canceled"requiredrunning resumes dialing, paused holds, canceled stops it permanently.

Example

curl -X POST https://app.chirply.io/api/v1/actions/voice_campaigns.set_status \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "status": "running"
  }'
Test with your API key

Over MCP the same operation is the tool voice_campaigns_set_status at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=telephony — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.