Для разработчиков: Sado AI API
Отправляйте лиды в Sado — агент позвонит. Итог (резюме, температура лида, следующий шаг) вернётся в вашу систему через webhook или ленту событий.
Полный справочник (OpenAPI 3.1): https://api.sadoai.uz/v1/openapi.json
Postman/Insomnia: Import → Link → вставьте этот адрес.
1. Получите ключ
Портал → Настройки → API-ключи. Ключ показывается один раз, у каждого ключа свои права (scopes): leads:write, leads:read, calls:read, calls:content (резюме и текст), catalog:write.
2. Отправьте лид
event_id — ваш идентификатор: повторная отправка не создаст второй лид. Основание для связи обязательно (требование закона).
curl -X POST https://api.sadoai.uz/v1/leads \
-H "Authorization: Bearer $SADO_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_id": "site-form-1042",
"phone": "+998901112233",
"name": "Aziz",
"purpose": "2 xonali kvartira",
"consent": { "basis": "inbound_enquiry", "evidence": "sayt formasi #1042", "captured_at": "2026-09-26T10:00:00+05:00" }
}'3. Получите итог — webhook
Портал → Интеграции → Добавить webhook. Каждый запрос подписан: X-Sado-Signature = HMAC-SHA256(секрет, «timestamp.тело»). Проверяйте подпись и отклоняйте запросы старше 5 минут. Если ответ не 2xx — до 8 повторов.
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody: string, headers: Record<string, string>, secret: string) {
const ts = headers["x-sado-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = "sha256=" + createHmac("sha256", secret).update(`${ts}.${rawBody}`).digest("hex");
const got = headers["x-sado-signature"] ?? "";
return got.length === expected.length && timingSafeEqual(Buffer.from(got), Buffer.from(expected));
}$ts = $_SERVER['HTTP_X_SADO_TIMESTAMP'];
$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $secret);
$ok = abs(time() - (int)$ts) <= 300 && hash_equals($expected, $_SERVER['HTTP_X_SADO_SIGNATURE'] ?? '');…или лента событий (для 1С и систем за NAT)
Если не можете принимать вебхуки — опрашивайте ленту: от старых к новым, хранится 30 дней. После обработки страницы сохраните next_cursor и передайте его как after.
curl "https://api.sadoai.uz/v1/events?types=call.analyzed,lead.created&after=$CURSOR" \
-H "Authorization: Bearer $SADO_KEY"
# → { "data": [ { "id": "evt_…", "type": "call.analyzed", "data": { "call": {…}, "analysis": {…} } } ], "next_cursor": "…" }4. Каталог: цены и остатки
Агент называет в разговоре только цены из каталога. До 1000 товаров за запрос; при полной синхронизации заранее запомните время начала и в конце вызовите retire — неотправленные товары снимаются с продажи. Без обновления 24 часа агент скажет, что цена могла измениться.
curl -X PUT https://api.sadoai.uz/v1/catalog/items \
-H "Authorization: Bearer $SADO_KEY" -H "Content-Type: application/json" \
-d '{ "source": "shop", "items": [ { "external_id": "NK-42", "name": "Krossovka Nike Air", "name_alt": "Кроссовки Найк", "price_uzs": 1250000, "stock": 3 } ] }'
curl -X POST https://api.sadoai.uz/v1/catalog/items/retire \
-H "Authorization: Bearer $SADO_KEY" -H "Content-Type: application/json" \
-d '{ "source": "shop", "before": "2026-09-26T10:00:00Z" }'Лимиты и ошибки
600 запросов в минуту на ключ (при превышении 429 и Retry-After). Ошибки в JSON: {error, issues}. Списки — от новых к старым, с курсором.
Исходный код расширения для 1С и инструкцию по установке выдаст ваш менеджер · Вопросы — вашему менеджеру или команде Sado в Telegram.
