Skip to content

Webhook integratsiyasi

Webhook integratsiyasi orqali Utel tizimidan tashqi ilovalaringizga real-time qo'ng'iroq hodisalari yuboriladi. Har qanday HTTP(S) endpoint qabul qiluvchi server yoki xizmat ulana oladi.

Webhook sozlash

Webhook URL va hodisalarni qo'shish/o'chirish uchun Webhook moduli bo'limiga qarang.

Qanday ishlaydi?

  1. Siz tizimda webhook URL va kerakli hodisalarni sozlaysiz
  2. Qo'ng'iroq hodisasi yuz berganda Utel server sizning URL ingizga POST so'rov yuboradi
  3. Serveringiz 2xx javob qaytaradi — muvaffaqiyatli qabul qilindi

Barcha so'rovlar POST metodi orqali va Content-Type: application/json header bilan JSON formatida yuboriladi.


Payload tuzilishi

Har bir webhook so'rovining asosiy tuzilishi quyidagicha:

json
{
  "time": "12:00:00",
  "data": { /* hodisa ma'lumotlari */ }
}
MaydonTurIzoh
timestring (HH:mm:ss)Server vaqti
dataobjectHodisa ma'lumotlari
data.namestringHodisa nomi (call_started, call_ended, ...)
data.domainstringUtel server URL manzili

data.call obyekti

Ko'pgina hodisalarda data.call maydoni bo'lib, joriy qo'ng'iroq haqida ma'lumot saqlaydi:

MaydonTurIzoh
idstring (UUID)Qo'ng'iroq unikal ID si
srcstringQo'ng'iroq qiluvchi raqam
extenstringDastlab terilgan modul
callerChannelIdstringAsterisk kanal ID si
connectedbooleanSuhbat boshlangani
transferredbooleanQo'ng'iroq o'tkazilgani
cdr.typestringincoming, outgoing, internal
cdr.srcstringChaqiruvchi raqam
cdr.callerstringChaqiruvchi raqam
cdr.dststringQabul qiluvchi modul
cdr.external_numberstring | nullTashqi raqam
cdr.started_atintegerBoshlangan vaqt (Unix timestamp)
cdr.ended_atinteger | nullTugagan vaqt (Unix timestamp)
cdr.conversationintegerSuhbat vaqti (soniya)
cdr.record_filenamestring | nullYozuv fayl yo'li

channel / callerChannel / destChannel obyektlari

Asterisk ARI dan keluvchi kanal ma'lumotlari:

MaydonTurIzoh
idstringAsterisk kanal ID si
namestringKanal nomi (PJSIP/101-00000001)
statestringKanal holati (Ring, Up, Down, ...)
caller.numberstringChaqiruvchining raqami
caller.namestringChaqiruvchining ismi
dialplan.extenstringTerilgan modul
creationtimestringKanal yaratilgan vaqt (ISO 8601)

Hodisalar (Events)

call_started — Qo'ng'iroq boshlandi

Kiruvchi yoki chiquvchi qo'ng'iroq tizimga kelib tushganda yuboriladi.

Mavjud maydonlar: name, domain, call, channel

json
{
  "time": "12:00:00",
  "data": {
    "name": "call_started",
    "domain": "https://api.cc999.utel.uz",
    "call": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567",
      "exten": "5400",
      "callerChannelId": "1736762400.12",
      "connected": false,
      "transferred": false,
      "bridgeId": null,
      "connectedChannelId": null,
      "cdr": {
        "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
        "src": "998901234567",
        "caller": "998901234567",
        "dst": "5400",
        "external_number": "998901234567",
        "started_at": 1736762400,
        "ended_at": null,
        "conversation": 0,
        "record_filename": "2026/01/13/1736762400.12.wav",
        "type": "incoming"
      }
    },
    "channel": {
      "id": "1736762400.12",
      "name": "PJSIP/trunk-00000001",
      "state": "Ring",
      "caller": { "name": "", "number": "998901234567" },
      "dialplan": { "context": "from-external", "exten": "5400", "priority": 1 },
      "creationtime": "2026-01-13T12:00:00.000+0500"
    }
  }
}

dial_started — Telefon chalina boshladi

Foydalanuvchi telefonida qo'ng'iroq signali chalina boshlaganda yuboriladi.

Mavjud maydonlar: name, domain, call, callerChannel, destChannel

json
{
  "time": "12:00:02",
  "data": {
    "name": "dial_started",
    "domain": "https://api.cc999.utel.uz",
    "call": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567",
      "exten": "5400",
      "cdr": { "type": "incoming", "dst": "5400", "external_number": "998901234567" }
    },
    "callerChannel": {
      "id": "1736762400.12",
      "caller": { "number": "998901234567" },
      "state": "Ring"
    },
    "destChannel": {
      "id": "1736762400.13",
      "caller": { "number": "101" },
      "state": "Ring"
    }
  }
}

dial_answered — Telefon ko'tarildi

Foydalanuvchi qo'ng'iroqqa javob berganda yuboriladi.

Mavjud maydonlar: name, domain, call, callerChannel, destChannel

json
{
  "time": "12:00:10",
  "data": {
    "name": "dial_answered",
    "domain": "https://api.cc999.utel.uz",
    "call": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567",
      "connected": true,
      "cdr": { "type": "incoming", "last_answered": "101" }
    },
    "callerChannel": {
      "id": "1736762400.12",
      "caller": { "number": "998901234567" },
      "state": "Up"
    },
    "destChannel": {
      "id": "1736762400.13",
      "caller": { "number": "101" },
      "state": "Up"
    }
  }
}

dial_ended — Bir dial bosqichi tugadi

Bitta dial bosqichi tugaganda yuboriladi (foydalanuvchi javob bermadi, yoki suhbat yakunlandi).

Mavjud maydonlar: name, domain, call, callerChannel, destChannel

Tuzilishi dial_started bilan bir xil.


call_transferred — Qo'ng'iroq o'tkazildi

Qo'ng'iroq boshqa modulga o'tkazilganda yuboriladi. Ikki xil transfer bo'lishi mumkin:

Blind transfer (call_blind_transferred)

Operator bevosita qo'ng'iroqni o'tkazadi (oldindan gaplashmasdan).

Mavjud maydonlar: name, domain, call, channel, transferee, to

json
{
  "time": "12:01:00",
  "data": {
    "name": "call_blind_transferred",
    "domain": "https://api.cc999.utel.uz",
    "call": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567",
      "cdr": { "type": "incoming" }
    },
    "channel": {
      "id": "1736762400.12",
      "caller": { "number": "998901234567" },
      "state": "Up"
    },
    "transferee": {
      "id": "1736762400.13",
      "caller": { "number": "101" },
      "state": "Up"
    },
    "to": "102"
  }
}

Attended transfer (call_attended_transferred)

Operator avval yangi raqamga qo'ng'iroq qilib, keyin o'tkazadi.

Mavjud maydonlar: name, domain, call_first, call_second, channel, transferee, second_channel, target

json
{
  "time": "12:01:30",
  "data": {
    "name": "call_attended_transferred",
    "domain": "https://api.cc999.utel.uz",
    "call_first": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567"
    },
    "call_second": {
      "id": "7d14a02b-b1c3-4f56-83d2-1234567890ab",
      "src": "101"
    },
    "channel": { "id": "1736762400.12", "caller": { "number": "998901234567" } },
    "transferee": { "id": "1736762400.13", "caller": { "number": "101" } },
    "second_channel": { "id": "1736762400.14", "caller": { "number": "101" } },
    "target": { "id": "1736762400.15", "caller": { "number": "102" } }
  }
}

call_ended — Qo'ng'iroq tugadi

Qo'ng'iroq to'liq yakunlanganda yuboriladi.

Mavjud maydonlar: name, domain, call

json
{
  "time": "12:02:05",
  "data": {
    "name": "call_ended",
    "domain": "https://api.cc999.utel.uz",
    "call": {
      "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "src": "998901234567",
      "exten": "5400",
      "connected": false,
      "cdr": {
        "id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
        "src": "998901234567",
        "caller": "998901234567",
        "dst": "5400",
        "external_number": "998901234567",
        "started_at": 1736762400,
        "ended_at": 1736762525,
        "conversation": 95,
        "record_filename": "2026/01/13/1736762400.12.wav",
        "type": "incoming"
      }
    }
  }
}

call_saved — Qo'ng'iroq yozuvi saqlandi

Qo'ng'iroq ma'lumotlari bazaga saqlanganda yuboriladi. call_ended dan keyin bir necha millisekund o'tib yuboriladi.

Mavjud maydonlar: name, domain, call_history

call_history maydoni to'liq CallHistoryIndexResource sifatida keladi.

json
{
  "time": "12:02:06",
  "data": {
    "name": "call_saved",
    "domain": "https://api.cc999.utel.uz",
    "call_history": {
      "id": 748,
      "call_id": "9b03293e-a0ea-4212-92d1-5848a41d4987",
      "date_time": "2026-01-13 12:00:00",
      "src": "998901234567",
      "dst": "5400",
      "external_number": "998901234567",
      "duration": 125,
      "conversation": 95,
      "type": { "number": 1, "name": "Incoming" },
      "status": { "number": 1, "name": "Answered" },
      "recorded_file_url": "https://api.cc999.utel.uz/storage/monitor/2026/01/13/1736762400.12.wav",
      "integration": []
    }
  }
}

Hodisalar tartibi

Oddiy kiruvchi qo'ng'iroqda hodisalar quyidagi tartibda keladi:

call_started
  → dial_started   (telefon chala boshlandi)
  → dial_answered  (telefon ko'tarildi)
  → dial_ended     (suhbat yakunlandi)
call_ended
call_saved

Texnik talablar

Server talablari

  • Server HTTPS bilan ishlashi tavsiya etiladi
  • Server 10 soniya ichida 2xx javob qaytarishi kerak
  • Content-Type: application/json va User-Agent: UtelHttpAgent/1.0 header bilan yuboriladi

Xavfsizlik

Tavsiya

Webhook so'rovlarning haqiqiyligini tekshirish uchun:

  • Url maniliga parametrli maxsus token qo'shing va backend tomonda uni tekshiring
  • data.domain orqali manba tekshiring
  • ip manzil orqali manba tekshiring