← All action domains

Automations

45 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.

Activate a workflow

automations.activatewriteconfirm

ARMS A LIVE AUTOMATION. Once active, every matching event fires this workflow's steps for real — sending SMS/email, placing calls, dropping voicemails, enrolling contacts in campaigns, spending the tenant's money — with no further human approval. Check the steps before turning it on.

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
shared_page_acknowledgedbooleanoptionalSet true only after acknowledging that this Page is connected to another Chirply account and enabling automation may send duplicate messages, replies or comments.
idstring (uuid)requiredThe workflow to activate.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.activate \
  -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 automations_activate at https://app.chirply.io/api/mcp, same bearer token, same input.

Add a workflow step

automations.add_stepwrite

Append an action to the end of a workflow. Adding a step does not run it; it runs on the next trigger or manual run. The action must be one the shared registry knows — see automations.list_action_types.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredThe workflow to add to.
action"find_create_contact" | "google_sheets" | "gmail_search" | "gmail_read_message" | "gmail_read_thread" | "gmail_attachment" | … 54 morerequiredThe action type this step performs.
action_configmap of string → objectoptionalThe action's settings, keyed by the field keys automations.list_action_types reports for this action type. For webhook/Call an API this includes url, method, query_params, auth_type plus its credential fields, headers, body_mode and the matching body field. Values support {{merge}} tokens where the field does. Default: {}

Example

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

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

Claim a send

automations.claimwrite

Atomically take a named claim for this account, so that exactly one caller proceeds and every other caller is told to stop. Intended for workflow steps that must not run twice when two separate events start two separate runs — a booking and a reschedule, for example, which are different events and legitimately start different runs. Returns claimed=true for the single winner and claimed=false for everyone else; treat false, and any error or timeout, as 'do not send'. Sends no messages, spends no money and reads no contact data; it only records that the key is taken until it expires.

Parameters

FieldTypeRequiredDescription
keystringrequiredYour own name for the thing being done once, for example "appt-followup:<contact id>:reminder-1". Opaque to Chirply: two callers race only when they use the SAME string, so compose it from whatever makes two sends duplicates of each other.
ttl_secondsintegeroptionalHow long the claim holds before the key can be won again, in seconds. Defaults to 86400 (24 hours); maximum 7776000 (90 days). Set it to the period over which a second send would be wrong, not to the length of the race.
detailmap of string → objectoptionalOptional free-form JSON recorded against the claim — a run id, a step name — so a person reading it later can tell which run took the send. Never interpreted by Chirply.

Example

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

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

Create automation

automations.createwriteconfirm

Create a complete automation/workflow/drip/nurture/follow-up sequence in one call. This is the right action for 'when a new lead is added, send a welcome message', even if the user calls it an autoresponder or campaign. Supply steps and this builds the real editable flow, generates a useful name when omitted, and turns it on by default. Active message/call steps later reach real people and incur the org's provider charges. Omit steps to create a paused visual-canvas draft.

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.

Also answers to set up autoresponder, create workflow, build drip, welcome campaign, nurture sequence.

Parameters

FieldTypeRequiredDescription
shared_page_acknowledgedbooleanoptionalSet true only after acknowledging that this Page is connected to another Chirply account and enabling automation may send duplicate messages, replies or comments.
namestringoptionalWhat to call it. Omit it and a useful name is generated.
descriptionstring (or null)optionalWhat this automation does.
trigger"gmail_message_received" | "google_sheets_row_new" | "google_sheets_row_updated" | "custom_record_created" | "custom_record_updated" | "custom_record_deleted" | … 80 moreoptionalThe event that fires it. Defaults to contact_created when steps are supplied, or manual for an empty visual draft.
stepsobject[]optionalThe complete ordered sequence. Draft routine message copy and timing from the user's goal instead of asking them to supply every field.
steps[].action"find_create_contact" | "google_sheets" | "gmail_search" | "gmail_read_message" | "gmail_read_thread" | "gmail_attachment" | … 54 morerequiredWhat this step does. Use send_sms/send_email for messages and wait for a real durable delay.
steps[].action_configmap of string → objectoptionalSettings for this step. send_sms: {body}; send_email: {subject, body}; wait: {duration, unit}; create_task: {title, description, priority, due_in_days, assignee_id — a workspace member id; omit it to create the task unassigned}; add_tag: {tag}. Default: {}
stop_on_replybooleanoptionalStop an in-flight sequence when the contact replies. Defaults true for multi-step follow-up.
is_activebooleanoptionalArm it immediately. Defaults true when steps are supplied and false for an empty shell.
webhook_secretstring (or null)optionalRequire this value in the x-automation-secret header to trigger via the API.

Example

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

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

Build this flow

automations.create_from_templatewrite

Create a PAUSED normal automation from a private automation template. Bot-flow templates are rejected, nothing is sent, and the new automation cannot react to live events until separately activated.

Parameters

FieldTypeRequiredDescription
template_idstringrequiredPermanent built-in starter id or private saved-template UUID returned by automations.list_templates.
namestringoptionalOptional name for the new paused workflow; defaults to the template name.
asset_idstring (or null)optionalConnected Instagram account id, Facebook Page id, or WhatsApp phone-number id required by built-in social starters; private saved templates retain their same-account binding.
keywordstring (or null)optionalCase-insensitive word or phrase that must appear in the inbound comment or message. Required for whatsapp_lead_followup so an answer cannot restart the same workflow.
media_idstring (or null)optionalOptional Instagram post or Reel id. When omitted, a comment template listens across that account.
destination_urlstring (uri) (or null)optionalPublic http:// or https:// link delivered after the person replies. Required for instagram_comment_link; that template is rejected without it.

Example

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

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

Delete a workflow

automations.deletewriteconfirm

Permanently delete a workflow along with its steps and its entire run history. 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 workflow to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_delete at https://app.chirply.io/api/mcp, same bearer token, same input.

Delete saved step

automations.delete_saved_stepwriteconfirm

Permanently delete one saved reusable step from this account. Automations that already had it inserted keep their own copies and are unaffected, but the saved entry cannot be recovered.

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
saved_step_idstring (uuid)requiredSaved-step UUID returned by automations.list_saved_steps.

Example

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

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

Delete a workflow step

automations.delete_stepwriteconfirm

Remove a step from a workflow. The remaining steps keep their order. 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
workflow_idstring (uuid)requiredThe workflow the step belongs to.
step_idstring (uuid)requiredThe step to delete.

Example

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

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

Delete workflow template

automations.delete_templatewriteconfirm

Permanently delete one private saved workflow template from this account. Existing workflows installed from it are unaffected, but the frozen template cannot be recovered; built-in Chirply starters cannot be deleted.

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
template_idstring (uuid)requiredPrivate saved-template UUID to permanently delete.

Example

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

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

Duplicate workflow

automations.duplicatewrite

Create a separate PAUSED copy of one workflow's current graph in this account. It copies no runs, history, legacy steps, or inbound-webhook secret and sends nothing until separately reviewed and activated.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredWorkflow in this account to copy.
namestringoptionalOptional name for the paused copy; defaults to the source name plus 'copy'.

Example

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

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

Duplicate steps

automations.duplicate_stepswrite

Copy one or more of a workflow's steps back into the SAME workflow with new node ids. Works on normal automations and bot flows alike. The copy arrives unconnected, so the sequence that already runs is unchanged until the copy is wired to a path in the builder. Nothing is sent and no contact is enrolled by this call.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredWorkflow in this account holding the steps to copy — a normal automation or a bot flow.
node_idsstring[]requiredNode ids to copy. Connections between the chosen nodes are kept.
include_downstreambooleanoptionalWhen true, every step reachable from the given nodes is copied too. Default: false

Example

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

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

Add contacts to an automation

automations.enroll_contactswriteconfirm

STARTS THE WORKFLOW FOR REAL for every contact given — the bulk 'Add to automation' action. Immediate steps can send real SMS/email/calls and incur real charges; wait steps remain scheduled and resume later. This works even while automatic enrollment is paused. Continues past individual failures and reports the tally.

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
workflow_idstring (uuid)requiredThe workflow to enroll into.
contact_idsarray of (string (uuid))requiredContacts to enroll. Each one gets a full run of every step.

Example

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

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

Fetch sample data

automations.fetch_mapping_sampleread

Read a recent saved contact, a recent Facebook lead submission, or the most recent completed submission of one of this account's own forms, for data mapping before a workflow has run. A native form sample returns the exact payload the form-submitted trigger emits, including the submission's own response id and the time it came in. Facebook reads use the connected Page and count toward Meta API limits. Creates no contacts, starts no runs, sends no messages and buys no ads. Samples contain only available values; provider samples do not imply a saved contact.

Parameters

FieldTypeRequiredDescription
source"recent_contact" | "facebook_lead" | "native_form"requiredRead the newest saved contact, a recent submission from a connected Facebook lead form, or the most recent completed submission of one of this account's own forms.
form_idstringoptionalConnected Facebook instant form ID. Required for facebook_lead; select a specific form in the trigger.
native_form_idstring (uuid)optionalOne of this account's own forms. Required for native_form; select a specific form in the Form submitted entry point.
mappinganyoptionalOptional JSON input containing trigger references to resolve against this sample without running a workflow step.

Example

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

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

Open a workflow

automations.getread

Fetch one workflow with its ordered steps and the webhook endpoint that can trigger it, matching the workflow editor page.

Also answers to open automation, view drip, inspect sequence.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe workflow's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_get at https://app.chirply.io/api/mcp, same bearer token, same input.

Check a claim

automations.get_claimread

Report whether a named claim is currently held in this account, when it was taken and when it expires. Read-only and does NOT compete for the claim: by the time the answer arrives another run may have taken it, so never use this to decide whether to send — use Claim a send for that. Intended for dashboards and for working out why a workflow stopped.

Parameters

FieldTypeRequiredDescription
keystringrequiredYour own name for the thing being done once, for example "appt-followup:<contact id>:reminder-1". Opaque to Chirply: two callers race only when they use the SAME string, so compose it from whatever makes two sends duplicates of each other.

Example

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

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

Open the automation flow

automations.get_flowread

Fetch a workflow's flow graph — the nodes and connections the visual builder draws, and the exact structure the runtime walks. A workflow that predates the builder is lifted from its stored steps on the way out, so this always returns a graph. Read-only.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredThe workflow to read.

Example

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

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

List automation mapping fields

automations.get_mapping_fieldsread

List eligible preceding steps and declared or observed output fields for a workflow node. Optionally reads a retained run sample in this account. Resolves no credentials, runs no actions, sends no messages and makes no provider calls.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredAccount workflow whose saved graph supplies source eligibility.
node_idstringrequiredStable node ID receiving mapped input.
run_idstring (uuid)optionalOptional run of this workflow supplying observed field samples.

Example

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

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

Open an automation run

automations.get_runread

Fetch one run with its full context payload and error, for debugging why an automation did or didn't do what was expected.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe run's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_get_run at https://app.chirply.io/api/mcp, same bearer token, same input.

View saved step

automations.get_saved_stepread

Return one saved automation step with the frozen nodes and connections it inserts. Read-only: it creates nothing, changes no workflow and sends no messages.

Parameters

FieldTypeRequiredDescription
saved_step_idstring (uuid)requiredSaved-step UUID returned by automations.list_saved_steps.

Example

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

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

Inspect automation step data

automations.get_step_dataread

Read bounded, redacted trigger data and executed step inputs, outputs and status for a run in this account. Includes persisted results across waits. No actions execute, messages are sent or provider charges incurred.

Parameters

FieldTypeRequiredDescription
run_idstring (uuid)requiredAccount workflow run to inspect.

Example

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

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

View workflow template

automations.get_templateread

Return one private normal-automation template with its frozen visual graph. Bot-flow templates are not exposed; this read creates nothing and sends no messages.

Parameters

FieldTypeRequiredDescription
template_idstringrequiredBuilt-in starter id or private saved-template UUID returned by automations.list_templates.

Example

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

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

Copy AI instructions

automations.get_webhook_briefread

Produce a complete, paste-ready integration brief for one workflow's inbound webhook — the URL, the secret header when it has one, every contact field the endpoint accepts including this organization's own custom fields, the contact-matching rules, runnable curl and fetch examples, and what each response code means. Written for a person or an AI assistant wiring up another system; it is the same document the workflow builder's "Copy AI instructions" button copies. Reads only: nothing is sent, started or charged. The brief embeds the webhook secret, so treat the result as a credential.

Also answers to webhook instructions, how do I send data to this automation, webhook docs, integrate with this automation.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe workflow whose inbound webhook should be documented.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.get_webhook_brief \
  -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 automations_get_webhook_brief at https://app.chirply.io/api/mcp, same bearer token, same input.

Open webhook settings

automations.get_webhook_settingsread

Read one automation's inbound-webhook intake settings and activity, as the Webhook settings card on its Test & settings tab shows them: the field mapping (incoming key → contact field, for form posts such as Elementor's Webhook action), the tag policy (any tag the request names, or only an allow-list), what a request may do to a contact that already exists (create and update / create only / update only chosen fields), the per-minute rate limit, and the email-consent setup — plus how many requests were received and how many were rejected (over the rate limit, or a missing/wrong secret) and when, the KEYS of the last request (never its values), and what the last request did (tags ignored, fields protected, consent result). Reads only; never returns the webhook secret.

Also answers to webhook field mapping, webhook rate limit, webhook rejected requests, webhook allowed tags, elementor webhook settings.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe automation (workflow) whose inbound webhook settings to read.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.get_webhook_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 automations_get_webhook_settings at https://app.chirply.io/api/mcp, same bearer token, same input.

Insert saved step

automations.insert_saved_stepwrite

Add a saved step's frozen steps to a workflow's graph in this account, with new node ids. Works on normal automations and bot flows alike. The copy arrives UNCONNECTED — it changes nothing that already runs until it is wired to a path in the builder — and the workflow's live or paused state is untouched. Nothing is sent and no contact is enrolled by this call.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredWorkflow in this account to insert the saved steps into — a normal automation or a bot flow.
saved_step_idstring (uuid)requiredSaved-step UUID returned by automations.list_saved_steps.

Example

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

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

List workflows

automations.listread

List the organization's automation workflows, newest first, with each one's trigger, whether it is active, and how many steps and runs it has. Other products may call these drips, nurture sequences, follow-up campaigns, or autoresponders.

Also answers to automations, drips, sequences, nurture campaigns, autoresponders.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
trigger"gmail_message_received" | "google_sheets_row_new" | "google_sheets_row_updated" | "custom_record_created" | "custom_record_updated" | "custom_record_deleted" | … 80 moreoptionalOnly workflows on this trigger.
is_activebooleanoptionaltrue for live workflows, false for paused.
querystringoptionalText to match in the name or description.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_list at https://app.chirply.io/api/mcp, same bearer token, same input.

List available step actions

automations.list_action_typesread

The shared action registry — every action a workflow step (or a call disposition, or a bulk action) can run, with its editable fields. Read this before writing steps so action_config uses the right keys. A bot flow's action nodes run these same actions, but its conversation node types (messages, asks, AI replies, Messenger actions, webviews, handoffs) are documented by bot_flows.list_node_types, not here.

Parameters

FieldTypeRequiredDescription
category"messaging" | "crm" | "projects" | "telephony" | "clients" | "billing" | … 1 moreoptionalOnly actions in this category. 'projects' holds create_project_task and update_project_task, which act on a project's tasks rather than the enrolled contact (ids come from projects.list / projects.overview / projects.list_items, or from a project-task trigger's taskId/projectId); 'clients' holds the reseller/white-label actions for managing an agency's client accounts (entitled agency accounts only); 'billing' holds Stripe actions that act on a contact's subscription on its connected Stripe account.

Example

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

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

List automation node events

automations.list_node_eventsread

Read the account's durable visual-workflow execution ledger, including run and node starts, waits, resumes, completions, failures, replies and timeouts. Filter it to one workflow, run, node, event type or time window when diagnosing automation behavior. This is read-only and sends no messages.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
workflow_idstring (uuid)optionalOnly events for this workflow id.
run_idstring (uuid)optionalOnly events for this workflow run id.
node_idstringoptionalOnly events for this persisted visual-flow node id.
event_typesarray of ("run_started" | "run_waiting" | "run_resumed" | "run_completed" | "run_failed" | "run_canceled" | … 8 more)optionalOnly these lifecycle event types. Omit for every type.
occurred_afterstring (date-time)optionalOnly events at or after this ISO 8601 timestamp.
occurred_beforestring (date-time)optionalOnly events at or before this ISO 8601 timestamp.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.list_node_events \
  -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 automations_list_node_events at https://app.chirply.io/api/mcp, same bearer token, same input.

List automation runs

automations.list_runsread

Execution history: every time a workflow fired, with its status, how far it got, the contact it ran for and any error. Newest first. Filter by workflow or status.

Parameters

FieldTypeRequiredDescription
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0
workflow_idstring (uuid)optionalOnly runs of this workflow.
status"pending" | "running" | "completed" | "failed" | "canceled"optionalOnly runs in this status.
contact_idstring (uuid)optionalOnly runs for this contact.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_list_runs at https://app.chirply.io/api/mcp, same bearer token, same input.

Saved steps

automations.list_saved_stepsread

List this account's reusable saved steps — the pieces of a workflow saved once and inserted into others, such as a configured webhook or a three-email follow-up. They serve normal automations AND bot flows: every capability here accepts either kind of workflow id. Returns each saved step's name, description and how many steps it adds, without the stored graph. Read-only: nothing is created, no workflow changes and no messages are sent.

Parameters

FieldTypeRequiredDescription
querystringoptionalOptional case-insensitive search across the saved step's name.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.list_saved_steps \
  -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 automations_list_saved_steps at https://app.chirply.io/api/mcp, same bearer token, same input.

List workflow templates

automations.list_templatesread

List this account's private normal-automation templates. Bot-flow starters and saved bot templates are deliberately excluded; the list omits full graphs and changes nothing.

Parameters

FieldTypeRequiredDescription
source"starter" | "saved"optionalOptional source filter: Chirply starters or private templates saved by this account.
querystringoptionalOptional case-insensitive search across template name, description, category, and channel.
categorystringoptionalOptional exact template category, such as social, sales, or support.

Example

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

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

List available triggers

automations.list_trigger_typesread

Every event an automation can start on or stop on. Start and stop use the same fully wired catalog and the same optional filters. Read this before writing trigger or stop_trigger nodes with automations.set_flow. A workflow may have SEVERAL start triggers (any one begins a run) and any number of stop triggers (any matching event ends the contact's in-flight run). Bot flows restrict their START entries to the social/manual set in bot_flows.list_triggers, while their stop triggers draw from this catalog. Read-only.

Parameters

FieldTypeRequiredDescription
usable_as"start" | "stop"optionalOnly triggers usable in this position. Start and stop intentionally return the same catalog.
wired_onlybooleanoptionalOnly triggers something in the app actually raises today.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.list_trigger_types \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "usable_as": "start",
    "wired_only": true
  }'
Test with your API key

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

Reorder a workflow step

automations.move_stepwrite

Move a step one place up or down, swapping it with its neighbour — the arrows in the step list. Moving a step at the top or bottom edge is a no-op.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredThe workflow the step belongs to.
step_idstring (uuid)requiredThe step to move.
direction"up" | "down"requiredWhich way to move it.

Example

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

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

Pause a workflow

automations.pausewrite

Turn a workflow off. Its trigger stops firing it; the steps and run history are kept and it can be activated again. Manual runs still work while paused.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe workflow to pause.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.pause \
  -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 automations_pause at https://app.chirply.io/api/mcp, same bearer token, same input.

Preview automation data mapping

automations.preview_step_dataread

Resolve JSON input mappings against a retained workflow run without executing any step. Preserves whole-value JSON types, reports missing values and leaves existing merge fields untouched. Sends no messages and makes no provider calls.

Parameters

FieldTypeRequiredDescription
run_idstring (uuid)requiredAccount workflow run supplying retained samples.
inputanyrequiredJSON action input containing trigger or steps references to preview.

Example

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

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

Release a claim

automations.release_claimwriteconfirm

Give a claim back before it expires, so the next caller can win it. Use this only after a send that you KNOW delivered nothing — a step that failed before dispatch. Releasing a claim whose send may have succeeded is how the duplicate message this mechanism prevents gets sent anyway, so when the outcome is uncertain, leave the claim held and let it expire. Sends nothing and spends nothing.

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
keystringrequiredYour own name for the thing being done once, for example "appt-followup:<contact id>:reminder-1". Opaque to Chirply: two callers race only when they use the SAME string, so compose it from whatever makes two sends duplicates of each other.

Example

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

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

Rename a workflow step

automations.rename_stepwrite

Give one card on a workflow's visual canvas its own name, so six steps that all send email can be told apart. The name replaces the summary the card derives from its settings — on the canvas, in the next-step pickers and in a contact's run history — and an empty name puts that summary back. A caption only: the step keeps its id, its settings, its connections and its place in the sequence, so nothing about what the automation does or who it reaches changes. Use automations.get to read the current graph and its node ids.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe workflow the step belongs to.
node_idstringrequiredThe canvas node to rename, as `id` on that node in automations.get's `flow.nodes`.
namestringrequiredWhat to call this step, up to 60 characters. An empty string clears the name and restores the derived summary.

Example

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

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

Run a workflow now

automations.run_for_contactwriteconfirm

RUNS THE WORKFLOW FOR REAL, RIGHT NOW, against one contact — the 'Run manually' panel. Every step executes immediately through the tenant's own providers: real SMS and email leave, real calls and voicemails are placed, tags and deals change, and the tenant is billed. Works whether or not the workflow is active. Returns the run id and each step's outcome.

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
workflow_idstring (uuid)requiredThe workflow to run.
contact_idstring (uuid) (or null)optionalThe contact to run it against. null runs steps that need no contact. Default: null
contextmap of string → objectoptionalExtra data merged into the run context and available as {{tokens}}.

Example

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

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

Save as template

automations.save_as_templatewrite

Save a private frozen copy of one workflow's current visual graph for reuse in this account. This does not activate, run, or send the workflow; later edits to the source do not change the template.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredWorkflow in this account whose current graph should be frozen.
namestringrequiredPrivate template name shown in the workflow library.
descriptionstring (or null)optionalOptional explanation of what the template does, or null.
categorystringoptionalSearchable template category, such as sales, support, or social. Default: "other"

Example

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

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

Save as reusable step

automations.save_steps_as_templatewrite

Save a frozen copy of one or more steps from a workflow so they can be inserted into other automations in this account. Entry points and exit rules cannot be saved, because they say when an automation runs rather than what it does. The source workflow is not changed, nothing runs and no messages are sent; saving over an existing name replaces what that name holds.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredWorkflow in this account holding the steps to freeze — a normal automation or a bot flow.
node_idsstring[]requiredNode ids from that workflow's graph to save. Connections between the chosen nodes are kept; a connection leading out of the selection is not, because it describes where the original went.
include_downstreambooleanoptionalWhen true, every step reachable from the given nodes is included as well — the way to save a whole follow-up sequence by naming only its first step. Default: false
namestringrequiredName shown in the builder's saved-step list. Reusing a name replaces that saved step.
descriptionstring (or null)optionalOptional explanation of what these steps do and when to reach for them, or null.

Example

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

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

Save the automation flow

automations.set_flowwriteconfirm

Replace a normal automation's entire process graph — business triggers, actions, waits, branches and their connections — in one call. Facebook, Instagram and WhatsApp conversation messages live in the separate Bot Flow product. A graph may hold SEVERAL 'trigger' nodes, all leading to the same beginning, plus stop_trigger nodes that cancel an in-flight run. Destructive: pass the complete graph, not just changes. Saving sends nothing; activating only makes future matching events eligible to run real actions through the account's provider accounts. Blocking graphs may be saved as drafts but cannot be active.

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
shared_page_acknowledgedbooleanoptionalSet true only after acknowledging that this Page is connected to another Chirply account and enabling automation may send duplicate messages, replies or comments.
workflow_idstring (uuid)requiredThe workflow to rewrite.
is_activebooleanoptionalTurn the automation on or off as part of the save. Turning it on is refused while the graph has blocking problems. Omit to leave it as it is.
flowobjectrequiredThe complete flow graph.
flow.versionnumberoptionalGraph schema version. Omit for the current one.
flow.nodesobject[]requiredEvery node in the graph, including at least one trigger.
flow.nodes[].idstringrequiredUnique within this graph; edges reference it.
flow.nodes[].type"trigger" | "stop_trigger" | "action" | "wait" | "branch" | "switch" | … 2 morerequired'trigger' enrolls a contact; 'stop_trigger' cancels their in-flight run; 'action' performs a registry action; 'wait' defers the run; 'branch' and 'switch' route it; 'end' finishes it; 'note' is canvas-only documentation.
flow.nodes[].labelstringrequiredNon-empty caption drawn on the builder's card.
flow.nodes[].positionobjectrequiredWhere the card sits on the canvas. Layout only; does not affect execution.
flow.nodes[].position.xnumberrequiredHorizontal canvas coordinate in pixels, increasing to the right.
flow.nodes[].position.ynumberrequiredVertical canvas coordinate in pixels, increasing downward.
flow.nodes[].endsstring[]optionalOutlet names on this node whose path deliberately finishes — the graph's way of saying "nothing runs after this" without an extra 'end' node. Purely a statement of intent: an unconnected outlet already stops the run either way, and an outlet named here that also has a connection is ignored (the connection wins). Omit it unless you are recording that choice.
flow.nodes[].datamap of string → objectrequiredType-specific settings. trigger/stop_trigger: {trigger,config}. action: {action:{type,config}}. wait: {amount,unit}. branch: {condition:{type,key?,value?,op?}} where type is one of has_tag (key = tag id), lifecycle_is (value), has_email / has_phone (whether an address is HELD), can_email / can_text (whether it may be USED right now — reads the same unsubscribed list the send itself reads, so the branch and the send cannot disagree), form_answer (key = the submitted field's key, op = is | is_not | is_ticked | is_not_ticked | is_blank | is_not_blank, value for the first two; only meaningful below a form_submitted trigger, and is_blank is the only operator that tells an explicitly unticked box apart from a question that was never asked), has_upcoming_appointment (key = an appointment type id to narrow to one type, or omit it for any — answers Yes when the calendar holds a confirmed appointment for the contact that has not happened yet, read live at the moment the branch runs, so a reschedule keeps answering Yes and cancelling one of two bookings leaves the other answering Yes), has_active_subscription (value = a Stripe product id 'prod_…', a comma-separated list of them, or a word matched case-insensitively against the plan/product name; omit it for any subscription at all — answers Yes when the contact holds a subscription that is 'active' or 'trialing', read live at the moment the branch runs, which is what makes it safe under a cancellation trigger: a contact who cancels one plan while still paying for another stays Yes), or field_equals / field_contains, where key is a contact column ('lifecycle', 'source', 'title', 'business_name', 'website', 'notes'), one of the organization's OWN contact custom fields written as 'custom.<field key>' (call contacts.list_fields for the keys), or a data reference such as '{{trigger.price_id}}' — a reference is resolved and compared against `value` itself, which is how a run is routed by what the enrolling event carried rather than by the contact record. switch: {key,cases} where key accepts the same three forms. end: {}. note: {text}.
flow.edgesobject[]requiredThe connections that define execution order.
flow.edges[].idstringrequiredUnique within this graph.
flow.edges[].sourcestringrequiredNode id this connection leaves.
flow.edges[].sourceHandlestringrequiredWhich outlet it leaves by: 'next' on most nodes, 'answered'/'invalid'/'timeout' on a conversation_ask, 'true'/'false' on a branch, or 'case:<key>'/'default' on a switch. One connection per outlet. Every start trigger's 'next' must point at the same node.
flow.edges[].targetstringrequiredNode id this connection arrives at.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.set_flow \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "flow": {
      "nodes": [
        {
          "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
          "type": "trigger",
          "label": "example",
          "position": {
            "x": 1,
            "y": 1
          },
          "data": {}
        }
      ],
      "edges": [
        {
          "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
          "source": "example",
          "sourceHandle": "example",
          "target": "example"
        }
      ]
    }
  }'
Test with your API key

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

Replace all workflow steps

automations.set_stepswriteconfirm

Replace a workflow's entire step list in one call, in the order given. Every existing step is deleted first, so this is destructive — pass the complete sequence, not just the changes. Nothing runs until the workflow is triggered.

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
workflow_idstring (uuid)requiredThe workflow to rewrite.
stepsobject[]requiredThe full ordered list of steps. An empty array clears the workflow.
steps[].action"find_create_contact" | "google_sheets" | "gmail_search" | "gmail_read_message" | "gmail_read_thread" | "gmail_attachment" | … 54 morerequiredThe action type this step performs.
steps[].action_configmap of string → objectoptionalThe action's settings, keyed by the field keys automations.list_action_types reports for this action type. For webhook/Call an API this includes url, method, query_params, auth_type plus its credential fields, headers, body_mode and the matching body field. Values support {{merge}} tokens where the field does. Default: {}

Example

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

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

Send test request

automations.test_api_callwriteconfirm

Send one real HTTPS request using the same Call an API configuration that a workflow step uses, then return the external service's HTTP status, timing, headers, and bounded response body. This does not save or run a workflow, but POST, PUT, PATCH, or DELETE may create data, trigger downstream work, spend money, or otherwise change the external system.

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.

Also answers to test webhook, try API call, inspect API response.

Parameters

FieldTypeRequiredDescription
contact_idstring (uuid) (or null)optionalA contact whose account fields fill {{merge}} tokens. The contact is not enrolled or changed.
urlstringrequiredThe complete public HTTPS request URL. It may contain {{merge}} tokens.
method"GET" | "POST" | "PUT" | "PATCH" | "DELETE"optionalHTTP method to send. Write methods may change the external system. Default: "POST"
query_paramsstringoptionalOptional query parameters, one name=value pair per line. Do not put JSON here.
auth_type"none" | "bearer" | "basic" | "api_key"optionalAuthentication scheme added to the request. Default: "none"
auth_tokenstringoptionalBearer token when auth_type is bearer. Supports {{merge}} tokens.
auth_usernamestringoptionalBasic authentication username when auth_type is basic.
auth_passwordstringoptionalBasic authentication password when auth_type is basic.
api_key_location"header" | "query"optionalWhether an API key is sent as a request header or query parameter. Default: "header"
api_key_namestringoptionalHeader or query-parameter name for API-key authentication, such as X-API-Key.
api_key_valuestringoptionalAPI-key value when auth_type is api_key. Supports {{merge}} tokens.
headersstringoptionalOptional custom headers, one Header-Name: value pair per line.
body_mode"context" | "json" | "form" | "raw" | "none"optionalRequest-body format. GET never sends a body. Default: "context"
body_jsonstringoptionalJSON request body when body_mode is json. It must remain valid after merge tokens are filled.
body_formstringoptionalForm body when body_mode is form, one name=value pair per line.
body_rawstringoptionalUnencoded request text when body_mode is raw.
content_typestringoptionalContent-Type header for a raw body, such as text/plain or application/xml.

Example

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

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

Edit workflow details

automations.updatewriteconfirm

Update a workflow's name, description, first visual start trigger, webhook secret, or its whole visual flow graph. Omitted fields are left alone. Supplying `flow` REPLACES the entire canvas — branches, actions and all — so read the workflow first and send the complete graph, not a patch. Changing the trigger or the flow of an ACTIVE workflow changes which real events fire it and can cause its real messages, calls or paid actions to run for a different audience.

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
shared_page_acknowledgedbooleanoptionalSet true only after acknowledging that this Page is connected to another Chirply account and enabling automation may send duplicate messages, replies or comments.
idstring (uuid)requiredThe workflow to edit.
namestringoptionalNew name.
descriptionstring (or null)optionalWhat this automation does, for the team. null clears it.
trigger"gmail_message_received" | "google_sheets_row_new" | "google_sheets_row_updated" | "custom_record_created" | "custom_record_updated" | "custom_record_deleted" | … 80 moreoptionalThe event that fires it.
flowobjectoptionalThe complete visual flow graph, replacing whatever the canvas holds now. This is the only way to give a workflow branches — `steps` on automations.create builds a straight line, and automations.add_step appends to one. Nodes are {id, type, label?, position?, data}, where type is trigger | action | branch | switch | wait | end | note, and edges are {id, source, target, sourceHandle} with sourceHandle 'next' for a plain step or 'true'/'false' out of a branch. The graph is validated before it is saved and rejected if it would not run. Cannot be combined with `trigger` — the flow's own trigger node decides that.
flow.nodesobject[]requiredEvery card on the canvas, including notes.
flow.nodes[].idstringrequiredUnique within the flow; edges reference it.
flow.nodes[].typestringrequiredtrigger | action | branch | switch | wait | end | note, or a conversation node type.
flow.nodes[].labelstringoptionalThe palette caption for this node type, stamped when the card is created. Use `name` to give one card its own title.
flow.nodes[].namestringoptionalThe author's own name for this step, shown instead of the derived summary on the canvas, in the step pickers and in run history. Omit it, or send an empty string, to fall back to that summary. A caption only — it never changes what the step does.
flow.nodes[].positionobjectoptionalCanvas coordinates. Omitted nodes stack at the origin and are awkward to read.
flow.nodes[].position.xnumberrequiredHorizontal position on the canvas, in pixels.
flow.nodes[].position.ynumberrequiredVertical position on the canvas, in pixels. Steps read top to bottom.
flow.nodes[].datamap of string → objectoptionalNode payload: {trigger, config} for a trigger, {action:{type,config}} for an action, {condition:{type,key,value}} for a branch, {text} for a note.
flow.edgesobject[]optionalThe connections between them. Default: []
flow.edges[].idstringrequiredUnique within the flow.
flow.edges[].sourcestringrequiredNode id this leaves.
flow.edges[].targetstringrequiredNode id this arrives at.
flow.edges[].sourceHandlestringoptionalWhich outlet it leaves by: 'next' for a plain step, 'true' or 'false' out of a branch.
flow.versionnumberoptionalGraph format version. Omit it and the current one is stamped.
webhook_secretstring (or null)optionalNew x-automation-secret value. null or empty removes the requirement.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.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 automations_update at https://app.chirply.io/api/mcp, same bearer token, same input.

Edit a workflow step

automations.update_stepwrite

Change what an existing step does. Both the action type and its config are replaced wholesale — send the complete config, not a patch.

Parameters

FieldTypeRequiredDescription
workflow_idstring (uuid)requiredThe workflow the step belongs to.
step_idstring (uuid)requiredThe step to edit.
action"find_create_contact" | "google_sheets" | "gmail_search" | "gmail_read_message" | "gmail_read_thread" | "gmail_attachment" | … 54 morerequiredThe action type this step performs.
action_configmap of string → objectoptionalThe action's settings, keyed by the field keys automations.list_action_types reports for this action type. For webhook/Call an API this includes url, method, query_params, auth_type plus its credential fields, headers, body_mode and the matching body field. Values support {{merge}} tokens where the field does. Default: {}

Example

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

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

Save webhook settings

automations.update_webhook_settingswriteconfirm

Change how one automation's public inbound webhook treats requests. Omitted fields keep their current value. This rewrites what an UNAUTHENTICATED caller holding the URL can do to the CRM: the field mapping decides which incoming keys become contact fields (and creates contacts from form posts); tag_mode 'any' lets a request apply — and create — any tag it names, 'allowlist' only the listed names; write_policy 'create_and_update' overwrites a matched contact's fields including email and phone, 'create_only' never changes an existing contact, 'update_fields' writes only the chosen fields (email/phone only ever fill a blank). A consent setup makes ticked requests record an email opt-in on the contact — and, when the account's double opt-in covers Automation webhooks, send each new address a real confirmation email from the account's sending address. Nothing is sent at the moment of saving; it applies to the next request.

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.

Also answers to map webhook fields, webhook tag allow list, limit webhook requests, stop webhook updating contacts, webhook email consent.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe automation (workflow) whose inbound webhook to configure.
field_mapobject[]optionalThe complete mapping, replacing the current one. An empty array removes it. Unmapped keys stay run data (merge fields) as before.
field_map[].keystringrequiredThe incoming key: a top-level body key (an Elementor field label such as 'Your Email'), a dotted path into nested JSON ('lead.email'), or an Elementor Advanced Data field id ('email').
field_map[].targetstringrequiredThe contact field it fills: email, phone, full_name, first_name, last_name, business_name, title, website, birthday, notes, address.line1, address.city, address.state, address.postal_code, address.country, tags (values become tag names, still subject to the tag policy), or custom.<field key> for one of the account's custom contact fields.
tag_mode"any" | "allowlist"optional'any' (the original behaviour): a request may apply any tag name it sends, creating tags that do not exist. 'allowlist': only names in allowed_tags are applied; anything else is ignored, never created, and reported in the response and the run log.
allowed_tagsstring[]optionalThe tag names a request may apply when tag_mode is 'allowlist', replacing the current list. An empty list with 'allowlist' means no request may apply any tag.
write_policy"create_and_update" | "create_only" | "update_fields"optionalWhat a request may do to a contact that already exists. 'create_and_update' (the original behaviour) overwrites every field sent, email and phone included. 'create_only' adds new people but never changes an existing contact or its tags (the automation still runs for them). 'update_fields' changes only the fields in update_fields. New contacts are always created in full.
update_fieldsstring[]optionalFor write_policy 'update_fields': the fields a request may change on an existing contact, replacing the current list.
rate_limit_per_minuteintegeroptionalRequests accepted per minute (a fixed one-minute window; default 120). Requests over it get HTTP 429 with Retry-After and are counted as rejected on the settings card.
consent_mode"off" | "field" | "always"optionalEmail consent. 'off': requests record no consent. 'field': consent_field says whether the person ticked an email opt-in. 'always': every request is an opt-in (a newsletter-only form). A tick is recorded in the contact's communication-preferences history exactly like a native form's consent question, through double opt-in when it covers Automation webhooks. An unticked or missing box changes nothing.
consent_fieldstring (or null)optionalFor consent_mode 'field': the incoming key of the opt-in checkbox (for example Elementor's acceptance field id). Ticked = any value other than blank, no, false, 0 or off.
consent_textstringoptionalThe opt-in wording shown beside the checkbox, recorded with every consent and quoted in a double opt-in email. Required while consent is on.
consent_text_fieldstring (or null)optionalOptional incoming key that carries the wording; its value is recorded instead of consent_text when present.

Example

curl -X POST https://app.chirply.io/api/v1/actions/automations.update_webhook_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 automations_update_webhook_settings 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=automations — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.