Salerai Android ilovasi

Oddiy SIM-karta qo'ng'iroqlari ham tahlilga tushadi.

  • Menejer odatdagidek o'z telefonidan gaplashadi
  • Ilova telefon yozib olgan suhbatni salerai'ga yuboradi
  • AI tahlil qiladi, natija kabinet va CRM'ga tushadi
Xavfsizmi?

Ha. Ilova faqat qo'ng'iroqlar ro'yxati va qo'ng'iroq yozuvlarini o'qiydi. SMS, kontaktlar, rasmlar, mikrofon va joylashuvga tegmaydi. Google Play'dan emas, to'g'ridan-to'g'ri bizdan yuklangani uchun telefon «noma'lum manba» deb so'raydi — bu odatiy holat.

O'rnatish — 3 qadam
  1. Rahbar kabinetda telefon qo'shadi va QR kod oladi
  2. Menejer QR'ni telefon kamerasi bilan skanerlaydi
  3. «APK yuklab olish» → o'rnatish → «Ilovada ochish»
Bepul boshlash

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.

Kod yozish shart emas. Dashboard → Integratsiyalar

Asterisk / FreePBX agent

Serveringizdagi yozuvlar papkasini kuzatuvchi kichik dastur. Yangi yozuvni o'zi yuboradi.

O'z ATS'i bor kompaniyalar

Universal webhook

Tizimingiz qo'ng'iroq tugaganda bitta POST yuboradi. O'z JSON formatingizni moslash mumkin.

Boshqa ATS'lar, call-markazlar, o'z CRM'i

REST API

Qo'ng'iroq yuborish, fayl yuklash, natijani so'rash — har qanday tildan, oddiy HTTPS + JSON.

Dasturchilar, 1C, sayt, mobil ilova

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.

HuquqNima qila oladiKimga
ingest (standart)Qo'ng'iroq yuborish va o'sha qo'ng'iroq natijasini ko'rishATS, sayt, 1C — ko'pchilik uchun shu yetarli
readQo'ng'iroqlar, lidlar, statistikani o'qishHisobot, BI tizimlari
fullAdmin bilan tengFaqat 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.

MaydonMajburiyIzoh
external_idhaSizning tizimdagi qo'ng'iroq ID'si
recording_urlhaYozuv havolasi (mp3, wav, ogg, m4a, flac, amr); faqat ommaviy internet manzil
directionin | out | unknown
started_atISO-8601, vaqt mintaqasi bilan
duration_secSuhbat davomiyligi; qisqa qo'ng'iroqlar (standart 20 s gacha) tahlil qilinmaydi
client_phoneHar qanday formatda — salerai +998… ko'rinishiga keltiradi
manager_id / manager_nameOperator: ID bo'yicha bitta menejerga bog'lanadi
crm_entity{"type": "lead|deal|contact", "id": "…"} — natija shu kartaga yoziladi
metadataIxtiyoriy 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": [...]}).

Manzildagi maxfiy token va imzo kaliti — ikkalasi ham parol kabi. Imzo yuborilsa, salerai uni tekshiradi; vaqt belgisi 5 daqiqadan eski so'rov rad etiladi (qayta yuborish hujumidan himoya).
Imzolab yuborish
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.

HodisaQachon
call.analyzedQo'ng'iroq tahlil qilindi: ball, xulosa, natija, keyingi qadam, e'tirozlar
alert.createdPast ball, qo'pollik, shikoyat yoki raqobatchi aniqlandi
call.missedJavobsiz kiruvchi qo'ng'iroq (bulutli ATS)
ai_call.finishedAI operator suhbati tugadi: natija, yig'ilgan ma'lumot, transkript
lead.exportedLid qo'lda yuborildi
lead.handoffSalerai CRM lidi sizning tizimingizga uzatildi; javobni data.status_url ga imzolab yuboring
test.pingDashboard'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 skipped bo'ladi va keyin qayta yuborilishi mumkin.
  • Karta raqamlari transkriptda saqlanmaydi; telefon va hujjat raqamlari AI'ga yashirilgan holda beriladi.

Xato kodlari

KodMa'nosiNima qilish kerak
401Kalit yo'q yoki noto'g'riAuthorization sarlavhasini tekshiring
403Kalit huquqi yetmaydiKerakli huquqli kalit yarating (masalan, read)
404Topilmadi (yoki boshqa tashkilotga tegishli)ID'ni tekshiring
409Holat ziddiyati (masalan, qo'ng'iroq hali ishlanmoqda)Birozdan keyin qayta urinib ko'ring
413Tana yoki fayl juda kattaHajmni kamaytiring yoki havola yuboring
422Maydon xatoJavobdagi detail'da qaysi maydon ekani yozilgan
429Juda ko'p so'rovRetry-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.