Bitimlar uchun ochiq API va CRM vebxuklari
Chato bitimlarini o‘z dasturingizdan boshqarish mumkin: sayt ariza bo‘yicha bitim yaratadi, 1C to‘lovdan keyin uni yopadi, ombor menejerga vazifa qo‘yadi. Teskari yo‘nalishda Chato dasturingizga CRMda nima bo‘lganini xabar qiladi: bitim ko‘chirildi, yutildi, mas’ul o‘zgardi.
Kabinetda sozlanadi: Bitimlar → ⋯ → Sozlamalar → API va vebxuklar (administrator va egasi ko‘radi). U yerda barcha so‘rovlar ma’lumotnomasiga havola bor — Swagger: https://chato.kz/api/v1/public/docs, OpenAPI tavsifi — https://chato.kz/api/v1/public/openapi.json.
API kaliti
Yangi kalit tugmasini bosing, unga nom bering («Sayt», «1C») va huquqlarni belgilang:
| Huquq | Nimaga ruxsat beradi |
|---|---|
deals:read |
bitimlar va ularning izohlarini o‘qish |
deals:write |
bitimlarni yaratish, o‘zgartirish, ko‘chirish, yopish, o‘chirish, izoh yozish |
contacts:read / contacts:write |
kontaktlarni qidirish / yaratish va o‘zgartirish |
tasks:read / tasks:write |
vazifalarni o‘qish / qo‘yish va bajarish |
pipelines:read |
voronkalar, bosqichlar, qo‘shimcha maydonlar, rad etish sabablari |
users:read |
xodimlar ro‘yxati (responsibleUserId uchun) |
messages:send |
mijozlarga yozish |
Kalit bir marta ko‘rsatiladi — uni darhol nusxalab oling. Chato faqat uning izini saqlaydi va kalitni qayta ko‘rsata olmaydi. Ro‘yxatda kalitni kim chiqargani va oxirgi marta qachon ishlatilgani ko‘rinadi. Bekor qilish — kalit darhol ishlashdan to‘xtaydi, dastur 401 oladi.
Kalit — parol kabi: uni serverda, muhit o‘zgaruvchilarida saqlang. Tashrif buyuruvchi brauzeri ko‘radigan sayt kodiga hech qachon joylamang.
Dastur kalit orqali qilgan hamma narsa bitim tarixiga kalitni chiqargan xodim nomidan «API orqali» belgisi bilan yoziladi. Kalit o‘z muallifidan ortiq qila olmaydi: agar xodimdan voronka yashirilgan bo‘lsa, uning kalitidan ham yashirilgan. Bosqich avtomatlashtirishlari, bildirishnomalar va hamkasblar doskasining jonli yangilanishi kabinetdagidek ishlaydi.
So‘rovlarni qanday yuborish kerak
https://chato.kz/api/v1/public
Authorization: Bearer chato_sk_...
Content-Type: application/json
Kalitni X-Api-Key sarlavhasi bilan ham berish mumkin. Muvaffaqiyatli javob har doim data maydonida bo‘ladi.
- Cheklov — bitta kalitga daqiqasiga 120 so‘rov. Undan oshsa —
429vaRetry-Aftersarlavhasi (necha soniyadan keyin takrorlash kerak). QoldiqX-RateLimit-Remainingda. Har bir kalitning o‘z hisoblagichi bor: bir dastur boshqasining cheklovini yemaydi. - Dublsiz takrorlash —
POSTso‘rovigaIdempotency-Keysarlavhasini qo‘shing (255 belgigacha istalgan satr, masalan o‘zingizdagi ariza id si). Bir sutka ichida xuddi shu kalit bilan takrorlash birinchi javobniIdempotent-Replayed: truesarlavhasi bilan qaytaradi va ikkinchi bitim yaratmaydi. Xuddi shu kalit boshqa tana bilan —422 IDEMPOTENCY_KEY_REUSED.
Xatolar
Xato har doim bir ko‘rinishda keladi (message rus tilida; textCode bo‘yicha tarjima qiling):
{
"error": {
"code": "REQUIRED_FIELDS",
"message": "Заполните поля, чтобы перенести в «Договор подписан»",
"textCode": "REQUIRED_FIELDS",
"params": { "stage": "Договор подписан" },
"details": { "missing": [{ "key": "data_dogovora", "label": "Дата договора", "type": "DATE" }] }
},
"statusCode": 422
}
| Kod | Qachon |
|---|---|
401 UNAUTHORIZED |
kalit yo‘q, noto‘g‘ri yoki bekor qilingan |
403 FORBIDDEN_SCOPE |
kalitda kerakli huquq yo‘q |
404 DEAL_NOT_FOUND va h.k. |
kompaniyangizda bunday obyekt yo‘q (boshqa kompaniyalarning id lari har doim 404 beradi) |
400 VALIDATION_FAILED |
ma’lumotlar noto‘g‘ri, ro‘yxati — details.validation da |
422 REQUIRED_FIELDS |
bosqich uchun majburiy maydonlar kerak — qaysilari, details.missing da |
422 LOSS_REASON_REQUIRED |
sababsiz «Rad etish»ga ko‘chirish, voronka esa uni talab qiladi |
429 RATE_LIMITED |
cheklov oshib ketdi, Retry-After ni qarang |
Ma’lumotnomalar
curl https://chato.kz/api/v1/public/pipelines -H "Authorization: Bearer $CHATO_KEY"
Bosqichli voronkalar (kind: OPEN — ishchi, WON — «Muvaffaqiyatli», LOST — «Rad etish»). Shuningdek:
GET /deal-fields— qo‘shimcha maydonlar:key(qiymatlar yoziladigan maydon kodi), turi, variantlari, qaysi bosqichlarda majburiy;GET /loss-reasons— rad etish sabablari;GET /users— xodimlar (id, ism, pochta, rol).
Bitimlar
Yaratish
curl -X POST https://chato.kz/api/v1/public/deals \
-H "Authorization: Bearer $CHATO_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: site-order-10542' \
-d '{
"pipelineId": "PIPELINE_ID",
"title": "Заявка с сайта",
"amount": 150000,
"contact": { "name": "Айгерим", "phone": "+7 701 555 11 22", "email": "aigerim@example.com" },
"tags": ["сайт"],
"fields": { "gorod": "almaty", "obem": 40 }
}'
Kontakt — contactId yoki contact. contact bo‘yicha Chato avval odamni qidiradi: telefon bo‘yicha (oxirgi 10 raqam, istalgan formatda), keyin e-mail bo‘yicha (registrga qaramay); topmasa — yangisini yaratadi. Javobdagi contactCreated nima bo‘lganini ko‘rsatadi. pipelineId va stageId bo‘lmasa, bitim birinchi voronkaning birinchi bosqichiga tushadi. Standart mas’ul — kalit muallifi; "responsibleUserId": null — mas’ulsiz. Bitim manbai — «API».
Qo‘shimcha maydonlar — /deal-fields kodlari bo‘yicha fields obyekti: ro‘yxat uchun — variant id si, ko‘p tanlov uchun — massiv, sana uchun — 2026-09-28, belgi uchun — true/false. Noto‘g‘ri qiymat — maydon nomi bilan 400.
O‘zgartirish
curl -X PATCH https://chato.kz/api/v1/public/deals/DEAL_ID \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"amount": 180000, "tags": ["сайт", "vip"], "fields": {"oplata": "invoice"}}'
Faqat yuborilgani o‘zgaradi. tags avvalgi ro‘yxatni almashtiradi, maydondagi null uni tozalaydi.
Ko‘chirish, yopish
# bosqichga — doskadagi kabi qoidalar bilan
curl -X POST https://chato.kz/api/v1/public/deals/DEAL_ID/move \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"stageId": "STAGE_ID", "fields": {"data_dogovora": "2026-09-28"}}'
# muvaffaqiyatli
curl -X POST https://chato.kz/api/v1/public/deals/DEAL_ID/close \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"result": "won"}'
# rad etish — /loss-reasons sababi bilan
curl -X POST https://chato.kz/api/v1/public/deals/DEAL_ID/close \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"result": "lost", "lossReasonId": "REASON_ID", "lossComment": "выбрали другого"}'
Agar bosqichda majburiy maydonlar bo‘lsa-yu, bitimda ular bo‘sh bo‘lsa, maydonlar ro‘yxati bilan 422 REQUIRED_FIELDS keladi — ularni fields ga qo‘shib, so‘rovni takrorlang. close bitim voronkasining birinchi «Muvaffaqiyatli» / «Rad etish» bosqichini oladi; boshqasi kerak bo‘lsa — uning stageId sini bering.
Topish, o‘qish, o‘chirish
curl 'https://chato.kz/api/v1/public/deals?pipelineId=PIPELINE_ID&status=open&limit=50' \
-H "Authorization: Bearer $CHATO_KEY"
Javob: {"data": {"items": [...], "nextCursor": "..."}}. Keyingi sahifa — xuddi shu so‘rov &cursor=<nextCursor> bilan; nextCursor: null — sahifalar tugadi. Filtrlar: pipelineId, stageId, status (open, won, lost, closed, unsorted), responsibleUserId (yoki none), contactId, tag, search (nomi, mijoz ismi yoki raqami), updatedSince va createdSince (ISO sana — «oxirgi martadan beri nima o‘zgardi» sinxronlash uchun qulay).
GET /deals/DEAL_ID— bitta bitim;DELETE /deals/DEAL_ID— 30 kunga savatga (204);POST /deals/DEAL_ID/restore— qaytarish.
Izohlar va vazifalar
curl -X POST https://chato.kz/api/v1/public/deals/DEAL_ID/notes \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"text": "Оплата прошла в 1С"}'
curl -X POST https://chato.kz/api/v1/public/deals/DEAL_ID/tasks \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"kind": "CALL", "text": "Перезвонить", "dueAt": "2026-10-01T09:00:00+05:00"}'
curl -X POST https://chato.kz/api/v1/public/tasks/TASK_ID/complete \
-H "Authorization: Bearer $CHATO_KEY" -H 'Content-Type: application/json' \
-d '{"result": "Дозвонились"}'
GET /deals/DEAL_ID/notes va GET /deals/DEAL_ID/tasks — ro‘yxatlar. Vazifa turlari: CALL, MEETING, WRITE, OTHER va o‘zingiznikilar (CUSTOM + customTypeId).
Kontaktlar
GET /contacts?phone=87015551122yoki?email=...— topish (20 tagacha);POST /contacts{name, phone, email}— yaratish; odam allaqachon bo‘lsa, o‘sha qaytariladi (200,"created": false), yangisi —201;PATCH /contacts/CONTACT_ID— ism, telefon, e-mailni o‘zgartirish.
Mijozga yozish
messages:send huquqi bilan: POST /messages — conversationId yoki phone (yangi raqam uchun qo‘shimcha channelId), text va/yoki fileUrl — kiruvchi havolaning message amali kabi.
Vebxuklar: bitim hodisalari manzilingizga
Manzil qo‘shish → https manzilini kiriting va hodisalarni belgilang. Saqlangandan keyin manzilning o‘z imzo siri paydo bo‘ladi («Ko‘rsatish» tugmasi).
| Hodisa | Qachon |
|---|---|
deal.created |
bitim yaratildi (kabinetda, API orqali, murojaatdan) |
deal.updated |
nomi, summasi, teglari, maydonlari yoki mas’uli o‘zgardi |
deal.stage_changed |
bitim boshqa bosqichga o‘tdi |
deal.won / deal.lost |
bitim yutildi / rad etildi |
deal.deleted / deal.restored |
savatga / savatdan |
deal.responsible_changed |
mas’ul o‘zgardi |
task.created / task.completed |
vazifa qo‘yildi / bajarildi |
note.created |
izoh qo‘shildi |
Xuddi shu manzilga chat hodisalarini ham olish mumkin (message.received, conversation.closed va boshqalar — Vebxuklar ga qarang).
Chato POST yuboradi:
{
"id": "evt_3f2a9c...",
"event": "deal.won",
"createdAt": "2026-09-28T10:15:00.000Z",
"workspaceId": "cmr4sk0ya0001o701hl7ghbqk",
"data": {
"deal": {
"id": "cmulms3cp000r29eujik2dr1e",
"title": "Заявка с сайта",
"amount": 150000,
"currency": "KZT",
"status": "won",
"pipeline": { "id": "...", "name": "Продажи" },
"stage": { "id": "...", "name": "Успешно", "kind": "WON" },
"contact": { "id": "...", "name": "Айгерим", "phone": "77015551122", "email": "aigerim@example.com" },
"responsible": { "id": "...", "name": "Асхат", "email": "askhat@example.com" },
"tags": ["сайт"],
"fields": { "gorod": "almaty" },
"closedAt": "2026-09-28T10:15:00.000Z"
},
"changes": {
"stage": {
"from": { "id": "...", "name": "Счёт выставлен", "kind": "OPEN" },
"to": { "id": "...", "name": "Успешно", "kind": "WON" }
}
},
"actor": { "type": "api", "userId": "..." }
}
}
deal — bitimning API qaytaradigan ko‘rinishdagi surati. changes — nima o‘zgargani (from → to; qo‘shimcha maydonlar fields.<kod> ko‘rinishida). actor.type: user (kabinetdagi xodim), api, webhook, automation, system. task.* va note.created da deal yonida task / note turadi.
Sarlavhalar: X-Chato-Event (hodisa), X-Chato-Event-Id (takrorlarda bir xil — dublikatlarni shu bo‘yicha tashlang), X-Chato-Delivery, X-Chato-Timestamp, X-Chato-Signature.
Imzoni tekshirish
X-Chato-Signature — bu sha256= + manzil siri bilan <X-Chato-Timestamp>.<xom tana> satridan olingan HMAC-SHA256. Uni JSON tahlil qilinishidan oldin xom tana bo‘yicha hisoblang va 5 daqiqadan eski so‘rovlarni rad eting.
Node.js (Express):
const crypto = require('node:crypto');
app.post('/chato', express.raw({ type: 'application/json' }), (req, res) => {
const ts = req.get('X-Chato-Timestamp');
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.CHATO_WEBHOOK_SECRET)
.update(`${ts}.${req.body}`)
.digest('hex');
const given = req.get('X-Chato-Signature') || '';
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
if (!fresh || given.length !== expected.length ||
!crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected))) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body);
res.sendStatus(200); // darhol javob bering, og‘ir ish — fonda
});
PHP:
$body = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_CHATO_TIMESTAMP'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, getenv('CHATO_WEBHOOK_SECRET'));
$given = $_SERVER['HTTP_X_CHATO_SIGNATURE'] ?? '';
if (abs(time() - (int) $ts) > 300 || !hash_equals($expected, $given)) {
http_response_code(401);
exit;
}
$event = json_decode($body, true);
http_response_code(200);
Python (Flask):
import hmac, hashlib, os, time
from flask import request, abort
@app.post("/chato")
def chato():
body = request.get_data() # xom baytlar
ts = request.headers.get("X-Chato-Timestamp", "")
expected = "sha256=" + hmac.new(
os.environ["CHATO_WEBHOOK_SECRET"].encode(), f"{ts}.".encode() + body, hashlib.sha256
).hexdigest()
given = request.headers.get("X-Chato-Signature", "")
if abs(time.time() - int(ts or 0)) > 300 or not hmac.compare_digest(expected, given):
abort(401)
event = request.get_json()
return "", 200
Qayta yuborishlar, jurnal, avto-o‘chirish
- Muvaffaqiyat — 10 soniya ichidagi istalgan
2xxjavob. Aks holda Chato 1 daq, 5 daq, 30 daq, 2 soat va 6 soatdan keyin qayta yuboradi — jami olti urinish. Yo‘naltirishlar (3xx) bajarilmaydi. - Manzil ostidagi yetkazish jurnali: holat, javob kodi, urinishlar soni, nima yuborilgani va serveringiz nima javob bergani. Qayta yuborish — hodisaning o‘sha
idsi bilan qayta yetkazish. Jurnal 30 kun saqlanadi. - Agar yetkazishlar ketma-ket ko‘p marta o‘tmasa (25 urinish), manzil o‘zi o‘chadi, egasi va administratorlar bildirishnoma oladi. Qabul qiluvchini tuzating va Yoqish ni bosing.
- Tekshirish —
pingsinov hodisasini yuboradi. Yangi sir — eskisi darhol yaroqsiz bo‘ladi.
Darhol 200 javob bering, qayta ishlashni esa fonda bajaring: uzoq javobni Chato muvaffaqiyatsizlik deb hisoblab, qayta yuboradi — takror esa o‘sha X-Chato-Event-Id bilan keladi, uni oson tanish mumkin.
Kiruvchi havola orqali bitimlar
Agar assistentning kiruvchi havolasidan foydalansangiz, u bitimlar bilan ham ishlaydi — API dagi kabi qoidalar bilan, tarixda «vebxuk orqali» belgisi bilan:
{ "action": "deal.create", "contact": { "name": "Айгерим", "phone": "+77015551122" }, "deal": { "title": "Заказ из 1С", "amount": 77000 } }
{ "action": "deal.move", "dealId": "DEAL_ID", "stageId": "STAGE_ID" }
{ "action": "deal.note", "dealId": "DEAL_ID", "text": "Оплата прошла" }



