Callr Actions

Build voice & SMS flows in YAML — ship without waiting on telecom

Callr Actions is a declarative framework — inspired by GitHub Actions — for designing voice and SMS call flows. Compose complex logic from simple building blocks and turn a phone number into a working flow in minutes, not weeks.

scenario.yaml
description: Greet every caller and route the call
defaults:
language: en-US
branches:
inbound-call:
actions:
- action: say@v2
params:
what: Welcome to Callr! Connecting you now.
- action: dial@v1
params:
targets:
- number: "+33199001000"
timeout: 30

One framework, two teams

Made for marketing and engineering

Marketing reads and tweaks scenarios in the Callr Console; engineering manages them through the REST API. Same file, no hand-offs.

For marketing & ops

  • Launch campaigns in minutes

    Spin up a call-tracking number, IVR, or SMS flow as one readable scenario and go live the same day.

  • Stop waiting on developers

    Read and tweak a scenario directly in the Callr Console — no release cycle for a new prompt, route, or message.

  • Track every call and attribute it

    Push call events straight to Google Analytics or Mixpanel to tie phone conversations back to your campaigns.

  • Capture insights from conversations

    Record, transcribe, and extract structured data with AI so every interaction feeds your pipeline.

For developers

  • Declarative YAML, not glue code

    Describe the whole flow as branches and actions in one file — predictable, reviewable, easy to reason about.

  • Serverless and validated

    Scenarios run on Callr with a JSON schema for autocomplete, inline docs, and live testing. Nothing to host.

  • Version-controllable

    Author in your own editor and manage scenarios through the REST API, so flows live alongside your code.

  • Call out with fetch & webhooks

    The fetch action makes HTTP requests at runtime, so flows hit your REST API and consume webhooks.

  • Sandboxed JS & bring-your-own AI

    Drop into the javascript action for custom logic, use ${{ }} expressions inline, and plug in OpenAI or an AI agent.

Anatomy of a scenario

Six concepts, the whole platform

A scenario is a single YAML file. Learn these and you can build anything.

Branches

Named sections of a flow — including entry points — that a call enters and moves between.

Actions

The building blocks: say, gather, dial, record, sms, fetch — each a versioned step like say@v2.

Expressions

Runtime ${{ }} expressions, evaluated in JavaScript, compute dynamic values inside any parameter.

Conditions

The if statement runs an action only when a condition is true, so flows react to input or data.

Variables

User-defined values prefixed with $ store and carry data across the whole scenario.

Defaults

Scenario- and branch-level settings — language, voice, auto-answer — applied automatically.

Flows start from three entry points

  • inbound-call
  • inbound-sms
  • api-initiated

See it in code

Real scenarios, ready to adapt

Each is a complete, valid Callr Actions scenario. Copy it, change the numbers, ship it.

Voice

Smart inbound routing

Greet the caller, capture intent by voice, and dial the right team — in a handful of lines.

scenario.yaml
description: Route every caller to the right team
defaults:
language: en-US
branches:
inbound-call:
actions:
- action: answer@v1
- action: say@v2
params:
what: Welcome to Callr! In a few words, how can we help?
- action: recognize@v2
params:
hints: [billing, sales, support]
result: $intent
- action: dial@v1
params:
targets:
- number: "${{ ($intent.text || '').match(/sale/i) ? '+33199001001' : '+33199001002' }}"
timeout: 30
AI

Insights from every call

On hangup, summarise the transcript with AI into structured data and push it straight to your CRM.

scenario.yaml
description: Summarise every call and sync it to your CRM
branches:
hangup:
actions:
- action: openai@v2
params:
secret: "${{ secrets.openai }}"
endpoint: chat/completions
properties:
model: gpt-5.5
messages: "${{ $prompt }}"
result: $insights
- action: fetch@v2
params:
method: POST
url: https://crm.example.com/api/calls
body: "${{ JSON.stringify($insights) }}"
SMS

Instant lead capture

An inbound text upserts the lead, fires an auto-reply, and logs an attribution event for marketing.

scenario.yaml
description: Capture and reply to inbound SMS leads
branches:
inbound-sms:
actions:
- action: fetch@v2
params:
method: POST
url: https://crm.example.com/api/leads
body: "${{ JSON.stringify({ phone: sms.from, text: sms.text }) }}"
result: $lead
- action: sms@v1
params:
from: "${{ sms.to }}"
to: "${{ sms.from }}"
body: Thanks! An advisor will text you right back.
- action: mixpanel@v1
params:
username: "${{ secrets.mixpanel_user }}"
secret: "${{ secrets.mixpanel_secret }}"
project_id: "${{ secrets.mixpanel_project }}"
event: lead_captured

The toolbox

An action for everything

Voice, messaging, AI, recording, and integrations — each a versioned, documented building block.

Voice & call control

  • answer@v1Answer an inbound call
  • say@v2Text-to-speech, 100+ languages
  • gather@v2Collect keypad (DTMF) input
  • recognize@v2Speech-to-text
  • dial@v1Connect or place a call
  • amd@v2Detect answering machines

Messaging

  • sms@v1Send an SMS
  • email@v1Send an email

AI

  • openai@v2Call the OpenAI API
  • fetch@v2Reach Claude, Mistral & self-hosted LLMs
  • voicebot@v1Run an AI voice agent

Recording

  • startRecording@v1Record the call
  • record@v1Capture a voice message

Data & integrations

  • fetch@v2Call any REST API or webhook
  • javascript@v1Run sandboxed JavaScript
  • googleAnalytics@v1Send offline calls to GA
  • mixpanel@v1Push events to Mixpanel
  • memcache@v1Key/value store

Plus answering-machine detection, conferencing, DTMF, and more — see the full reference. Read the docs →

Turn a phone number into a flow today

Start free, or read the reference to see every action and example.

Book a demoGet started for free