Developer API endpoint-lərini işlətmək: nümunələr, səhifələmə, idempotency
Son yeniləmə: 11 noyabr 2026 · 8 dəq oxunur
Endpoint API-nin bir ünvanı və bir əməliyyatıdır: metod (GET oxumaq, POST yaratmaq, PATCH dəyişmək, DELETE silmək) və yol. Bütün endpoint-lər, parametrləri və cavab nümunələri developer.clomni.ai-da «API reference» səhifəsindədir. Hər endpoint-in yanında lazım olan scope-lar yazılıb, onlardan biri kifayətdir. Siyahıda olmayan endpoint developer tokenlərinə bağlıdır və 403 endpoint_not_available qaytarır. Hansı işə hansı endpoint və scope lazım olduğu «Hansı scope lazımdır: istəyinizə görə scope və endpoint seçimi» məqaləsində və «Scope-lar və endpoint-lər: …» məqalələrindədir.
Addımlar
-
1
Sorğu necə qurulur
Ünvan
https://api.clomni.ai/v1ilə başlayır, tokenAuthorization: Bearer <token>başlığında gedir, gövdə JSON-dur (Content-Type: application/json). Ünvanda workspace nömrəsi yazılmır.- Söhbətin API-dəki
id-si paneldə görünən nömrə ilə eynidir: «söhbət 1042»GET /conversations/1042deməkdir. - Adi endpoint-lər vaxtı Unix saniyəsi ilə, sinxron endpoint-ləri ISO 8601 ilə (
2026-11-08T16:00:00Z) qaytarır. Vaxt zonası UTC-dir. - Telefon beynəlxalq formatda yazılır:
+994501234567.
- Söhbətin API-dəki
-
2
Söhbətləri və mesajları oxuyun
GET /conversations(scopeconversations:read) söhbətləri 25-lik səhifələrlə qaytarır. Parametrlər:status(open,resolved,pending,snoozed,all, defaultopen),assignee_type(me,unassigned,assigned,all),inbox_id,page.curl "https://api.clomni.ai/v1/conversations?status=open&page=1" \ -H "Authorization: Bearer $CLOMNI_TOKEN"
const res = await fetch("https://api.clomni.ai/v1/conversations?status=open&page=1", { headers: { Authorization: `Bearer ${process.env.CLOMNI_TOKEN}` }, }); const { data } = await res.json(); for (const c of data.payload) console.log(c.id, c.status, c.meta.sender.name);import os, requests res = requests.get("https://api.clomni.ai/v1/conversations", params={"status": "open", "page": 1}, headers={"Authorization": f"Bearer {os.environ['CLOMNI_TOKEN']}"}, timeout=10) for c in res.json()["data"]["payload"]: print(c["id"], c["status"], c["meta"]["sender"]["name"])Söhbətin
can_replysahəsi indi müştəriyə sərbəst mesaj yazmaq olub-olmadığını göstərir. Mesajlar:GET /conversations/{conversation_id}/messages(scopemessages:read) son 20 mesajı verir, daha köhnələri üçün?before=<ən kiçik id>.message_type:0gələn,1gedən,2sistem qeydi,3şablon.status:sent,delivered,read,failed. -
3
Cavab yazın və söhbəti idarə edin
POST /conversations/{conversation_id}/messages, scopemessages:send:curl -X POST "https://api.clomni.ai/v1/conversations/1042/messages" \ -H "Authorization: Bearer $CLOMNI_TOKEN" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 6f1c2a9e-3b7d-4f0a-9c55-0e8b1d2a7f41" \ -d '{"content": "Salam, sifarişiniz bu gün çatdırılacaq."}'Kanal mesajı fonda göndərir,
statusəvvəlcəsentolur, nəticə sonramessage.updatedwebhook-u ilə gəlir. Alınmayanda səbəbcontent_attributes.external_error-dadır. Müştərinin görmədiyi daxili qeyd üçün"private": truegöndərin (scopenotes:write).- Bağlamaq, açmaq:
POST /conversations/{conversation_id}/toggle_statusilə{ "status": "resolved" }(scopeconversations:write). - Təyin etmək:
POST /conversations/{conversation_id}/assignmentsilə{ "assignee_id": 12 }və ya{ "team_id": 3 }(scopeconversations:assign). - Operator və komanda siyahısı:
GET /agents,GET /teams.
- Bağlamaq, açmaq:
-
4
Kontakt yaradın və axtarın
POST /contacts(scopecontacts:write):curl -X POST "https://api.clomni.ai/v1/contacts" \ -H "Authorization: Bearer $CLOMNI_TOKEN" \ -H "Content-Type: application/json" \ -d '{"name": "Leyla Həsənova", "phone_number": "+994501234567", "identifier": "crm-10045"}'identifiersizin sistemdəki ID-dir və workspace daxilində unikaldır.PATCH /contacts/{contact_id}yalnız göndərdiyiniz sahələri dəyişir.GET /contacts/search?q=crm-10045ad, e-poçt, telefon vəidentifierüzrə axtarır. Eyni e-poçt və ya telefonla ikinci kontakt 422 qaytarır: əvvəl axtarın, sonra yeniləyin.custom_attributesaçarları workspace-də əvvəlcədən yaradılmalıdır. -
5
Səhifələmə: adi siyahılar
GET /conversations:page(1-dən), 25-lik səhifə, cavabdata.metavədata.payload.GET /contacts:page, 15-lik səhifə, cavabmeta.count,meta.current_page,payload.GET /conversations/{conversation_id}/messages:before=<message_id>, hər dəfə 20 mesaj.
Bu siyahılar ekranda göstərmək üçündür. Məlumatı tam köçürmək üçün onları gəzməyin: səhifələr arasında yeni söhbət gələndə sıra sürüşür və obyektlər itə bilər.
-
6
Sinxron: məlumatı öz bazanıza köçürün
GET /sync/conversations(conversations:read),GET /sync/messages(messages:read),GET /sync/contacts(contacts:read). Parametrlər:updated_since(ISO 8601),after(əvvəlki cavabınnext_cursor-u),limit(1-100, default 50). Cavab:data,next_cursor,has_more.- İlk yükləmə:
updated_sinceolmadan başlayın,has_more: falseolana qədərafter=next_cursorilə davam edin. - Aldığınız ən böyük
updated_at-ı saxlayın. - Növbəti dəfə
updated_since= saxlanmış vaxt mənfi 2 dəqiqə. - Obyekti
idilə yazın (upsert), dublikatı atın. - Yeniliyi webhook ilə dərhal alın, sinxronu 5-15 dəqiqədən bir işlədin.
Sinxron obyektlərində söhbətin
id-si daxili ID-dir, paneldəki nömrənumber-də (mesajdaconversation_number) olur. Fayl linkləri qısa ömürlüdür. Sinxron dəqiqədə 60 sorğu ilə məhdudlaşır. Bütün tarixçəni bir dəfə köçürmək üçünPOST /exports(exports:run, eyni anda 1 iş, gündə 6) daha uyğundur. - İlk yükləmə:
-
7
Təkrar göndərməyə qarşı: Idempotency-Key
Şəbəkə kəsiləndə POST-un gedib-getmədiyini bilmək olmur. Hər yeni əməliyyat üçün yeni UUID yaradıb
Idempotency-Keybaşlığında göndərin, təkrar cəhddə eynisini göndərin.- Bütün
/v1POST-larında işləyir,/oauth/*xaric. Açar 1-255 simvoldur, app və workspace üzrə 24 saat saxlanır. - Eyni açar, eyni gövdə: əməliyyat təkrarlanmır, saxlanmış cavab
Idempotency-Replayed: trueilə qayıdır. - Eyni açar, fərqli gövdə: 409
idempotency_key_reused. Birinci sorğu hələ gedirsə: 409idempotency_key_in_progress. - 5xx cavablar saxlanmır, eyni açarla təkrar etmək olar.
Mesajda əlavə olaraq
content_attributes.client_echo_iddə var: eyni söhbətdə 24 saat ərzində eyni dəyərlə gələn sorğu yeni mesaj yaratmır. - Bütün
-
8
Hadisə lenti: GET /v1/events
Son 30 günün hadisələrini (webhook-dakı kimi, eyni
idilə) köhnədən yeniyə qaytarır. Scopeevents:readvə mövzunun oxuma scope-u (messages:read,conversations:read,contacts:read), yoxsa siyahı boş gəlir. Parametrlər:types(məsələnmessage.created,contact.updated),after,limit(1-100). Serverinizin açıq ünvanı yoxdursa lenti hər dəqiqə oxuyun, varsa webhook-un qaçırdığını buradan götürün.