Oʻz PBXingizning API va MCP
Cenaly PBXingiz dasturlaringiz va AI yordamchilaringiz uchun ochiq:
- CRM, hisob tizimi, oʻz saytingiz — REST API: qoʻngʻiroqlar jurnali, yozib olishlar va transkripsiyalar, bir bosishda qoʻngʻiroq, qoʻshimcha raqamlar, yoʻnaltirish, qoʻngʻiroq qoidalari;
- Claude Code, Claude Desktop, Cursor — kalit orqali masofaviy MCP server;
- ChatGPT, claude.ai, Perplexity, Cursor va VS Code — oʻsha MCP server kalitsiz: siz hisobingizga kirasiz va ruxsat berasiz (OAuth).
Hammasi hisob egasi nomidan va faqat u bergan huquqlar doirasida ishlaydi. Har bir oʻzgarish PBX harakatlar jurnalida kalit yoki ilova nomi bilan koʻrinadi.
Manzillar#
| Nima | Manzil |
|---|---|
| REST API | https://api.cenaly.com/pbx-api/v1 |
| MCP server (streamable HTTP) | https://api.cenaly.com/pbx-api/mcp |
| Metodlar boʻyicha hujjatlar | api.cenaly.com/pbx-api/v1/docs |
| OpenAPI 3.1 tavsifi | api.cenaly.com/pbx-api/v1/openapi.json |
| OAuth metamaʼlumotlari | https://api.cenaly.com/.well-known/oauth-authorization-server/pbx-api |
Kalit va huquqlar#
Kalitni faqat hisob egasi yaratadi: Telefoniya → API va MCP → Kalitlar → Kalit yaratish. «PBX administratori» rolidagi xodim kalitlarni koʻrmaydi — kalit hisob egasi nomidan ishlaydi.
cpx_…koʻrinishidagi kalit bir marta koʻrsatiladi — yaratilgandan soʻng darhol, ulanish uchun tayyor qoʻyilmalar bilan birga. Bizda faqat uning barmoq izi (SHA-256) saqlanadi, kalitni tiklash mumkin emas — faqat yangisini chiqarish mumkin.- Kalitni filiallar bilan (aks holda — barcha filiallar, jumladan kelgusi filiallar ham) va muddat bilan (30, 90, 365 kun yoki muddatsiz) cheklash mumkin.
- «Huquqlar» kalitning huquqlari va filiallarini darhol oʻzgartiradi: integratsiya ishlashda davom etadi, yangi huquqlar keyingi soʻrovdan boshlab amal qiladi.
- «Bekor qilish» — darhol va butunlay: bu kalit bilan keyingi soʻrov 401 oladi.
- Tirik kalitlar va ulanishlar — hisob uchun 20 tagacha.
Huquqlar tayyor toʻplam yoki belgilash orqali tanlanadi:
| Huquq | Nima beradi | Toʻplamlar |
|---|---|---|
calls:read |
qoʻngʻiroqlar jurnali va marshrutli qoʻngʻiroq kartasi | CRM, AI yordamchisi, faqat oʻqish, hammasi |
recordings:read |
suhbat yozib olishiga havola (10 daqiqa) va transkripsiya | CRM, AI yordamchisi, faqat oʻqish, hammasi |
calls:dial |
bir bosishda qoʻngʻiroq: avval xodimning telefoni jiringlaydi, javobdan soʻng PBX raqamni teradi | CRM, AI yordamchisi, hammasi |
extensions:read |
qoʻshimcha raqamlar, guruhlar, yoʻnaltirish, «bezovta qilmang» | CRM, AI yordamchisi, faqat oʻqish, hammasi |
extensions:write |
shaxsiy yoʻnaltirish va «bezovta qilmang»ni oʻzgartirish | AI yordamchisi, hammasi |
presence:read |
kim boʻsh, kim jiringlayapti, kim gaplashyapti | AI yordamchisi, faqat oʻqish, hammasi |
reports:read |
davr uchun call-markaz koʻrsatkichlari: xizmat koʻrsatish darajasi, kutish, tashlab ketilganlar, AHT, FCR, CSAT, qayerda qoʻngʻiroqlarni yoʻqotamiz, navbatlar, liniyalar, xodimlar boʻyicha kesimlar | faqat oʻqish, hammasi |
routes:read |
raqamlar, kiruvchi va chiquvchi qoidalari, qoidalar tarixi | faqat oʻqish, hammasi |
routes:write |
qoʻngʻiroq qoidalarini yaratish, oʻzgartirish, oʻchirish va qayta tartiblash, tarixdan qaytarish | faqat alohida belgilash orqali |
config:export |
PBX sozlamalarini fayl formatida chiqarish | faqat alohida belgilash orqali |
config:import |
sozlamalarni jadvallardan yuklash: oldindan koʻrish, soʻngra qoʻllash | faqat alohida belgilash orqali |
webhooks:write |
qoʻngʻiroq hodisalari webhooklarini yaratish, oʻzgartirish, tekshirish va oʻchirish | faqat alohida belgilash orqali |
daynight:write |
filialni kun oxirigacha yoki sanagacha yopish, ochish — telefondagi *28 bilan bir xil |
faqat alohida belgilash orqali |
Biror narsani oʻzgartiradigan yoki daqiqalarni sarflaydigan huquqlar oynada sargʻish rang bilan belgilangan. Oxirgi uchta huquq hech bir toʻplamga, hatto «Hammasi»ga ham kirmaydi — ularni faqat ongli ravishda, alohida belgilash orqali berish mumkin.
ChatGPT, claude.ai, Perplexity, Cursor, VS Code: kalitsiz ulanish#
Bulutli yordamchilar kalitni sarlavhaga qoʻya olmaydi — ular MCP serverni OAuth orqali ulanadi. Kalit yaratish shart emas.
claude.ai: Sozlamalar → Konnektorlar → Oʻz konnektoringizni qoʻshish → https://api.cenaly.com/pbx-api/mcp manzilini qoʻying → Ulanish.
ChatGPT: Sozlamalar → Ilovalar va konnektorlar → Qoʻshimcha → ishlab chiquvchi rejimini yoqing → Yaratish → https://api.cenaly.com/pbx-api/mcp manzilini qoʻying, autentifikatsiya — OAuth.
Perplexity: Hisob sozlamalari → Konnektorlar → «+ Oʻz konnektori» → Masofaviy → https://api.cenaly.com/pbx-api/mcp manzilini qoʻying, autentifikatsiya — OAuth.
Cursor va VS Code: https://api.cenaly.com/pbx-api/mcp manzilli masofaviy (HTTP) MCP serverni kalitli sarlavhasiz qoʻshing — kirish oynasi brauzerda ochiladi. Cursor’da: .cursor/mcp.json → {"mcpServers": {"cenaly-pbx": {"url": "https://api.cenaly.com/pbx-api/mcp"}}}; VS Code’da: «MCP: Add Server» buyrugʻi → HTTP.
Soʻngra yordamchi Cenaly kirish oynasini ochadi. Kirgandan soʻng quyidagilarni koʻrasiz:
- kim ruxsat soʻrayapti — ilova javob qaytadigan manzil boʻyicha nomlanadi: «Tekshirilgan konnektor · chatgpt.com» (xuddi shunday — claude.ai, perplexity.ai, vscode.dev, Cursor), «Bu kompyuterdagi dastur» yoki «Notanish manzil» ogohlantirishi. Ilova yuborgan nom mayda koʻrsatiladi — uni har kim yozishi mumkin;
- huquqlar — ilova soʻragan narsa belgilangan (agar u «hammasini ketma-ket» soʻrasa, «AI yordamchisi» toʻplami belgilanadi); «faqat alohida belgilash orqali» huquqlar hech qachon oldindan belgilanmaydi;
- filiallar — hammasi yoki tanlanganlari.
«Ruxsat berish» sizni yordamchiga qaytaradi va u darhol PBX vositalarini koʻradi. Ulanish Telefoniya → API va MCP → Kalitlar boʻlimida OAuth belgisi va ilova manzili bilan satr sifatida paydo boʻladi — oʻsha yerda huquqlar oʻzgartiriladi va ruxsat bekor qilinadi. Oʻsha ilovani qayta ulash uning huquqlarini yangilaydi, ikkinchi ulanish yaratmaydi.
Ulanishlarga ruxsat berishni faqat hisob egasi amalga oshirishi mumkin.
Claude Code, Claude Desktop, Cursor: kalit orqali ulanish#
Claude Code — bitta buyruq bilan:
claude mcp add --transport http telephony https://api.cenaly.com/pbx-api/mcp --header "Authorization: Bearer cpx_…"
Claude Desktop, Cursor (.cursor/mcp.json) va sozlamalar fayli boʻlgan boshqa mijozlar:
{
"mcpServers": {
"telephony": {
"type": "http",
"url": "https://api.cenaly.com/pbx-api/mcp",
"headers": { "Authorization": "Bearer cpx_…" }
}
}
}
Kalitingiz bilan tayyor qoʻshimchalar kalit yaratilgandan soʻng darhol koʻrsatiladi. AI yordamchisi faqat kalit ruxsat bergan vositalarni koʻradi va «bugun kim qoʻngʻiroq qildi va javob olmadi», «bu mijozga Anna telefonidan qayta qoʻngʻiroq qil», «menga mobil raqamga yoʻnaltirishni yoq» kabi savollarga javob bera oladi.
REST API#
Kalit Authorization: Bearer <kalit> sarlavhasida (yoki X-Api-Key). Agar kalitda bitta filial boʻlsa, location parametrini uzatmasa ham boʻladi; agar bir nechta boʻlsa, 400 location_required javobi ularni sanab beradi.
| Metod | Yoʻl | Huquq | Nima qiladi |
|---|---|---|---|
| GET | /v1/me |
— | kalitning huquqlari, filiallari va limitlari |
| GET | /v1/locations |
— | kalitning filiallari va ularning ATS |
| GET | /v1/calls |
calls:read |
qoʻngʻiroqlar jurnali: since, until, direction, status (answered, missed, ai), number, extension, limit 100 gacha, cursor |
| GET | /v1/calls/{id} |
calls:read |
marshruti bilan qoʻngʻiroq: qaysi qoida ishladi, kimning telefoni jiringladi, kim javob berdi |
| GET | /v1/calls/{id}/recording |
recordings:read |
yozib olishga 10 daqiqalik havola |
| GET | /v1/calls/{id}/transcript |
recordings:read |
suhbatning matni va yakuni |
| POST | /v1/dial |
calls:dial |
bir bosishda qoʻngʻiroq: { "extension": "101", "number": "+995555123456" } |
| GET | /v1/dial/{commandId} |
calls:dial |
bir bosishda qoʻngʻiroq qanday ketmoqda |
| GET | /v1/extensions |
extensions:read |
qoʻshimcha raqamlar, guruhlar, yoʻnaltirish, «bezovta qilmang» |
| PUT | /v1/extensions/{ext}/forwarding |
extensions:write |
qoʻshimcha raqamning shaxsiy yoʻnaltirishi |
| PUT | /v1/extensions/{ext}/dnd |
extensions:write |
«bezovta qilmang»: { "on": true } |
| GET | /v1/presence |
presence:read |
hozir kim boʻsh |
| GET | /v1/metrics |
reports:read |
davr uchun call-markaz metrikalari: from, to (filialning mahalliy sanalari YYYY-MM-DD, sukut boʻyicha — oxirgi 7 kun), compare (prev, year, prev,year yoki boʻsh), sections (metrics,loss,queues,lines,operators,directions,heatmap,daily), callbacks=true — qayta qoʻngʻiroq tezligi ham |
| GET | /v1/routes |
routes:read |
raqamlar, kiruvchi va chiquvchi qoidalar |
| GET | /v1/routes/history |
routes:read |
qoidalar oʻzgarishlari tarixi |
| POST, PUT, DELETE | /v1/routes/inbound…, /v1/routes/outbound… |
routes:write |
qoʻngʻiroq qoidalarini bittadan: yaratish, uzatilgan maydonlarni oʻzgartirish, oʻchirish, joyini almashtirish, orqaga qaytarish |
| GET, POST | /v1/config/export, /v1/config/import |
config:export, config:import |
sozlamalar fayl formatida; yuklash — avval koʻrib chiqish, soʻng qoʻllash |
| GET | /v1/events |
calls:read |
filialning 7 kunlik qoʻngʻiroq hodisalari (2000 gacha): since (hodisa id yoki vaqt), types, limit (bir javobda 500 gacha) |
| GET, POST, PATCH, DELETE | /v1/webhooks… |
webhooks:write |
vebhuklar: roʻyxat, yaratish, oʻzgartirish, oʻchirish; …/rotate-secret, …/test, …/deliveries |
| GET, PUT | /v1/open-closed |
routes:read, daynight:write |
yopiqmi va qachongacha; kun oxirigacha yopish { "closed": true }, sanagacha { "closed": true, "until": "2026-10-05T09:00" } yoki ochish |
Maydonlarning toʻliq tavsifi — hujjatlar sahifasida va OpenAPIda.
Bugun kim qoʻngʻiroq qildi va javob olmadi:
curl -H "Authorization: Bearer cpx_…" \
"https://api.cenaly.com/pbx-api/v1/calls?status=missed&since=$(date -u +%Y-%m-%dT00:00:00Z)"
Mijozga 101-qoʻshimcha raqam telefonidan qayta qoʻngʻiroq qilish:
curl -X POST -H "Authorization: Bearer cpx_…" -H "Content-Type: application/json" \
-d '{"extension":"101","number":"+995555123456"}' "https://api.cenaly.com/pbx-api/v1/dial"
Sentabr metrikalari avgust va oʻtgan yilning sentabri bilan taqqoslagan holda — oʻz BI panelingiz uchun:
curl -H "Authorization: Bearer cpx_…" \
"https://api.cenaly.com/pbx-api/v1/metrics?from=2026-09-01&to=2026-09-30&compare=prev,year"
Javobdagi metrics — Telefoniya → Qoʻngʻiroqlar jurnali → Analitika ekranidagi aynan oʻsha raqamlar: kiruvchi, qabul qilingan va oʻtkazib yuborilgan, xizmat koʻrsatish darajasi (chegara va maqsad — navbat sozlamalaridan), oʻrtacha va maksimal kutish, qisqalarsiz tashlab ketilganlar ulushi, AHT, FCR, oʻtkazmalar va bot ulushi, CSAT. compare.prev va compare.year — oʻtgan davr va oʻtgan yilning aynan shu davri uchun oʻsha maydonlar. Oʻtgan yil bilan taqqoslash 400 kungacha boʻlgan davrlar uchun hisoblanadi.
Xodim 15 soniyada javob bermasa, mobil raqamga yoʻnaltirishni yoqish:
curl -X PUT -H "Authorization: Bearer cpx_…" -H "Content-Type: application/json" \
-d '{"forward":{"noAnswer":{"kind":"number","number":"+995599000111"},"noAnswerSec":15}}' \
"https://api.cenaly.com/pbx-api/v1/extensions/101/forwarding"
MCP vositalari#
REST bilan bir xil amallar. Mijoz faqat kalit yoki ulanish ruxsat bergan vositalarni koʻradi:
| Vositalar | Huquq |
|---|---|
list_locations |
— |
list_calls, get_call |
calls:read |
get_call_recording, get_call_transcript |
recordings:read |
call_number, get_dial_status |
calls:dial |
list_extensions |
extensions:read |
set_forwarding, set_do_not_disturb |
extensions:write |
get_presence |
presence:read |
get_call_metrics |
reports:read |
list_routes, list_route_history |
routes:read |
save_inbound_rule, delete_inbound_rule, move_inbound_rule, save_outbound_rule, delete_outbound_rule, move_outbound_rule, set_outbound_calls, restore_route_version |
routes:write |
export_config |
config:export |
import_config |
config:import |
get_call_events |
calls:read |
list_webhooks, save_webhook, delete_webhook, rotate_webhook_secret, test_webhook, list_webhook_deliveries |
webhooks:write |
get_open_closed |
routes:read |
set_open_closed |
daynight:write |
Server sessiyalarsiz ishlaydi (streamable HTTP, JSON-RPC 2.0): initialize, tools/list, tools/call.
Oʻz konnektorlaringizni ishlab chiquvchilar uchun OAuth#
Avtorizatsiya serveri MCP avtorizatsiya spetsifikatsiyasiga amal qiladi — uni qoʻllab-quvvatlaydigan har qanday mijoz mos keladi:
- Tokensiz MCP ga soʻrov 401 oladi,
WWW-Authenticate: Bearer resource_metadata="https://api.cenaly.com/.well-known/oauth-protected-resource/pbx-api/mcp"sarlavhasi bilan. - Resurs metadatalari (RFC 9728) avtorizatsiya serverini koʻrsatadi —
https://api.cenaly.com/pbx-api; uning metadatalari (RFC 8414) —https://api.cenaly.com/.well-known/oauth-authorization-server/pbx-apimanzilida (va…/pbx-api/.well-known/openid-configuration). - Mijozni dinamik roʻyxatdan oʻtkazish (RFC 7591):
POST /pbx-api/oauth/register. Qaytish manzili — faqatlocalhost/127.0.0.1(istalgan port) yoki maʼlum konnektor manzili (claude.ai, claude.com, chatgpt.com, chat.openai.com, vscode.dev, www.perplexity.ai, enterprise.perplexity.ai; Cursor uchun — yana aynancursor://anysphere.cursor-mcp/oauth/callback). Mijozning kirish usuli —none(ommaviy mijoz),client_secret_postyokiclient_secret_basic. - PKCE bilan avtorizatsiya kodi (faqat
S256):GET /pbx-api/oauth/authorize→ egasining kirish va rozilik oynasi →code,statevaissbilan sizning manzilingizga qaytish.resourceparametri — MCP server manzili. - Tokenlar:
POST /pbx-api/oauth/token. Kod bir martalik va 2 daqiqa yashaydi (notoʻgʻricode_verifieruni oʻchiradi); kirish tokeni — 1 soat; yangilash tokeni — 90 kun, har yangilashda yangisi beriladi, avvalgisi ishlashdan toʻxtaydi. - Bekor qilish:
POST /pbx-api/oauth/revoke(RFC 7009) ulanishni butunlay oʻchiradi — «API va MCP» oynasidagi «Bekor qilish» kabi.
Kirish tokeni kalit qabul qilinadigan hamma joyda qabul qilinadi: ham MCP da, ham REST da, egasi ruxsat bergan huquq va filiallar bilan.
Limitlar va xatolar#
- Kalit yoki ulanish uchun: daqiqada 120 soʻrov va sutkada 20 000 (REST va MCP birgalikda).
- Bir klikda qoʻngʻiroq — alohida: daqiqada 10 va sutkada 300.
- Jurnal — soʻrov uchun 100 tagacha qoʻngʻiroq; filial PBX jurnalida — oxirgi 90 kun ichidagi 400 tagacha qoʻngʻiroq.
| Kod | Xato | Nima qilish kerak |
|---|---|---|
| 401 | api_key_missing, api_key_invalid |
kalit yoʻq, u bekor qilingan yoki muddati oʻtgan; OAuth tokeni muddati oʻtgan — uni yangilang |
| 403 | scope_required |
kalitda huquq yoʻq — uni «Huquqlar» boʻlimida qoʻshing |
| 400 | location_required |
kalitda bir nechta filial bor — location ni uzating |
| 404 | location_not_found |
filial yoʻq yoki kalit boshqa filiallar bilan cheklangan |
| 429 | rate_limited |
limit tugagan, Retry-After soniyadan keyin qayta urinib koʻring |
Qoʻngʻiroqlar hodisalari#
Real vaqtda — PBX vebhuklari: Telefoniya → API va MCP → Vebhuklar yoki webhooks:write huquqiga ega kalit bilan POST /v1/webhooks. Sizning https manzilingizga har bir hodisa uchun bir necha soniya ichida POST keladi: call.started (boshlandi: yoʻnalish, kim, qayerga, liniya), call.ringing (kimda jiringlayapti — har bir telefon uchun bittadan), call.answered (kim javob berdi), call.transferred (kim va kimga oʻtkazdi), call.ended (natija, davomiylik, suhbat, kim javob berdi). Vebhukni filiallar va hodisa turlari bilan cheklash mumkin.
{ "id": "1727771234.56:2", "type": "call.answered", "createdAt": "2026-10-01T10:00:05Z",
"locationId": "…", "webhookId": "wh_…", "attempt": 1,
"data": { "callId": "1727771234.56", "seq": 2, "direction": "inbound",
"from": { "number": "+995555123456" }, "party": { "extension": "101", "name": "Анна" } } }
Imzo — X-Cenaly-Signature: t=<unix vaqti>,v1=<vebhuk maxfiy kaliti bilan "t.tana" dan HMAC-SHA256> sarlavhasi. Qayta hisoblang, doimiy vaqtda solishtiring va t 5 daqiqadan eski boʻlsa rad eting. whsec_… maxfiy kaliti bir marta koʻrsatiladi; «Yangi maxfiy kalit» avvalgisini darhol bekor qiladi.
Yetkazib berish — 10 soniya ichida 2xx bilan javob bering. Aks holda 10 s, 30 s, 2, 5, 10, 15 va 15 daqiqa tanaffuslar bilan qayta yuboramiz (8 urinish, taxminan bir soat); qayta yuborishda oʻsha id boʻladi — shu orqali dublikatlarni tashlab yuboring. Yetkazib berishlar jurnali (javob kodi, vaqt, urinish) — vebhuk oynasida va GET /v1/webhooks/{id}/deliveries; «Tekshirish» xizmat webhook.ping yuboradi. Manzil 3 sutka ketma-ket bitta ham yetkazib berishni qabul qilmasa — vebhuk oʻzi oʻchadi: egasiga xat keladi, «Vebhuklar» oynasida «Avtomatik oʻchirilgan» belgisi va «Yoqish» tugmasi paydo boʻladi (yoki { "enabled": true } bilan PATCH /v1/webhooks/{id}).
Oʻz serveringizsiz — xuddi shu lentani soʻrov orqali oling: GET /v1/events?since=<oxirgi hodisa id> yoki MCP get_call_events vositasi (filial hodisalari oxirgi 7 kun uchun, 2000 tagacha; bitta javobda — 500 tagacha, more: true — oʻsha since bilan keyingisini oling).
Yozuv qayta ishlangandan soʻng — transkripsiya va tahlilga ega qoʻngʻiroq «Qoʻngʻiroqlar» boʻlimidagi «Vebhuk» manbasi vebhuki orqali keladi.
«Ochiq / yopiq» — { "closed": true } bilan PUT /v1/open-closed filialni sutka oxirigacha yopadi (telefondan *28 kabi: qoʻngʻiroqlar «ish vaqtidan tashqari» qoidalari boʻyicha ketadi), false — ochadi; GET yopiqmi va kim yopganini koʻrsatadi. "until" bilan — shu paytgacha yopiq (30 kundan oshmasligi kerak), keyin oʻzi ochiladi: vaqt siljishsiz (2026-10-05T09:00) filial vaqt mintaqasida oʻqiladi; false uni ham bekor qiladi. Marshrutlashda «*28 kodi bilan yopish» belgisi yoqilgan boʻlishi kerak (aks holda 409).
Xavfsizlik#
- Kalit bir marta koʻrsatiladi va bizda faqat barmoq izi sifatida saqlanadi; oshkor boʻlgan kalit bitta tugma bilan bekor qilinadi.
- OAuth ulanishiga faqat egasi ruxsat beradi va ruxsat qaysi manzilga berilayotgani koʻrinadi; ruxsat berilgan ulanishni huquqlar va filiallar bilan cheklash hamda istalgan vaqtda bekor qilish mumkin.
- Telefon raqamlari — mijozlaringizning shaxsiy maʼlumotlari: jurnal va yozuvlarga huquqni faqat ularga chindan kerak boʻlgan integratsiyalarga bering.
- Kalit yoki ulanish boʻyicha barcha oʻzgarishlar PBX harakatlar jurnalida kalit yoki ilova nomi bilan qayd etiladi.