Для разработчиков: 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.