Skip to content
REST API

SMS and calls straight from a Make scenario

Make calls the volai REST API through its generic HTTP module - send an SMS, place a call through a voice agent, and get the result back as a webhook.

1Set up your key as a connection

In the HTTP > Make a request module, add an Authorization header with the value Bearer vk_YOUR_KEY (find the key in the portal under API and MCP). Save it as a reusable connection so you don't retype it in every module.

2Send an SMS from the scenario

Add an HTTP > Make a request module: method POST, URL https://volai.cz/v1/messages, Raw (JSON) body with to and body - map the values from an earlier module's bundle (a spreadsheet row, a webhook) instead of typing them in. Turn on Parse response so priceHal (the price in CZK cents, 1/100 CZK, for all segments) and segments land straight in the bundle for mapping - without it you only get raw text and would need a separate Parse JSON module. A message with non-ASCII characters uses more segments than a plain ASCII one.

json
{
  "to": "+420777123456",
  "body": "Objednavka je pripravena k vyzvednuti."
}

3Trigger a call through your voice agent

Add a second HTTP > Make a request module: POST https://volai.cz/v1/calls, Raw (JSON) body with to and the agentId of an existing voice agent - the agent must have a phone number assigned, otherwise the request fails with agent_no_number. You'll usually map to from the bundle of an earlier module - a phone number from a Google Sheets row, say - instead of typing it in, by clicking the field and picking the variable. Parse response helps here too: it unpacks the started call's id straight into the bundle, so you can map it onward without a separate Parse JSON module. The module only starts the call - the actual outcome (completed, no answer, failed) only comes from the webhook in the next step.

json
{
  "to": "+420777123456",
  "agentId": "ag_kx91fa2b"
}

4Receive events back through a Custom webhook

Add a Webhooks > Custom webhook module - Make generates a URL and acknowledges the incoming request right away (which satisfies the fast-200 rule from /en/docs/webhooks). Save that same address with PUT /v1/webhook, along with the list of events you care about. Watch out: an empty events array doesn't mean none - it means all of them. List the ones you want. The response also returns a secret - save it right away, GET /v1/webhook never returns it.

bash
curl -X PUT https://volai.cz/v1/webhook \
  -H "Authorization: Bearer vk_TVUJ_KLIC" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://hook.eu2.make.com/xxxxxxxx", "events": ["call.completed", "message.sent"]}'

5Branch the scenario by event type

Split on the event field in the webhook body (call.completed, call.failed, call.no_answer, call.missed, message.sent) with a Router module or a filter on each route. Add signature verification (Volai-Signature, HMAC-SHA256 over {t}.{rawBody} with your secret) following the exact formula on /en/docs/webhooks - don't skip it for a sensitive scenario, such as one touching payments or bookkeeping.

What you can do with it

Iterator sends SMS across a list of contacts

The Iterator module breaks an array of contacts (from Google Sheets, or a JSON array) into individual bundles, and an HTTP module then calls POST /v1/messages for each one - a batch announcement or reminder for a whole group of customers at once.

A filter on the connector decides who gets called

Make lets you put a condition right on the line between two modules - the filter only lets through the rows that match (say, the appointment is tomorrow and the customer hasn't confirmed), and only those trigger the HTTP module calling POST /v1/calls.

An error handler catches a failed call

Add an error handler route with the Ignore directive to the HTTP module calling /v1/calls - a single failed call, such as an invalid number, gets logged to a table or sent to Slack for manual follow-up, instead of failing the whole scenario.

Frequently asked questions

Is there a dedicated volai app in the Make marketplace?
Not yet - the generic HTTP and Webhooks modules, always available in Make, cover it. A dedicated app is a Make Technology Partner Program question, which we are not pursuing yet.
How many operations does a scenario with two HTTP modules use?
Each module run counts as one operation - a scenario that calls /v1/messages and then /v1/calls uses roughly two to three operations per run, depending on how many modules sit between them. Your Make plan sets the operations limit, not volai.
How do I add an error handler to the HTTP module, so one failed call doesn't stop the whole scenario?
Right-click the HTTP module and add an error handler route. Inside it, use the Ignore directive - the scenario ignores the error and keeps going, treating the module as if it returned no output. If a later module needs a fallback value instead, use Resume with your own substitute output. Reach for Break only when you want to stop the run outright and rerun it manually or automatically later.
Why does Custom webhook return `Accepted` right away, before the scenario finishes?
That's how the Custom webhook module behaves by default - it acknowledges receipt with a 200 status and the text Accepted immediately, then the scenario keeps running in the background. All the caller (volai, in this case) needs is that 200 within a few seconds, and that's satisfied.
Why does the HTTP module move on right after POST /v1/calls, even though the call hasn't finished?
POST /v1/calls only starts the call and returns its id - synchronously, in a moment. Whether the call actually connected, completed, or failed only comes later, through the call.completed / call.failed / call.no_answer / call.missed webhook. The scenario doesn't need to wait or poll for anything - just hook the Custom webhook module described above onto that outcome.

Try it now

Sign up and get 50 CZK in credit on top.