Integratsiya qo'llanmasi
salerai har qanday tizimdan qo'ng'iroq yozuvini qabul qiladi, uni matnga aylantiradi, AI bilan baholaydi va natijani CRM'ga yoki sizning serveringizga qaytaradi. Quyida — ulanish usullari, kod namunalari va limitlar.
Qaysi usul sizga mos
Tayyor integratsiya
UTeL, Asterisk, Bitrix24, amoCRM, Zadarma, OnlinePBX. Login yoki ruxsat beriladi — qolganini salerai o'zi qiladi.
Asterisk / FreePBX agent
Serveringizdagi yozuvlar papkasini kuzatuvchi kichik dastur. Yangi yozuvni o'zi yuboradi.
Universal webhook
Tizimingiz qo'ng'iroq tugaganda bitta POST yuboradi. O'z JSON formatingizni moslash mumkin.
REST API
Qo'ng'iroq yuborish, fayl yuklash, natijani so'rash — har qanday tildan, oddiy HTTPS + JSON.
Natijani olish uchun ikki yo'l bor: webhook hodisalari (biz sizga yuboramiz) yoki CRM integratsiyasi — tahlil, audio va vazifa avtomatik ravishda mijozning lid yoki bitim kartasiga yoziladi.
API kalit
Dashboard → API va webhook → Kalit yaratish. Kalit faqat bir marta ko'rsatiladi. Har bir tizimga alohida kalit bering: sizib chiqsa, faqat o'shani bekor qilasiz.
| Huquq | Nima qila oladi | Kimga |
|---|---|---|
ingest (standart) | Qo'ng'iroq yuborish va o'sha qo'ng'iroq natijasini ko'rish | ATS, sayt, 1C — ko'pchilik uchun shu yetarli |
read | Qo'ng'iroqlar, lidlar, statistikani o'qish | Hisobot, BI tizimlari |
full | Admin bilan teng | Faqat ishonchli ichki tizimlar |
Har bir so'rovda: Authorization: Bearer cs_live_…
REST API: qo'ng'iroq yuborish
POST /api/v1/calls — bitta obyekt yoki massiv. Yozuv ochiq HTTPS havola orqali yuklab olinadi. Bir xil external_id qayta yuborilsa, takror tahlil qilinmaydi.
| Maydon | Majburiy | Izoh |
|---|---|---|
external_id | ha | Sizning tizimdagi qo'ng'iroq ID'si |
recording_url | ha | Yozuv havolasi (mp3, wav, ogg, m4a, flac, amr); faqat ommaviy internet manzil |
direction | in | out | unknown | |
started_at | ISO-8601, vaqt mintaqasi bilan | |
duration_sec | Suhbat davomiyligi; qisqa qo'ng'iroqlar (standart 20 s gacha) tahlil qilinmaydi | |
client_phone | Har qanday formatda — salerai +998… ko'rinishiga keltiradi | |
manager_id / manager_name | Operator: ID bo'yicha bitta menejerga bog'lanadi | |
crm_entity | {"type": "lead|deal|contact", "id": "…"} — natija shu kartaga yoziladi | |
metadata | Ixtiyoriy JSON, o'zgarishsiz saqlanadi |
curl -X POST https://api.salerai.org/api/v1/calls \
-H "Authorization: Bearer cs_live_..." \
-H "Content-Type: application/json" \
-d '{ "external_id": "pbx-8812", "recording_url": "https://pbx.example.uz/rec/8812.mp3", "direction": "in", "started_at": "2026-10-17T10:15:00+05:00", "duration_sec": 184, "client_phone": "+998901234567", "manager_id": "101", "manager_name": "Aziz Karimov", "crm_entity": { "type": "lead", "id": "1520" } }'Natija holatini so'rash (javobdagi ids bo'yicha):
curl https://api.salerai.org/api/v1/calls/<id> -H "Authorization: Bearer cs_live_..."Holatlar: received → downloading → transcribing → analyzing → done. skipped — qisqa, bo'sh yoki tarif limiti tugagan (error maydonida sabab); failed — xato.
Fayl yuklash
Yozuvni havola o'rniga faylning o'zi bilan yuborish: POST /api/v1/calls/upload, multipart. Fayl hajmi 100 MB gacha. Fayl turi tarkibidan aniqlanadi.
curl -X POST https://api.salerai.org/api/v1/calls/upload \
-H "Authorization: Bearer cs_live_..." \
-F "file=@8812.wav" \
-F "external_id=pbx-8812" \
-F "direction=in" \
-F "client_phone=+998901234567" \
-F "manager_name=Aziz Karimov"Universal webhook
Dashboard → Integratsiyalar → Universal webhook → Ulash. Sizga shaxsiy manzil va imzo kaliti beriladi. Tizimingiz qo'ng'iroq tugaganda shu manzilga REST API'dagi bilan bir xil JSON yuboradi (yoki {"calls": [...]}).
import hashlib, hmac, json, time, requests
secret = "whsec_..." # integratsiya ulanganda bir marta ko'rsatiladi
body = json.dumps({"external_id": "pbx-8812", "recording_url": "https://.../8812.mp3"}).encode()
t = int(time.time())
sig = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
requests.post(WEBHOOK_URL, data=body, headers={
"Content-Type": "application/json",
"X-CallSense-Signature": f"t={t},v1={sig}",
})O'z formatingiz (field_map)
Tizimingiz o'z JSON'ini o'zgartira olmasa, salerai maydonlarini nuqtali yo'l bilan moslang. Masalan, ATS shunday yuboradi: {"call": {"uuid": "…", "record": "https://…", "dir": "inbound"}}. Integratsiya sozlamasidagi field_map:
{
"external_id": "call.uuid",
"recording_url": "call.record",
"direction": "call.dir",
"client_phone": "call.phone",
"manager_name": "call.agent",
"duration_sec": "call.billsec",
"started_at": "call.start"
}direction uchun in/incoming/inbound va out/outgoing/outbound tushuniladi; started_at ISO yoki unix vaqt bo'lishi mumkin.
Natijani olish: webhook hodisalari
Dashboard → API va webhook → Endpoint qo'shish: manzilingiz va kerakli hodisalar. Har bir hodisa POST, JSON, 10 soniya ichida 2xx kutiladi.
| Hodisa | Qachon |
|---|---|
call.analyzed | Qo'ng'iroq tahlil qilindi: ball, xulosa, natija, keyingi qadam, e'tirozlar |
alert.created | Past ball, qo'pollik, shikoyat yoki raqobatchi aniqlandi |
call.missed | Javobsiz kiruvchi qo'ng'iroq (bulutli ATS) |
ai_call.finished | AI operator suhbati tugadi: natija, yig'ilgan ma'lumot, transkript |
lead.exported | Lid qo'lda yuborildi |
lead.handoff | Salerai CRM lidi sizning tizimingizga uzatildi; javobni data.status_url ga imzolab yuboring |
test.ping | Dashboard'dagi "Sinab ko'rish" tugmasi |
Sarlavhalar: X-CallSense-Event, X-CallSense-Delivery (takrorni aniqlash uchun ID), X-CallSense-Signature. call.analyzed namunasi:
{
"id": "6f1c…", // yetkazish ID (X-CallSense-Delivery bilan bir xil)
"event": "call.analyzed",
"created_at": "2026-10-17T10:19:02+00:00",
"org_id": "…",
"data": {
"call": {
"id": "…", "external_id": "pbx-8812", "direction": "in",
"started_at": "2026-10-17T05:15:00+00:00", "duration_sec": 184,
"client_phone": "+998901234567",
"crm_entity": { "type": "lead", "id": "1520" },
"manager": { "id": "…", "name": "Aziz Karimov" },
"url": "https://app.salerai.org/calls/…"
},
"analysis": {
"score": 82, "outcome": "meeting_scheduled", "sentiment_client": "positive",
"summary": "Mijoz 2 xonali kvartira narxini so'radi, shanba 11:00 ga uchrashuv belgilandi.",
"next_step": { "text": "Shanba 11:00 uchrashuv", "due_at": "2026-10-19T11:00:00+05:00", "owner": "manager" },
"objections": [{ "type": "price", "quote": "Qimmat ekan", "handled": true }],
"red_flags": [], "topics": ["narx", "bo'lib to'lash"],
"scorecard": [{ "id": "greeting", "title": "Salomlashish", "passed": true }],
"metrics": { "talk_ratio": 0.48, "silence_pct": 6, "interruptions": 1 }
}
}
}Imzoni tekshirish
X-CallSense-Signature: t=<unix>,v1=<HMAC-SHA256(secret, t + "." + body)>. Tanani JSON'ga aylantirishdan oldin, xom baytlar bilan tekshiring.
import crypto from "node:crypto";
// Express: app.post("/callsense", express.raw({ type: "application/json" }), handler)
function verify(rawBody, header, secret, toleranceSec = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const want = crypto.createHmac("sha256", secret).update(`${t}.`).update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(want), Buffer.from(parts.v1 ?? ""));
}Qayta yuborish
2xx olinmasa, yetkazish 6 marta urinib ko'riladi: 1 daqiqa, 5 daqiqa, 30 daqiqa, 2 soat va 6 soatdan keyin. Ketma-ket 20 marta muvaffaqiyatsiz bo'lgan endpoint o'chiriladi. Har bir yetkazishni dashboard'dagi jurnalda ko'rib, qo'lda qayta yuborish mumkin. Bitta hodisa ikki marta kelishi mumkin — X-CallSense-Delivery bo'yicha takrorni tashlang.
Xavfsizlik va limitlar
- Faqat HTTPS. Kalitni brauzer yoki mobil ilova kodiga qo'ymang — faqat serverda saqlang.
- So'rovlar: har kalit uchun daqiqasiga 300 ta, har webhook manzili uchun daqiqasiga 1200 ta.
- JSON tanasi 512 KB gacha, yuklanadigan fayl 100 MB gacha.
- Yozuv havolasi ommaviy internet manzil bo'lishi kerak: ichki tarmoq, localhost va bulut metadata manzillari rad etiladi.
- Tahlil tarifdagi daqiqalar doirasida; limit tugasa qo'ng'iroq
skippedbo'ladi va keyin qayta yuborilishi mumkin. - Karta raqamlari transkriptda saqlanmaydi; telefon va hujjat raqamlari AI'ga yashirilgan holda beriladi.
Xato kodlari
| Kod | Ma'nosi | Nima qilish kerak |
|---|---|---|
401 | Kalit yo'q yoki noto'g'ri | Authorization sarlavhasini tekshiring |
403 | Kalit huquqi yetmaydi | Kerakli huquqli kalit yarating (masalan, read) |
404 | Topilmadi (yoki boshqa tashkilotga tegishli) | ID'ni tekshiring |
409 | Holat ziddiyati (masalan, qo'ng'iroq hali ishlanmoqda) | Birozdan keyin qayta urinib ko'ring |
413 | Tana yoki fayl juda katta | Hajmni kamaytiring yoki havola yuboring |
422 | Maydon xato | Javobdagi detail'da qaysi maydon ekani yozilgan |
429 | Juda ko'p so'rov | Retry-After soniyasidan keyin qayta yuboring |
Savollar bo'yicha: dashboard'dagi qo'llab-quvvatlash yoki texnik hamkoringiz. Har javobdagi X-Request-ID ni yuborsangiz, muammo tezroq topiladi.