SMS a hovory přímo z n8n workflow
n8n zavolá REST API volai přes uzel HTTP Request - bez psaní kódu tak z workflow odešleš SMS, spustíš hovor přes hlasového agenta a výsledek dostaneš zpátky webhookem.
1Ulož si klíč jako credential
V n8n založ nový credential typu HTTP Header Auth: název hlavičky Authorization, hodnota Bearer vk_TVUJ_KLIC (klíč najdeš v portálu v sekci API a MCP). Přiřaď ho každému uzlu HTTP Request, který bude volat volai.cz/v1/* - stejný klíč platí pro SMS, hovory i webhook.
2Pošli SMS z workflow
Přidej uzel HTTP Request: metoda POST, adresa https://volai.cz/v1/messages, tělo JSON s poli to a body. Odpověď nese priceHal (cena v haléřích za všechny segmenty zprávy) a segments - u textu s diakritikou vyjde segmentů víc než u čistě ASCII zprávy. Ukázka níž proto text zprávy záměrně nechává bez diakritiky, ať zůstane v jednom segmentu - s diakritikou funguje stejně, jen se spotřebuje víc segmentů.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_TVUJ_KLIC" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "body": "Objednavka je pripravena k vyzvednuti."}'3Zavolej zákazníkovi přes svého agenta
Druhý uzel HTTP Request: POST https://volai.cz/v1/calls s to a agentId existujícího hlasového agenta (založíš ho v portálu nebo přes POST /v1/agents) - agent musí mít přiřazené vlastní číslo, jinak požadavek skončí chybou agent_no_number. Požadavek jen hovor spustí a vrátí jeho id - o skutečném výsledku (dokončil se, nezvedl se, selhal) se dozvíš z webhooku v dalším kroku.
curl -X POST https://volai.cz/v1/calls \
-H "Authorization: Bearer vk_TVUJ_KLIC" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "agentId": "ag_kx91fa2b"}'4Nastav webhook, ať se ti workflow ozve zpátky
Přidej trigger Webhook (n8n ti vygeneruje URL) a tu samou adresu ulož přes PUT /v1/webhook spolu se seznamem událostí, které tě zajímají. Pozor: prázdné pole events neznamená žádnou událost, ale úplně všechny - radši je vždy vyjmenuj. Odpověď vrátí i secret - ulož si ho hned, GET /v1/webhook ho už nevrátí.
curl -X PUT https://volai.cz/v1/webhook \
-H "Authorization: Bearer vk_TVUJ_KLIC" \
-H "Content-Type: application/json" \
-d '{"url": "https://tvuj-n8n.app.n8n.cloud/webhook/volai", "events": ["call.completed", "message.sent"]}'5Ověř podpis a teprve pak zpracuj tělo
Každý požadavek nese hlavičku Volai-Signature ve tvaru t=<unix>,v1=<hex>. V uzlu Code spočítej HMAC-SHA256 nad {t}.{rawBody} se svým secret a porovnej s v1 - tělo zpracuj, teprve když se shodují. V uzlu Webhook zapni v sekci Add Options volbu Raw Body - bez ní n8n tělo rovnou rozparsuje a bajty, ze kterých se počítal podpis, se ztratí. Se zapnutou volbou ale dorazí jako binární data (vlastnost data), ne v json.body - kód níž proto tělo čte přes getBinaryDataBuffer, funguje to bez ohledu na to, jestli n8n binárky drží v paměti, nebo na disku či v S3. Vestavěný crypto jde v uzlu Code použít jen na self-hosted n8n s povoleným NODE_FUNCTION_ALLOW_BUILTIN=crypto - n8n Cloud import modulů nepodporuje vůbec, takže se tam ověření nevejde do jednoho uzlu. Na Cloudu proto řetěz prodluž o uzel Extract From File (operace Extract From Text File) - ten binárku nejdřív převede na text do zvoleného pole (třeba rawBody) - a teprve pak uzel Crypto (akce Hmac, typ SHA256, kódování HEX, hodnota výraz spojující razítko z hlavičky s polem rawBody, secret zadaný přes Crypto credential, ne obyčejné textové pole) spočítá otisk bez psaní kódu; porovnání s v1 pak dokončí uzel IF.
// Vstup z uzlu Webhook se zapnutou volbou Raw Body: header je hodnota
// "Volai-Signature", např. "t=1756111640,v1=8f2ac1d4..."; syrové tělo
// dorazí jako binární data (výchozí název vlastnosti "data"), ne v json.body.
const header = $input.first().json.headers['volai-signature'];
// getBinaryDataBuffer funguje ve všech režimech ukládání binárek n8n
// (výchozí v paměti i filesystem/S3) - přímé čtení
// $input.first().binary.data.data by fungovalo jen v paměťovém režimu.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');
// secret je hodnota z kroku 4 (PUT /v1/webhook) - v produkci ji čti
// z n8n credentialu nebo proměnné prostředí, nikdy nepiš natvrdo
const secret = 'whsec_nahrad_svym';
const crypto = require('crypto'); // jen self-hosted n8n, viz text kroku
const [tPart, v1Part] = header.split(',');
const t = tPart.replace('t=', '');
const v1 = v1Part.replace('v1=', '');
const expected = crypto
.createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
if (expected !== v1) {
throw new Error('Neplatný podpis Volai-Signature');
}Co s tím uděláš
Potvrzovací SMS po objednávce
E-shop nebo rezervační systém pošle do n8n webhook o nové objednávce - workflow rovnou odešle SMS s potvrzením a odhadovaným časem vyzvednutí.
Odchozí hovor z plánovače nebo tabulky
Řádek v Google Sheets, Airtable nebo CRM spustí uzel HTTP Request, který zavolá zákazníkovi přes tvého hlasového agenta - připomínka termínu, výzva k dokončení objednávky, krátký průzkum.
Zápis výsledku hovoru zpátky do systému
Webhook call.completed donese přepis, shrnutí a zapsané údaje z hovoru (data) - workflow je zapíše do CRM, tabulky nebo pošle na Slack, bez ručního poslechu nahrávky.
Časté otázky
- Existuje pro volai oficiální n8n uzel?
- Zatím ne - dnes stačí obecné uzly HTTP Request a Webhook, které n8n má vždy k dispozici. Ověřený komunitní uzel by musel projít review v n8n Creator Portal - zatím ho nepřipravujeme.
- Jak poznám, že webhook doopravdy poslal volai, a ne někdo cizí?
- Podle hlavičky
Volai-Signature- HMAC-SHA256 podpis sesecretem, který ti vrátí každéPUT /v1/webhook(ulož si ho hned,GETho už nevrátí). Podrobný vzorec i ukázka v Pythonu i TypeScriptu je na/docs/webhooky. - Co když HTTP Request selže na timeout a n8n ho zopakuje?
- Přidej hlavičku
Idempotency-Keys libovolnou stabilní hodnotou (třeba ID objednávky). Do 24 hodin dostaneš na opakovaný požadavek se stejným klíčem zpátky přesně tu samou odpověď - SMS ani hovor se neodešlou podruhé. - Kolik stojí automatizace navíc oproti ručnímu volání API?
- Nic - žádný příplatek za n8n. Platí stejné sazby jako v ceníku: SMS 1,36 Kč, odchozí hovor 0,92 Kč/min, hlasový agent navíc 2,50 Kč/min. Přesný ceník je na
/cenik.