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.
{
"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.
{
"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.
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/messagesand then/v1/callsuses 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
Acceptedimmediately, 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/callsonly starts the call and returns itsid- synchronously, in a moment. Whether the call actually connected, completed, or failed only comes later, through thecall.completed/call.failed/call.no_answer/call.missedwebhook. The scenario doesn't need to wait or poll for anything - just hook the Custom webhook module described above onto that outcome.