Հանրային API և վեբհուքեր
REST API-ն թույլ է տալիս ձեր CRM-ին, կայքի բեքենդին կամ սեփական բոտին աշխատել cenaly.com-ի լիդերի և երկխոսությունների հետ այնպես, ինչպես դա անում է պանելը՝ կարդալ քարտերը, փոխել հատկությունները, ուղարկել իրադարձություններ, պատասխանել երկխոսություններում։ Վեբհուքերը, ընդհակառակը, իրենք են տեղեկացնում ձեր սերվերին նոր լիդերի, իրադարձությունների և հաղորդագրությունների մասին։
Ինչ է անհրաժեշտ մեկնարկի համար#
| Ինչ | Որտեղ |
|---|---|
| Դեր | հաշվի սեփականատեր — բանալին գործում է նրա անունից․ աշխատակիցները բանալիներ չեն տեսնում |
| Բաժին | միացված չաթ (լիդերն ու երկխոսությունները ապրում են դրանում) |
| Բանալի | Ինտեգրումներ → API և վեբհուքեր → Բանալիներ → Ստեղծել բանալի |
| API-ի հասցե | https://api.cenaly.com/public-api/v1 |
| Մեթոդների ուղեցույց | api.cenaly.com/public-api/v1/docs |
| OpenAPI 3.1 | api.cenaly.com/public-api/v1/openapi.json |
Քայլ 1. Բանալին և իրավունքները#
- Բացեք Ինտեգրումներ և էջի վերևում սեղմեք API և վեբհուքեր։
- Բանալիներ ներդիրում սեղմեք Ստեղծել բանալի, մուտքագրեք անվանումը («CRM», «Կայքի բեքենդ», «Telegram-բոտ»)։
- Ընտրեք իրավունքների հավաքածուն կամ նշեք իրավունքները մեկ առ մեկ, մի քանի մասնաճյուղերի դեպքում՝ որ մասնաճյուղերին է բանալին թույլատրված, և ժամկետը։
- Պատճենեք
cnk_…գաղտնիքը։ Այն ցուցադրվում է մեկ անգամ․ մեզ մոտ պահվում է միայն դրա մատնահետքը (SHA-256)։
| Իրավունք | Ինչ է տալիս |
|---|---|
contacts:read |
լիդի ցանկ, որոնում և քարտ, հատկություններ |
contacts:write |
փոխել հատկություններն ու պիտակները, միավորել, ջնջել սուբյեկտի հարցման հիման վրա |
events:read |
լիդի իրադարձությունների հոսք |
events:write |
ուղարկել իրադարձություններ (գնում, գրանցում, ցանկացած սեփական) |
conversations:read |
երկխոսություններ և հաղորդագրություններ |
conversations:write |
օպերատորի պատասխան, նշում, կարգավիճակ, պատասխանատու, պիտակներ |
messages:send |
հաղորդագրություն լիդին նրա վերջին երկխոսությունում |
segments:read |
պահպանված սեգմենտներ և դրանց մասնակիցներ |
Հավաքածուներ՝ CRM / բեքենդ (լիդեր, հատկություններ, իրադարձություններ, երկխոսությունների և սեգմենտների ընթերցում), Սեփական բոտ (կարդում է լիդերին, պատասխանում է երկխոսություններում, գրում է լիդերին), Միայն ընթերցում, Ամեն ինչ։
- Իրավունքները փոխում են բանալու իրավունքներն ու մասնաճյուղերը անմիջապես — ինտեգրումը շարունակում է աշխատել։
- Վերաթողարկել-ը տալիս է նոր գաղտնիք․ հինն անմիջապես դադարում է աշխատել, իրավունքներն ու մատյանը մնում են։
- Հետ կանչել — անմիջապես և ընդմիշտ, հաջորդ հարցումը կստանա
401։
Բանալին փոխանցվում է Authorization: Bearer cnk_… վերնագրով (կամ X-Api-Key: cnk_…)։ Պահեք այն միայն սերվերում — ոչ բրաուզերում և ոչ բջջային հավելվածում։
Քայլ 2. Առաջին հարցումները#
KEY=cnk_ваш_ключ
API=https://api.cenaly.com/public-api/v1
# что умеет ключ: права, точки, лимит
curl -H "Authorization: Bearer $KEY" "$API/me"
# лиды, свежие сверху (20 на страницу)
curl -H "Authorization: Bearer $KEY" "$API/contacts?limit=20"
# поиск по имени, почте или телефону
curl -H "Authorization: Bearer $KEY" "$API/contacts?q=anna"
Պատասխանը միշտ ծրար է՝
{
"meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" },
"data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Анна", "updatedAt": "2026-10-04T09:12:00Z" } ] }
}
Հաջորդ էջը՝ նույն հարցումը cursor=<meta.nextCursor>-ով․ nextCursor չկա — էջերն այլևս չկան։ Սխալ՝ {"meta": {...}, "error": {"code": "…"}}։
Մասնաճյուղ։ Եթե բանալուն հասանելի է մեկ մասնաճյուղ, այն նշել պետք չէ։ Եթե մի քանիսը՝ ավելացրեք location=<մասնաճյուղի id> (ցանկը՝ GET /v1/locations), հակառակ դեպքում պատասխանը կլինի 400 location_required։
Հատկություններ և իրադարձություններ ձեր user_id-ով։ Պարտադիր չէ պահել լիդի մեր id-ն․ ավելացրեք ?by=user_id, և հասցեն կդառնա ձեր օգտատիրոջ նույնացուցիչը։ Այդպիսի user_id-ով լիդ դեռ չկա — մենք կստեղծենք այն։
# свойства: операции update_or_create, set_once, add, delete, append, union, exclude
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"ops":[{"op":"update_or_create","key":"$email","value":"anna@example.com"},
{"op":"add","key":"orders","value":1},
{"op":"union","key":"interests","value":"yoga"}]}' \
"$API/contacts/u-1001/props?by=user_id"
# события пачкой (до 100), повтор с тем же id засчитывается один раз
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"events":[{"id":"ord-5531","userId":"u-1001","name":"order_paid","props":{"sum":45,"currency":"GEL"}}]}' \
"$API/events"
# ответ в диалоге и смена статуса
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"text":"Здравствуйте! Заказ передан курьеру."}' "$API/conversations/<id>/reply"
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"status":"resolved"}' "$API/conversations/<id>/status"
Գրառումն անցնում է նույն հերթով, ինչ պանելից արված փոփոխությունները․ փոփոխությունները կիրառվում են վայրկյանների ընթացքում, իսկ user_id-ով գրառման պատասխանը՝ 202՝ pending-ով։ Լիդի քարտում փոփոխության հեղինակը երևում է որպես «API: <բանալու անվանումը>»։
Մեթոդներ#
| Մեթոդ | Ինչ է անում | Իրավունք |
|---|---|---|
GET /v1/me, GET /v1/locations |
բանալին, իրավունքները, մասնաճյուղերը | — |
GET /v1/contacts |
լիդեր՝ status (anon, lead, user), q, limit, cursor |
contacts:read |
GET /v1/contacts/{id} |
քարտ՝ հատկություններ, պիտակներ, իրադարձությունների ամփոփում | contacts:read |
POST /v1/contacts/{id}/props |
հատկություններ գործողություններով (մինչև 250) կամ {"props":{…}} |
contacts:write |
POST / DELETE /v1/contacts/{id}/tags |
լիդի պիտակներ | contacts:write |
POST /v1/contacts/merge |
երկու քարտերի միավորում՝ նախադիտում, ապա "apply": true |
contacts:write |
POST /v1/contacts/{id}/erase |
ջնջում սուբյեկտի հարցմամբ ("confirm": true) |
contacts:write |
GET /v1/contacts/{id}/events |
լիդի իրադարձությունների հոսք | events:read |
POST /v1/contacts/{id}/events, POST /v1/events |
իրադարձություններ (մինչև 100 միաժամանակ) | events:write |
GET /v1/contacts/{id}/conversations |
լիդի երկխոսություններ | conversations:read |
POST /v1/contacts/{id}/messages |
գրել լիդին նրա վերջին երկխոսության մեջ | messages:send |
GET /v1/conversations, /{id}, /{id}/messages |
երկխոսություններ և հաղորդագրություններ | conversations:read |
POST /v1/conversations/{id}/reply |
օպերատորի պատասխան կամ նշում ("type": "note") |
conversations:write |
POST /v1/conversations/{id}/status, /assign, /tags |
կարգավիճակ, պատասխանատու, պիտակներ | conversations:write |
GET /v1/segments, GET /v1/segments/{id}/contacts |
սեգմենտներ և դրանց մասնակիցներ | segments:read |
Յուրաքանչյուր մեթոդի դաշտերը, օրինակներն ու սխալի կոդերը՝ տեղեկատուում։
Քայլ 3. Վեբհուքեր#
Վեբհուքերը կարգավորվում են մասնաճյուղի մակարդակով՝ Չատ → Կարգավորումներ → Վեբհուքեր — https հասցե, իրադարձություններ և ստորագրության գաղտնիք։ Երկխոսության իրադարձություններին (նոր երկխոսություն, նոր հաղորդագրություն, կարգավիճակ, գնահատական, պիտակներ) ավելացան լիդի իրադարձությունները.
| Իրադարձություն | Երբ է գալիս |
|---|---|
lead.created |
հայտնվել է նոր լիդ (կոնտակտը թողնվել է չատում, ձևում կամ ստեղծվել API-ի միջոցով) |
lead.props_changed |
փոխվել են լիդի հատկությունները — բանալիների ցանկը changedProps-ում |
lead.event_tracked |
լիդն ունի իրադարձություն. լռելյայն՝ ձեր բոլոր իրադարձությունները՝ առանց համակարգայինների ($…), անունների ցանկը սահմանվում է «Ինչ իրադարձություններ ուղարկել» դաշտով |
message.goal_reached |
լիդը հասել է հաղորդագրության նպատակին (փոփ-ափ, ուղարկում) |
{
"event": "lead.event_tracked",
"deliveryId": "WD…",
"at": "2026-10-04T09:12:03Z",
"webhookId": "…",
"locationId": "…",
"contact": { "id": "…", "status": "user", "userId": "u-1001", "props": { "orders": 3 }, "tags": ["vip"] },
"leadEvent": { "name": "order_paid", "at": "2026-10-04T09:12:00Z", "props": { "sum": 45 } }
}
Լիդի անունը, էլ. փոստը և հեռախոսը հայտնվում են մարմնում միայն այն դեպքում, երբ վեբհուքի մոտ միացված է «Փոխանցել հյուրի կոնտակտները» նշիչը։ Ստորագրության ստուգումը՝ մարմնի HMAC-SHA256 վեբհուքի գաղտնիքով.
# заголовок X-Meni-Signature: sha256=<hex>
echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET"
Պատասխանեք 2xx 5 վայրկյանի ընթացքում — հակառակ դեպքում առաքումը կկրկնվի. անհաջողությունների երկար շարքից հետո վեբհուքն անջատվում է, և դա երևում է կարգավորումներում։ Կրկնօրինակները զտեք deliveryId-ով։
Սահմանափակումներ#
- 60 հարցում մեկ րոպեում մեկ բանալու համար. գերազանցելու դեպքում՝
429՝Retry-Afterվերնագրով։ Մնացորդը՝X-RateLimit-*-ում։ - Մինչև 200 գրառում մեկ էջում (լռելյայն՝ 50), մինչև 100 իրադարձություն մեկ փաթեթում, մինչև 250 գործողություն հատկությունների հետ մեկ հարցման համար, մինչև 30 պիտակ միաժամանակ։
- Մինչև 20 ակտիվ բանալի մեկ հաշվի համար։
- Բանալու կանչերի մատյանը պահվում է 30 օր. ժամանակը, մեթոդը, ուղու ձևանմուշը (առանց id-ի և մարմնի), պատասխանի կոդը, տևողությունը։
- API-ի միջոցով ուղարկված իրադարձությունները ընկնում են լիդի քարտի մեջ (հոսք, ամփոփում, սեգմենտներ), բայց ոչ այցելությունների վերլուծության չմշակված մատյանի մեջ։
- Լիդին կարելի է գրել միայն գոյություն ունեցող երկխոսության մեջ. երկխոսություն չկա՝ պատասխանը
409 no_conversationէ։
Խնդիրների լուծում#
| Պատասխան | Ինչ է նշանակում | Ինչ անել |
|---|---|---|
401 api_key_missing / api_key_invalid |
բանալին հարցման մեջ չկա, կամ այն սխալ է, չեղարկված կամ ժամկետանց | ստուգեք վերնագիրը. անհրաժեշտության դեպքում վերաթողարկեք բանալին |
403 scope_required |
բանալին չունի անհրաժեշտ իրավունքը | Իրավունքներ բանալու մոտ — ավելացրեք իրավունքը |
400 location_required |
բանալուն հասանելի են մի քանի մասնաճյուղեր | ավելացրեք location=<id> |
404 location_not_found |
մասնաճյուղը բանալու մասնաճյուղերի մեջ չկա | համեմատեք GET /v1/locations-ի հետ |
404 not_found |
լիդը կամ երկխոսությունը չկա | ձեր id-ների համար օգտագործեք ?by=user_id |
429 rate_limited |
րոպեում 60 հարցումից ավելի | սպասեք Retry-After վայրկյան, խմբավորեք իրադարձությունները փաթեթներով |
502 upstream_error |
ժամանակավոր խափանում | կրկնեք հարցումը ավելի ուշ |
Յուրաքանչյուր հարցում երևում է Կանչերի մատյան ներդիրում՝ պատասխանի կոդով և բանալու անվանմամբ։
Հաճախ տրվող հարցեր#
Կարելի՞ է API-ն կանչել բրաուզերից։ Ոչ. բանալին հասանելիություն է տալիս մասնաճյուղի բոլոր լիդերին։ Կանչեք API-ն ձեր սերվերից։
Ինչո՞վ է user_id-ն տարբերվում լիդի id-ից։ Լիդի id-ն մեր քարտի նույնացուցիչն է։ user_id-ն ձեր օգտատիրոջ նույնացուցիչն է (համարը CRM-ում, հաշվի id-ն կայքում). ?by=user_id-ով քարտին կարելի է դիմել դրանով։
Ի՞նչ կլինի իրադարձությունը կրկին ուղարկելիս։ Նույն id-ով իրադարձությունը հաշվվում է մեկ անգամ — ցանցային սխալի դեպքում կարող եք վստահորեն կրկնել հարցումը։
Առանձին բանալի՞ է պետք յուրաքանչյուր մասնաճյուղի համար։ Ոչ. մեկ բանալին կարող է աշխատել մի քանի մասնաճյուղերի հետ, մասնաճյուղն ընտրվում է location պարամետրով։
Առնչվող բաժիններ#
- Չատ հյուրերի հետ — երկխոսություններ, լիդեր և վեբհուքերի կարգավորումներ
- Հայտեր — միասնական մուտքային հոսք
- Ձեր ԱԿՀ-ի API-ն և MCP-ն — հեռախոսակապի առանձին API
- Ինտեգրումներ