POST/v1/integrations/leads
Створити заявку
Передає ім’я та контакт у поточну студію. Idempotency-Key захищає повтор після втраченої відповіді.
Потрібне право: leads.create
Публічний API · версія 1.0.0
Сервер вашого сайту створює заявку в потрібній студії та читає її стан. Ключ відкриває лише ту студію, яка його видала.
Адресаhttps://api.clubbase.fit
Ключів у студії може бути до 20, строк дії нового — до 366 днів. Заміна вимикає попередній секрет одразу; відкликання остаточне. Cookie входу в CRM ключа не замінює.
Відкрити свою CRMКлюч передається заголовком Authorization: Bearer …. Для створення заявки потрібен ще Idempotency-Key — будь-який UUID, який ви зберігаєте разом із заявкою.
curl -X POST https://api.clubbase.fit/v1/integrations/leads \
-H "Authorization: Bearer $CLUBBASE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
-d '{
"displayName": "Приклад API",
"contact": {
"type": "email",
"value": "[email protected]"
},
"sourceId": null,
"note": "Контрольна заявка інтеграції"
}'import { randomUUID } from 'node:crypto';
// Ключ — зі змінних середовища, ніколи не з коду сторінки.
const response = await fetch('https://api.clubbase.fit/v1/integrations/leads', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.CLUBBASE_API_KEY}`,
'Content-Type': 'application/json',
// Той самий ключ при повторі поверне ту саму заявку, а не другу.
'Idempotency-Key': randomUUID(),
},
body: JSON.stringify({
"displayName": "Приклад API",
"contact": {
"type": "email",
"value": "[email protected]"
},
"sourceId": null,
"note": "Контрольна заявка інтеграції"
}),
});
if (!response.ok) {
const problem = await response.json();
throw new Error(`${problem.status} ${problem.code}: ${problem.detail}`);
}
const lead = await response.json();<?php
// Ключ читається з оточення сервера, а не з коду сторінки.
// Idempotency-Key має бути саме UUID: 32 hex-символи без дефісів API відхилить.
$bytes = random_bytes(16);
$bytes[6] = chr(ord($bytes[6]) & 0x0f | 0x40);
$bytes[8] = chr(ord($bytes[8]) & 0x3f | 0x80);
$idempotencyKey = vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($bytes), 4));
$ch = curl_init('https://api.clubbase.fit/v1/integrations/leads');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('CLUBBASE_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: ' . $idempotencyKey,
],
CURLOPT_POSTFIELDS => json_encode([
'displayName' => "Приклад API",
'contact' => [
'type' => "email",
'value' => "[email protected]",
],
'note' => "Контрольна заявка інтеграції",
], JSON_UNESCAPED_UNICODE),
]);
$response = curl_exec($ch);Успіх повертає 201 і тіло заявки з її ідентифікатором. Повтор того самого Idempotency-Key поверне ту саму заявку, а не другу.
POST/v1/integrations/leads
Передає ім’я та контакт у поточну студію. Idempotency-Key захищає повтор після втраченої відповіді.
Потрібне право: leads.create
GET/v1/integrations/leads/{id}
Повертає дозволені поля однієї заявки. Чужий або невідомий ID повертає 404.
Потрібне право: leads.read
GET/v1/integrations/leads
Читає заявки сторінками. Значення nextCursor передайте в наступний запит без змін.
Потрібне право: leads.read
curl "https://api.clubbase.fit/v1/integrations/leads?limit=20" \
-H "Authorization: Bearer $CLUBBASE_API_KEY"curl https://api.clubbase.fit/v1/integrations/leads/$LEAD_ID \
-H "Authorization: Bearer $CLUBBASE_API_KEY"Список віддається сторінками. limit — від 1 до 100, за замовчуванням 25. Відповідь містить nextCursor: передайте його в наступний запит параметром cursor без змін. nextCursor: null означає, що сторінок більше немає.
Мережа рве відповідь частіше, ніж здається. Якщо ви не дочекались відповіді — повторіть той самий запит із тим самим Idempotency-Key: ClubBase поверне початковий результат і не створить другу заявку.
Той самий ключ із іншим тілом — це помилка 409 integration_idempotency_conflict: так видно, що десь загубився стан, замість тихого створення дубля.
Якщо запустити приклад двічі з новим Idempotency-Key і тим самим контактом, відповідь буде 409 integration_lead_already_open. Це не помилка інтеграції: у студії вже є відкрита заявка від цієї людини, і ClubBase не заводить другу. Для перевірки повтору міняйте ключ разом із контактом, а не окремо.
Відповідь на помилку — application/problem+json із полями status, code, detail.
| Код | Ідентифікатор | Коли трапляється |
|---|---|---|
| 400 | integration_invalid_request | Невідоме поле, неправильний контакт, cursor або відсутній UUID Idempotency-Key. |
| 401 | integration_key_invalid | Ключ не передано, він відкликаний, замінений або строк дії минув. |
| 402 | subscription_suspended | Доступ до студії призупинено. |
| 403 | integration_scope_forbidden | Ключ не дозволяє цю операцію. |
| 403 | integration_issuer_forbidden | Поточні права того, хто видав ключ, більше не дозволяють інтеграцію. |
| 404 | integration_lead_not_found | Заявка недоступна у студії цього ключа. |
| 409 | integration_idempotency_conflict | Той самий Idempotency-Key використано з іншими даними. |
| 409 | integration_lead_already_open | Контакт уже має відкриту заявку. |
| 400 | integration_source_invalid | Джерело заявки не належить цій студії або вимкнене. |
| 429 | integration_rate_limited | Зачекайте кількість секунд із Retry-After. |
| 503 | integration_rate_unavailable | Перевірка квоти тимчасово недоступна; запис не виконано. |
429 приходить із заголовком Retry-After — це кількість секунд до наступної спроби. Поважайте її: інакше наступна відповідь буде такою самою.
Опишіть, що має передаватися в ClubBase і в який бік — розберемо ваш сценарій.
Написати команді