Сервер Gratio снимает трубку сам: говорит приветствие, пишет голос собеседника и открывает живой звук для приложения. Вызывайте, пока звонок звонит, — после уведомления incomingCall и outgoingCall со status: "offer".
| Запрос | POST /waInstance{idInstance}/answerCall/{apiTokenInstance} |
| Тело | JSON |
| Каналы | MAX, WhatsApp — если в getCapabilities call_audio: true |
Параметры
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
callId |
string | да | id звонка — idMessage из incomingCall со status: "offer" |
playUrl |
string | нет | что сказать сразу после соединения: ссылка на звуковой файл — wav, mp3, ogg и другие. Своя из uploadFile или внешняя |
record |
boolean | нет | записать голос собеседника, по умолчанию true |
maxDurationSeconds |
number | нет | предел разговора: 1–3600 секунд, по умолчанию 600. Дольше — сервер кладёт трубку |
Пример запроса
Ответить, сказать приветствие и записать разговор не дольше 10 минут:
curl
curl -X POST "$GRATIO_URL/waInstance$GRATIO_ID/answerCall/$GRATIO_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"callId": "31A9ADA2-3889-4B2B-9D88-6A7142875D7F",
"playUrl": "https://example.ru/audio/hello.mp3",
"record": true,
"maxDurationSeconds": 600
}'
Python
import os
import requests
BASE = f"{os.environ['GRATIO_URL']}/waInstance{os.environ['GRATIO_ID']}"
TOKEN = os.environ["GRATIO_TOKEN"]
url = f"{BASE}/answerCall/{TOKEN}"
payload = {
"callId": "31A9ADA2-3889-4B2B-9D88-6A7142875D7F",
"playUrl": "https://example.ru/audio/hello.mp3",
"record": True,
"maxDurationSeconds": 600,
}
response = requests.post(url, json=payload, timeout=60)
print(response.status_code, response.json())
Node.js
const { GRATIO_URL, GRATIO_ID, GRATIO_TOKEN } = process.env;
const base = `${GRATIO_URL}/waInstance${GRATIO_ID}`;
const url = `${base}/answerCall/${GRATIO_TOKEN}`;
const payload = {
callId: "31A9ADA2-3889-4B2B-9D88-6A7142875D7F",
playUrl: "https://example.ru/audio/hello.mp3",
record: true,
maxDurationSeconds: 600,
};
const response = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
console.log(response.status, await response.json());
PHP
<?php
$base = getenv('GRATIO_URL') . '/waInstance' . getenv('GRATIO_ID');
$url = $base . '/answerCall/' . getenv('GRATIO_TOKEN');
$payload = [
'callId' => '31A9ADA2-3889-4B2B-9D88-6A7142875D7F',
'playUrl' => 'https://example.ru/audio/hello.mp3',
'record' => true,
'maxDurationSeconds' => 600,
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = json_decode(curl_exec($ch), true);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), PHP_EOL;
print_r($response);
Пример ответа
Ответ 200 OK — объект звонка:
{
"callId": "31A9ADA2-3889-4B2B-9D88-6A7142875D7F",
"chatId": "8695836",
"direction": "in",
"state": "connecting",
"answered": false,
"endReason": null,
"endedBy": null,
"talkSeconds": 0.0
}
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
callId |
string | id звонка — для playAudio, callAudio, hangUpCall, getCall |
chatId |
string | кто звонит |
state |
string | обычно connecting: сервер соединяется. Звук пошёл — active в callStateChanged |
answered |
boolean | true, когда пошёл звук |
Все поля и причины конца — в статье Звонки: как это работает.
Что происходит после ответа
Собеседник Gratio Приложение
│ │◄────────────────── answerCall ─│
│ │── {"state": "connecting"} ────►│
│◄═══ приветствие ═════│── callStateChanged: active ───►│
│◄═══ голос ══════════►│◄═══ callAudio, playAudio ═════►│
│── кладёт трубку ────►│── callStateChanged: ended ────►│
- Приветствие из
playUrlзвучит с начала разговора. Следующие фразы — playAudio или живой звук callAudio. - В
ended— причина конца и, если писали, ссылка на запись.
Ошибки
| Код | code |
Когда | Что делать |
|---|---|---|---|
400 |
validation |
нет callId; maxDurationSeconds вне 1–3600 |
исправить запрос |
400 |
call_not_found |
звонок уже закончился или на него ответили | — |
400 |
call_not_ringing |
WhatsApp: звонок уже не звонит | — |
400 |
bad_audio |
MAX: файл из playUrl не разобран как звук |
сменить файл |
400 |
audio_format |
WhatsApp: файл из playUrl не разобран как звук |
сменить файл |
400 |
bad_url, url_unavailable |
playUrl не http(s), ведёт во внутреннюю сеть или недоступна |
проверить ссылку |
400 |
call_failed |
WhatsApp не принял ответ | — |
400 |
not_authorized |
канал не на связи | проверить getStateInstance |
402 |
payment_required |
канал на паузе за неоплату | продлить канал в кабинете |
409 |
busy |
MAX: на канале уже идёт разговор через API | дождаться конца разговора |
501 |
not_supported |
у канала нет звука звонков: Telegram или call_audio: false |
— |
Особенности каналов
- MAX. Ответить можно, пока звонит, — до 90 секунд после
offer. Через API на канале идёт один разговор: второй входящий звонит на телефонах как обычно. - WhatsApp. Ответил Gratio — телефон сотрудника перестаёт звонить. Ответили на телефоне — звонок уходит с канала.
callId— строка видаcall-…. - Telegram. Только события звонков —
501. - Звонок через API — только голосовой: видео сервер не передаёт.
Что дальше
- callAudio — слушать собеседника и отвечать в реальном времени.
- playAudio — сказать звуковым файлом.
- callStateChanged — ход звонка.
- hangUpCall — положить трубку.
