Přeskočit na obsah
REST API

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 tobody. 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ů.

bash
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/callstoagentId 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.

bash
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í.

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

javascript
// 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 se secretem, který ti vrátí každé PUT /v1/webhook (ulož si ho hned, GET ho 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-Key s 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.

Vyzkoušej to hned

Zaregistruj se a prvních 50 Kč je na nás.