API-ключі
API-ключ - це облікові дані вашого акаунта для Leadgram API. Керуються вони в налаштуваннях: тут ви створюєте ключ, даєте йому ім'я і відкликаєте, коли потрібно. Розберемо, що ключ уміє і чого не вміє, як його створити, як надіслати ним подію і як його ротувати чи відкликати.
Навіщо потрібні API-ключі
API-ключ дозволяє зовнішньому інструменту чи скрипту репортити конверсії в Leadgram від вашого імені, не передаючи йому логін чи сесійну куку. Це механізм для server-to-server інтеграцій: партнерська мережа, CRM рекламодавця чи власний скрипт надсилають подію в момент депозиту, а не людина клікає в дашборді. Для використання в браузері ключ не призначений.
Створення ключа
- Відкрийте Налаштування → API-ключі.
- Дайте ключу назву, за якою впізнаєте його пізніше, наприклад «Keitaro» чи «скрипт звітів» - це єдине поле у формі.
- Натисніть Створити ключ. Секрет показується рівно один раз, одразу після створення, у блоці для копіювання - скопіюйте його зараз же. Ні таблиця ключів, ні жоден запит більше не покажуть повне значення - зберігаються лише назва і дата створення.

Що ключ може і чого не може
Ключ прив'язаний до вашого акаунта і працює в межах вашої організації, але повноцінним доступом до дашборда він не є:
- Можна: надсилати події на
POST /api/events. Це єдине, що ключ відкриває - і на запис, і на читання. - Не можна: усе інше - створювати й змінювати кампанії, флоу, ботів, правила постбеків, учасників команди, білінг. Руйнівні операції ключем не виконуються в принципі, тож ключ, що витік, не дає знести ваш акаунт.
- Читати дані ключем теж не можна. Кліки, звіти, кампанії, підписники, події, білінг - усі ці ендпоінти й усі сторінки дашборда сприймають ключ як відсутність доступу. Запит із ключем будь-куди, крім
POST /api/events, отримує403або401, незалежно від того, що власнику ключа доступно в браузері.
Розподілу прав за учасниками команди в поточному інтерфейсі немає: якщо доступ до інтеграцій потрібен кільком людям чи системам, створіть ключ на кожну окремо - так ви відрізните їх у таблиці і зможете відкликати один, не зламавши інші.
Надсилання події: POST /api/events
Ключ передається в заголовку x-api-key:
curl -X POST https://leadgram.org/api/events \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"clickId": "tz4k9m2p1xq7v0b3n8s6d5fg",
"type": "deposit",
"payout": 42.50,
"nonce": "crm-conversion-8813",
"payload": { "telegram_user_id": 123456789 }
}'
Поля тіла:
clickId- обов'язкове. Id кліку, який видав Leadgram: це те значення, що приходить до вас із макроса{click_id}в URL оферу, редиректу кампанії чи лендингу. Клік чужої організації не підійде.type- обов'язкове, одне з:click,land,bot_start,channel_join,join_request,first_dm,miniapp_launch,lead,registration,deposit,ftd,purchase,subscription_renewed,subscription_cancelled,custom_1-custom_8. Приймати тип і виробляти його - різні речі: уclick,landіfirst_dmусередині Leadgram продюсера немає, вони існують лише тому, що ви їх надіслали; а вbot_start,channel_join,join_request,miniapp_launch,purchaseй обохsubscription_*продюсер усередині Leadgram уже є - надішлете їх вручну, поруч з автоматичною з'явиться друга подія. Єдиний виняток -bot_start, і він з умовами: ваш виклик зійдеться з уже записаним стартом, лише якщо несе telegram user id уpayload(без нього - 422,bot_start_missing_telegram_user_id) і в запиті є чим назвати бота, якого запустила людина -payload.bot_usernameчиpayload.bot_id, а якщо їх немає, то бот названогоclickId. У кліку зі звичайної редирект-кампанії бота немає, як і в кліку, чийого бота видалили: такий виклик безbot_username/bot_idпару назвати не може і запишеться окремою подією. Другого списання це вам не коштує - Leadgram списує один раз за людину на робочий простір, а Telegram-акаунт упізнає цю людину завжди, тож дубль безкоштовний, - але в Meta піде другий Lead з іншимevent_id, звести який жодна дедуплікація вже не зможе, і оптимізатор вашої кампанії вивчить, що одна людина сконвертувалася двічі. Подробиці в Подіях і конверсіях.payout- необов'язкове. Виплата за цією конверсією: число від 0 до 1 000 000 (рядок на кшталт"42.50"теж приймається, від'ємні значення відхиляються). Якщо поле не передати, конверсія успадкує «Виплату» оферу, прив'язаного до кліку.nonce- необов'язкове, від 1 до 128 символів. Ключ ідемпотентності: id події виводиться з трійкиclickId+type+nonce, тож повтор того самого запиту не створить другий рядок і не задвоїть ні списання, ні постбеки, ні конверсії в рекламних кабінетах. Зворотний бік: дві справді різні конверсії одного кліку (другий депозит) мають надіслати різнийnonce. Замість поля можна передати заголовокIdempotency-Key- він підхоплюється як запасне джерело того самого значення.payload- необов'язковий об'єкт довільної форми, але три ключі всередині нього платформа розбирає окремо. Заtelegram_user_idрахується білінг і працює дедуплікація постбеків за користувачем.bot_usernameіbot_idстосуються лишеbot_startі називають бота, якого людина справді запустила: @ім'я (зі знаком@чи без) або внутрішній id бота в Leadgram. Обидва необов'язкові, але їх варто надсилати, щойно у вас більше одного бота: без них пара спирається на бота з кліку, а це здогадка, і вона хибна, коли клік прийшов із кампанії з іншим ботом. Ім'я, яке не належить вашим ботам, отримує403, а не тихий відкат до здогадки.
Успішна відповідь - 201 зі створеним рядком події. 400 означає, що тіло не пройшло валідацію, 403 - клік не знайдено або він належить іншій організації, 401 - ключ не прийнято. Ендпоінт тримає 300 запитів на хвилину на організацію; понад це приходить 429 із заголовком Retry-After.
Ротація і відкликання
Механізму «перегенерувати на місці» немає - секрет ключа фіксований на весь час його життя. Щоб ротувати ключ: спочатку створіть новий, підставте його в інтеграцію, переконайтеся, що події проходять, і лише потім відкличте старий ключ у таблиці, щоб нічого не лишилося працювати на ньому. Відкликання відбувається миттєво - натисніть Відкликати у рядку ключа, і він одразу перестає працювати, без періоду на переїзд, тому спочатку перемикайтесь, потім відкликайте, а не навпаки.
Типові граблі
- Секрет показується один раз, при створенні. Закрили діалог, не скопіювавши, - він втрачений назавжди: відкликайте ключ і створюйте новий.
- Ключ пише конверсії у вашу організацію, тож ключ, що витік, - це чужі події у вашій аналітиці й у ваших списаннях. Читати дані і чіпати акаунт ним не можна, але це все одно ваші гроші й ваші звіти: не вставляйте ключ у чат підтримки, публічний репозиторій чи спільний скрипт, а якщо витік - ротуйте.
- Забутий
nonceна ретраях. Без нього повторне надсилання тієї самої події схлопнеться в один рядок, і це добре, але друга справжня конверсія по тому самому кліку без новогоnonceвтратиться так само. - Чужий чи застарілий
clickIdдає403, а не тиху успішну відповідь: подія нікуди не запишеться, і мовчання у звітах означатиме саме це. - У відкликання немає скасування і немає затримки: будь-яка інтеграція, яка досі використовує старий ключ, одразу починає падати.
- Називайте ключі за тим, куди вони підключені (наприклад «Keitaro prod»), щоб точно знати, який відкликати, коли щось зламалося, а не гадати за голою датою створення.