SMS и обаждания директно от работния процес в n8n
n8n извиква REST API на volai през възела HTTP Request - без писане на код можете да изпратите SMS, да стартирате обаждане чрез гласов агент и да получите резултата обратно като webhook.
1Запазете ключа като credential
В n8n създайте нов credential от тип HTTP Header Auth: име на header Authorization, стойност Bearer vk_VASHIYAT_KLYUCH (ключа ще намерите в портала, в раздел AI асистент). Прикачете го към всеки възел HTTP Request, който извиква volai.cz/v1/* - един и същ ключ важи за SMS, обаждания и webhook.
2Изпратете SMS от работния процес
Добавете възел HTTP Request: метод POST, URL https://volai.cz/v1/messages, JSON тяло с полетата to и body. Отговорът съдържа priceHal (цената в хелери, 1/100 CZK, за всички сегменти на съобщението) и segments - текст с не-ASCII знаци, например кирилица, заема повече сегменти от чисто ASCII съобщение. Примерът по-долу нарочно е написан с латински букви, за да се побере в един сегмент - с кирилица работи по същия начин, само че се използват повече сегменти.
curl -X POST https://volai.cz/v1/messages \
-H "Authorization: Bearer vk_VASHIYAT_KLYUCH" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "body": "Poruchkata vi e gotova za vzimane."}'3Обадете се на клиент чрез своя агент
Втори възел HTTP Request: POST https://volai.cz/v1/calls с to и agentId на съществуващ гласов агент (създава се в портала или чрез POST /v1/agents) - агентът трябва да има присвоен телефонен номер, иначе заявката завършва с грешка agent_no_number. Заявката само стартира обаждането и връща неговия id - действителния резултат (проведено, без отговор, неуспешно) ще научите от webhook-а в следващата стъпка.
curl -X POST https://volai.cz/v1/calls \
-H "Authorization: Bearer vk_VASHIYAT_KLYUCH" \
-H "Content-Type: application/json" \
-d '{"to": "+420777123456", "agentId": "ag_kx91fa2b"}'4Настройте webhook, за да получава работният процес отговор
Добавете тригер Webhook (n8n генерира URL вместо вас) и запишете същия адрес чрез PUT /v1/webhook заедно със списъка със събития, които ви интересуват. Внимание: празен масив events не означава никакви събития, а всички - затова винаги ги изброявайте. Отговорът връща и secret - запазете го веднага, GET /v1/webhook вече няма да го върне.
curl -X PUT https://volai.cz/v1/webhook \
-H "Authorization: Bearer vk_VASHIYAT_KLYUCH" \
-H "Content-Type: application/json" \
-d '{"url": "https://vashiyat-n8n.app.n8n.cloud/webhook/volai", "events": ["call.completed", "message.sent"]}'5Проверете подписа и чак тогава обработете тялото
Всяка заявка носи header Volai-Signature във вида t=<unix>,v1=<hex>. Във възел Code изчислете HMAC-SHA256 върху {t}.{rawBody} с вашия secret и сравнете с v1 - обработвайте тялото едва когато съвпадат. Във възела Webhook включете в Add Options опцията Raw Body - без нея n8n парсира тялото вместо вас и байтовете, върху които е изчислен подписът, се губят. С включена опция тялото пристига като двоични данни (свойство data), а не в json.body - затова кодът по-долу го чете през getBinaryDataBuffer, което работи независимо дали n8n държи двоичните данни в паметта, на диска или в S3. Вграденият crypto може да се използва във възела Code само в self-hosted n8n с разрешен NODE_FUNCTION_ALLOW_BUILTIN=crypto - n8n Cloud изобщо не поддържа импортиране на модули, така че проверката там не се събира в един възел. В Cloud удължете веригата с възел Extract From File (операция Extract From Text File) - той превръща двоичните данни в текст в избрано от вас поле (например rawBody) - и едва след това възел Crypto (действие Hmac, тип SHA256, кодиране HEX, стойност - израз, който съединява времевия печат от header с полето rawBody, а secret се въвежда чрез Crypto credential, не в обикновено текстово поле) изчислява отпечатъка без писане на код; сравнението с v1 довършва възел IF.
// Вход от възела Webhook с включена опция Raw Body: header е стойността на
// "Volai-Signature", напр. "t=1756111640,v1=8f2ac1d4..."; суровото тяло
// пристига като двоични данни (име на свойството по подразбиране "data"), не в json.body.
const header = $input.first().json.headers['volai-signature'];
// getBinaryDataBuffer работи във всички режими на съхранение на двоични данни в n8n
// (по подразбиране в паметта, както и filesystem/S3) - директното четене на
// $input.first().binary.data.data би работило само в режим на паметта.
const rawBody = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');
// secret е стойността от стъпка 4 (PUT /v1/webhook) - в продукция я четете
// от credential на n8n или от променлива на средата, никога не я пишете директно
const secret = 'whsec_zamenete_sas_vashiya';
const crypto = require('crypto'); // само self-hosted n8n, вижте текста на стъпката
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('Невалиден подпис Volai-Signature');
}Какво ще постигнете
Потвърждение по SMS след поръчка
Вашият онлайн магазин или система за резервации изпраща webhook към n8n при нова поръчка - работният процес веднага изпраща SMS с потвърждение и очаквано време за вземане.
Изходящи обаждания от планировчик или таблица
Ред в Google Sheets, Airtable или CRM стартира възел HTTP Request, който се обажда на клиента чрез вашия гласов агент - напомняне за час, подсещане за недовършена поръчка, кратко проучване.
Записване на резултата от обаждането обратно във вашата система
Webhook-ът call.completed носи преписа, резюмето и всички данни, събрани от агента (data) - работният процес ги записва в CRM, таблица или Slack, без да се налага някой да слуша записа ръчно.
Често задавани въпроси
- Има ли официален възел на n8n за volai?
- Още не - днес са достатъчни универсалните възли HTTP Request и Webhook, които n8n винаги има вградени. Проверен общностен възел би трябвало да мине ревю в n8n Creator Portal - засега не подготвяме такъв.
- Как да разбера, че webhook-ът наистина е изпратен от volai, а не от някой друг?
- По header
Volai-Signature- подпис HMAC-SHA256 съсsecret, който се връща при всяко извикване наPUT /v1/webhook(запазете го веднага,GETвече няма да го върне). Пълната формула с примери на Python и TypeScript е на/docs/webhooky. - Какво става, ако HTTP Request изтече по време и n8n го повтори?
- Добавете header
Idempotency-Keyс произволна стабилна стойност, например номера на поръчката. В рамките на 24 часа на повторена заявка със същия ключ получавате точно същия отговор - SMS-ът или обаждането не се изпращат втори път. - Струва ли допълнително автоматизацията през n8n?
- Не - няма такса за използването на n8n. Важат същите цени като в ценоразписа: SMS 1,36 kr (≈ 0,06 EUR), изходящо обаждане 0,92 kr/min (≈ 0,04 EUR), гласов агент допълнително 2,50 kr/min (≈ 0,10 EUR). Пълните цени са на
/cenik.
Опитайте веднага
Регистрирайте се и първите 50 kr са от нас.