Перейти до основного контенту

Zenedu API та вебхуки

Вступ

У цій документації ви дізнаєтеся про те, як використовувати REST API Zenedu для інтеграції нашої платформи з іншими сервісами.

API базується на протоколі HTTP, і всі відповіді повертаються у форматі JSON. Усі запити повинні мати значення Accept: application/json у заголовках.

Базовий URL

Базовий URL для всіх методів API: https://app.zenedu.io/api/v1/

Усі запити повинні мати значення Accept: application/json в заголовках.

Аутентифікація

API Zenedu використовує аутентифікацію за допомогою токена-носія (Bearer token) для забезпечення безпечного доступу до захищених методів. Для взаємодії з API в кожному запиті необхідно включити заголовок авторизації.

Отримання API Токена

Щоб отримати токен API, перейдіть на сторінку облікового запису в розділі API. Токен генерується під час реєстрації та залишається дійсним безстроково.

Дуже важливо не розкривати ваш токен API у загальнодоступному коді чи репозиторіях. Якщо ви підозрюєте, що ваш токен API був скомпрометований, відразу скиньте його та отримайте новий через ту саму сторінку.

Виконання запитів

Після отримання токена API, увімкніть його у ваші запити, використовуючи заголовок Authorization. Встановіть заголовок на Bearer YOUR_API_TOKEN.

Приклад запиту:

curl -X GET "https://app.zenedu.io/api/v1/endpoint" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"


Методи

Bots

Опис

Отримайте список всіх ваших роботів за допомогою цього методу.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Параметри: Немає

  • Результати: Список роботів відсортований за датою створення в порядку зменшення.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bots" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 2,
"name": "Test Bot 2",
"username": "test_bot_2",
"is_active": true,
"created_at": "2023-07-24T07:58:52.000000Z"
},
{
"id": 1,
"name": "Test Bot",
"username": "test_bot",
"is_active": true,
"created_at": "2023-06-23T09:41:34.000000Z"
}
]
}

Subscribers

Опис

Отримайте список усіх підписників за допомогою цього методу. Результати розбито на сторінки по 30 елементів на сторінку.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Результати: Список передплатників відсортовано за датою створення в порядку зменшення.

  • Параметри: Використовуйте параметри per_page та page для керування кількістю результатів на сторінці.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/subscribers?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 3,
"user_id": 1002,
"first_name": "Sarah",
"last_name": "Connor",
"username": "sarah_connor",
"phone": null,
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2023-07-24T14:43:12.000000Z",
"created_at": "2023-07-24T14:43:10.000000Z",
"utm_tags": {
"utm_source": "source",
"utm_medium": "medium",
"utm_campaign": "campaign",
"utm_term": "term",
"utm_content": "content"
},
"custom_fields": {
"Address": "Address",
"Website": "https://zenedu.io"
}
},
{
"id": 2,
"user_id": 1001,
"first_name": "Foo",
"last_name": "Bar",
"username": "foo_bar",
"phone": null,
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2023-07-24T14:43:12.000000Z",
"created_at": "2023-07-24T14:41:44.000000Z",
"utm_tags": [],
"custom_fields": []
},
{
"id": 1,
"user_id": 1000,
"first_name": "John",
"last_name": null,
"username": "john",
"phone": null,
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2023-07-24T14:43:12.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z",
"utm_tags": [],
"custom_fields": []
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/subscribers?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/subscribers?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/subscribers?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/subscribers",
"per_page": 30,
"to": 3,
"total": 3
}
}

Orders

Опис

Отримайте список всіх замовлень за допомогою цього методу. Результати розбито на сторінки по 30 елементів на сторінку.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Результати: Список замовлень відсортований по даті створення в порядку зменшення.

  • Параметри: Використовуйте параметри per_page і page для керування кількістю результатів на сторінці.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/orders?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 2,
"uuid": "9d76cf9c-fdb4-4f7b-98e4-76b96159df93",
"number": 2,
"offer_id": 2,
"offer_name": "Offer 2",
"price": 1,
"currency": "USD",
"subscriber_id": 2,
"type": "one-time",
"payment_system_type": "fondy",
"payment_system_name": "Fondy",
"status_changed_at": "2023-07-24T14:43:52.000000Z",
"created_at": "2023-07-24T14:43:24.000000Z",
"subscriber": {
"id": 1,
"user_id": 1000,
"first_name": "John",
"last_name": null,
"username": "john",
"phone": null,
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2023-07-27T08:39:03.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}
},
{
"id": 1,
"uuid": "a9e58c73-f6a8-413e-b6c5-7af312bf315b",
"number": 1,
"offer_id": 1,
"offer_name": "Offer 1",
"price": 1,
"currency": "USD",
"subscriber_id": 1,
"type": "subscription",
"payment_system_type": "stripe",
"payment_system_name": "Stripe",
"status_changed_at": "2023-07-24T14:42:12.000000Z",
"created_at": "2023-07-24T14:41:52.000000Z",
"subscriber": {
"id": 2,
"user_id": 1001,
"first_name": "Foo",
"last_name": "Bar",
"username": "foo_bar",
"phone": null,
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2023-07-27T08:39:03.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/orders?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/orders?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "« Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/orders?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/orders",
"per_page": 30,
"to": 2,
"total": 2
}
}


Offers

Опис

Отримайте список усіх тарифів за допомогою цього методу. Результати розбито на сторінки по 30 елементів на сторінку.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Результати: Список тарифів відсортовано за датою створення в порядку зменшення.

  • Параметри: Використовуйте параметри per_page та page для керування кількістю результатів на сторінці.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/offers?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 177,
"name": "Intensiv Leonardo",
"price": 10,
"currency": "USD",
"is_active": true,
"is_subscription": false,
"accesses_count": 1,
"description": null,
"landing_name": "Intensiv Leonardo",
"landing_description": "",
"cover_url": null,
"request_contacts": false,
"time_limit_enabled": false,
"usage_limit_enabled": false,
"access_limit_enabled": false,
"created_at": "2024-08-15T10:07:01.000000Z",
“link”: “https://t.me/your_bot?start=pLtr2OMTKTful2rx”,
“landing_link”: “https://app.zenedu.io/l/pLtr2OMTKTful2rx”,
“direct_payment_links”: [
{
“name”: “WayForPay”,
“link”: “https://app.zenedu.io/l/p/MDc142bkGVSZNgiP”
}
]
},
{
"id": 172,
"name": "Coupon with sub",
"price": 100,
"currency": "USD",
"is_active": true,
"is_subscription": true,
"accesses_count": 1,
"description": "<b>Offer:</b> {{offer}} <br><b>Accesses:</b> {{accesses}} <br><b>Price:</b> {{price}}",
"landing_name": "Coupon with sub",
"landing_description": "<b>Accesses:</b> OneTime product",
"cover_url": null,
"request_contacts": false,
"time_limit_enabled": true,
"usage_limit_enabled": true,
"access_limit_enabled": false,
"created_at": "2024-07-24T18:59:46.000000Z",
“link”: “https://t.me/your_bot?start=pLtr2OMTKTful2rx”,
“landing_link”: “https://app.zenedu.io/l/pLtr2OMTKTful2rx”,
“direct_payment_links”: []
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/offers?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/offers?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "&laquo; Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/offers?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next &raquo;",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/offers",
"per_page": 30,
"to": 14,
"total": 14
}
}

Products

Опис

Отримайте список усіх продуктів за допомогою цього методу. Результати розбито на сторінки по 30 елементів на сторінку.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Результати: Список продуктів відсортовано за датою створення в порядку зменшення.

  • Параметри: Використовуйте параметри per_page та page для керування кількістю результатів на сторінці.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/products?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 2,
"name": "Product 2",
"is_active": true,
"subscribers_count": 1,
"steps_count": 5,
"sections_count": 0,
"cover_url": "https://storage.com/image.jpg",
"description": "Product Description",
"restart_enabled": false,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=CODE",
"template_url_enabled": true,
"created_at": "2024-01-22T14:43:24.000000Z"
},
{
"id": 1,
"name": "Product 1",
"is_active": true,
"subscribers_count": 1,
"steps_count": 5,
"sections_count": 0,
"cover_url": "https://storage.com/image1.jpg",
"description": "Product Description",
"restart_enabled": false,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=CODE1",
"template_url_enabled": true,
"created_at": "2024-01-21T14:43:24.000000Z"
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "&laquo; Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next &raquo;",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/products",
"per_page": 30,
"to": 2,
"total": 2
}
}

Funnels

Опис

Отримайте список усіх воронок за допомогою цього методу. Результати розбито на сторінки по 30 елементів на сторінку.

  • Метод: GET

  • Автентифікація: Заголовок Authorization зі значенням Bearer YOUR_API_TOKEN

  • Результати: Список воронок відсортовано за датою створення в порядку зменшення.

  • Параметри: Використовуйте параметри per_page та page для керування кількістю результатів на сторінці.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/funnels?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 2,
"name": "Funnel 2",
"is_active": true,
"subscribers_count": 1,
"steps_count": 5,
"sections_count": 0,
"cover_url": "https://storage.com/image.jpg",
"description": "Funnel Description",
"restart_enabled": false,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=FCODE",
"template_url_enabled": true,
"direct_subscription_access": false,
"created_at": "2024-01-21T14:43:24.000000Z"
},
{
"id": 1,
"name": "Funnel 1",
"is_active": true,
"subscribers_count": 1,
"steps_count": 5,
"sections_count": 0,
"cover_url": "https://storage.com/image.jpg",
"description": "Funnel Description",
"restart_enabled": false,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=FCODE1",
"template_url_enabled": true,
"direct_subscription_access": false,
"created_at": "2024-01-20T14:43:24.000000Z"
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/funnels?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/funnels?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "&laquo; Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/funnels?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next &raquo;",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/funnels",
"per_page": 30,
"to": 2,
"total": 2
}
}

Products

Опис

Отримайте список усіх ваших продуктів для цього бота, використовуючи цю кінцеву точку. Результати виводяться посторінково, по 30 товарів на сторінці.

  • Метод: GET

  • Аутентифікація: Bearer token in headers

  • Результати: The list of products is sorted in descending order by creation date.

  • Параметри: Use the per_page and page parameters to control the number of results per page.

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/1/products?per_page=30&page=1" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 253,
"name": "Assessments Test",
"is_active": true,
"subscribers_count": 1,
"steps_count": 8,
"sections_count": 0,
"cover_url": "https://app.zenedu.io/assets/img/product_blank/3.jpg",
"description": null,
"restart_enabled": false,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=Bmsyk0unsFmyXcGxDovtJrDgOAMjOapI",
"template_url_enabled": true,
"created_at": "2024-06-19T07:20:02.000000Z"
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"last": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 1,
"links": [
{
"url": null,
"label": "&laquo; Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next &raquo;",
"active": false
}
],
"path": "https://app.zenedu.io/api/v1/bot/1/products",
"per_page": 30,
"to": 12,
"total": 12
}
}

Add Subscriber To Funnel

Опис

За допомогою цього методу можна додати підписника в певну воронку.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/subscribers/1/funnels" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN" –form “funnel_id=1”

Приклад відповіді

{
"id": 1,
"user_id": 111222,
"first_name": "Student",
"last_name": null,
"username": null,
"phone": "+111222333444",
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2024-08-19T09:20:38.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}

Add Subscriber To Offer

Опис

Ви можете додати підписника до певного тарифу за допомогою цього методу.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/subscribers/1/offers" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN" –form “offer_id=1”

Приклад відповіді

{
"id": 1,
"user_id": 111222,
"first_name": "Student",
"last_name": null,
"username": null,
"phone": "+111222333444",
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2024-08-19T09:20:38.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}

Revoke Subscriber Offer Access

Опис

Ви можете видалити підписника з певного тарифу за допомогою цього методу

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/{botId}/subscribers/{subscriberId}/offers/revoke" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
--form "offer_id=1"

Приклад відповіді

{
"id": 1,
"user_id": 111222,
"first_name": "Student",
"last_name": null,
"username": null,
"phone": "+111222333444",
"email": null,
"notes": null,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2024-08-19T09:20:38.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}


Add Tags To Subscriber

Опис

Ви можете додати теги до підписника за допомогою цього методу.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/subscribers/1/tags" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN" –form “tags[]=’tag1’” –form “tags[]=’tag2’”

Приклад відповіді

{
"id": 1,
"user_id": 111222,
"first_name": "Student",
"last_name": null,
"username": null,
"phone": "+111222333444",
"email": null,
"notes": null,
"tags": "tag1,tag2",
"is_active": true,
"is_blocked": false,
"last_active_at": "2024-08-19T09:20:38.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}

Add Notes To Subscriber

Опис

Ви можете додати нотатки до передплатника за допомогою цього методу.

Приклад запиту

curl -X POST "http://zenedu.test/api/v1/bot/{botId}/subscribers/{subscriberId}/notes" -H "Authorization: Bearer YOUR_API_TOKEN" -H "Accept: application/json" --form "notes=Any notes that you need"

Приклад відповіді

{
"id": 1,
"user_id": 111222,
"first_name": "Student",
"last_name": null,
"username": null,
"phone": "+111222333444",
"email": null,
"notes": ”Any notes that you need”,
"tags": null,
"is_active": true,
"is_blocked": false,
"last_active_at": "2025-12-19T09:20:38.000000Z",
"created_at": "2023-06-23T09:51:07.000000Z"
}

Create Offer Link

Опис

Створюйте посилання на тариф, щоб підписники могли отримати доступ до тарифу без оплати.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/links/offer" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN" –form “offer_id=1”

Приклад відповіді

{
"status": "success",
"data": {
"link": "https://t.me/bot_username?start=LINK",
"landing_link": "https://app.zenedu.io/l/LINK"
}
}

Create Funnel Link

Опис

Створіть посилання на воронку для підписників.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/links/funnel" -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_TOKEN" –form “funnel_id=1”

Приклад відповіді

{
"status": "success",
"data": {
"link": "https://t.me/bot_username?start=LINK",
"landing_link": "https://app.zenedu.io/l/LINK"
}
}

Send Message To Subscriber

Опис

За допомогою цього методу можна надіслати текстове повідомлення підписнику.

Приклад запиту

curl -X POST "https://app.zenedu.io/api/v1/bot/1/subscribers/1/messages" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{"text":"Hello from API"}'

Приклад відповіді

{
"data": {
"id": 218,
"telegram_message_id": 5722,
"text": "Hello from API",
"created_at": "2026-03-04T10:30:12+00:00"
}
}

Можливі помилки

  • 403 — Not authorized

  • 404 — Bot або Subscriber не знайдено

  • 422 — Subscriber blocked/inactive або некоректний `reply_to_message_id`

  • 502 — Failed to send message

Get Message File

Опис

За допомогою цього методу можна отримати файл (вкладення) з повідомлення підписника.

Важливо:

- Посилання на файл у webhook (`file.url`) не є публічним.

- Для завантаження файлу завжди передавайте `Authorization: Bearer YOUR_API_TOKEN`.

Приклад запиту

curl -L "https://app.zenedu.io/api/v1/bot/13/file/217" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
--output file.bin

Можливі помилки

  • 403 — немає доступа до бота

  • 404 — повідомлення не знайдено / файл відсутній

  • 413 — файл занадто великий

  • 502 — помилка авторизації у file provider

Воронки підписника (Subscriber Funnels)

Опис

Отримати список воронок, на які підписаний конкретний підписник бота.

  • Метод: GET

  • Автентифікація: Bearer-токен у заголовках

  • Параметри шляху:

    • bot_id — ID бота

    • student_id — ID підписника

  • Параметри запиту: відсутні

  • Результат: повертаються лише воронки (без продуктів), на які підписаний підписник. Підписник має належати вказаному боту, інакше буде повернуто 404.

Можливі помилки

  • 401 — відсутній або некоректний токен

  • 403 — у користувача немає доступу до вказаного бота

  • 404 — підписник не належить вказаному боту

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/123/subscribers/456/funnels" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 12,
"name": "Onboarding Funnel",
"status": "active",
"stop_reason": null,
"steps_total": 5,
"steps_completed": 3,
"access": true,
"access_until": null,
"offer_id": null,
"subscribed_at": "2026-04-01T12:34:56.000000Z"
}
]
}

Поля відповіді

  • id — ідентифікатор воронки

  • name — назва воронки

  • status — статус підписки на воронку (наприклад, active, stopped)

  • stop_reason — причина зупинки (якщо є), інакше null

  • steps_total — загальна кількість активних кроків воронки

  • steps_completed — кількість кроків, вже пройдених підписником

  • access — чи має підписник доступ до воронки (true/false)

  • access_until — дата закінчення доступу (null, якщо безстроково)

  • offer_id — ID офера, через який підписника було додано (якщо застосовно)

  • subscribed_at — дата та час підписки на воронку

Продукти підписника (Subscriber Products)

Опис

Отримати список продуктів, до яких підписник має підписку/доступ.

  • Метод: GET

  • Автентифікація: Bearer-токен у заголовках

  • Параметри шляху:

    • bot_id — ID бота

    • student_id — ID підписника

  • Параметри запиту: відсутні

  • Результат: повертаються лише продукти (без воронок), до яких прив'язаний підписник. Підписник має належати вказаному боту, інакше буде повернуто 404.

Можливі помилки

  • 401 — відсутній або некоректний токен

  • 403 — у користувача немає доступу до вказаного бота

  • 404 — підписник не належить вказаному боту

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/123/subscribers/456/products" \   -H "Accept: application/json" \   -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 34,
"name": "Advanced Course",
"status": "active",
"stop_reason": null,
"steps_total": 10,
"steps_completed": 4,
"access": true,
"access_until": "2026-12-31T23:59:59.000000Z",
"offer_id": 7,
"subscribed_at": "2026-04-05T09:12:00.000000Z"
}
]
}

Поля відповіді

  • id — ідентифікатор продукту

  • name — назва продукту

  • status — статус підписки на продукт (наприклад, active, stopped)

  • stop_reason — причина зупинки (якщо є), інакше null

  • steps_total — загальна кількість активних кроків продукту

  • steps_completed — кількість кроків, вже пройдених підписником

  • access — чи має підписник доступ до продукту (true/false)

  • access_until — дата закінчення доступу (null, якщо безстроково)

  • offer_id — ID офера, за яким було оформлено доступ (якщо застосовно)

  • subscribed_at — дата та час оформлення підписки на продукт

Підписники продукту (Product Subscribers)

Опис

Отримати список підписників конкретного продукту зі статусом та терміном їхнього доступу.

  • Метод: GET

  • Автентифікація: Bearer-токен у заголовках

  • Параметри шляху:

    • bot_id — ID бота

    • product_id — ID продукту

  • Параметри запиту (опціональні):

    • accesstrue або false; фільтр за наявністю активного доступу

    • per_page — кількість записів на сторінці, за замовчуванням 30

    • page — номер сторінки

  • Результат: результати пагіновані та відсортовані за датою оформлення підписки (спочатку нові). Продукт має належати вказаному боту, інакше буде повернуто 404. Ендпоінт працює лише для продуктів; для воронок буде повернуто 404.

Можливі помилки

  • 401 — відсутній або некоректний токен

  • 403 — у користувача немає доступу до вказаного бота

  • 404 — продукт не належить вказаному боту або передано ID воронки

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/123/products/34/subscribers?access=true&per_page=30" \   -H "Accept: application/json" \   -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 456,
"user_id": "12345678",
"first_name": "John",
"last_name": "Doe",
"username": "johndoe",
"phone": "+10000000000",
"email": "[email protected]",
"notes": "VIP-подписчик",
"tags": "vip,paid",
"is_active": true,
"is_blocked": false,
"last_active_at": "2026-04-30T08:11:22.000000Z",
"created_at": "2026-04-05T09:00:00.000000Z",
"utm_tags": { "source": "fb", "campaign": "spring_2026" },
"custom_fields": { "city": "Kyiv", "age": "30" },
"access": true,
"access_until": "2026-12-31T23:59:59.000000Z"
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/123/products/34/subscribers?page=1",
"last": "https://app.zenedu.io/api/v1/bot/123/products/34/subscribers?page=10",
"prev": null,
"next": "https://app.zenedu.io/api/v1/bot/123/products/34/subscribers?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 10,
"per_page": 30,
"to": 30,
"total": 287
}
}

Поля відповіді

  • id — ID підписника

  • user_id — Telegram user ID

  • first_name, last_name, username — ім'я, прізвище, нік

  • phone, email — контакти підписника (можуть бути null)

  • notes — нотатки по підписнику

  • tags — теги через кому

  • is_active, is_blocked — прапорці активності та блокування бота

  • last_active_at — дата останньої активності

  • created_at — дата підписки на бота

  • utm_tags — об'єкт з UTM-мітками (type → value)

  • custom_fields — об'єкт з користувацькими полями (name → value)

  • access — чи має підписник доступ до продукту (true/false)

  • access_until — дата закінчення доступу (null, якщо безстроково)

Підписники воронки (Funnel Subscribers)

Опис

Отримати список підписників конкретної воронки зі статусом та терміном їхнього доступу.

  • Метод: GET

  • Автентифікація: Bearer-токен у заголовках

  • Параметри шляху:

    • bot_id — ID бота

    • funnel_id — ID воронки

  • Параметри запиту (опціональні):

    • accesstrue або false; фільтр за наявністю активного доступу

    • per_page — кількість записів на сторінці, за замовчуванням 30

    • page — номер сторінки

  • Результат: результати пагіновані та відсортовані за датою підписки (спочатку нові). Воронка має належати вказаному боту, інакше буде повернуто 404. Ендпоінт працює лише для воронок; для продуктів буде повернуто 404.

Можливі помилки

  • 401 — відсутній або некоректний токен

  • 403 — у користувача немає доступу до вказаного бота

  • 404 — воронка не належить вказаному боту або передано ID продукту

Приклад запиту

access=true&per_page=30" \   -H "Accept: application/json" \   -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"id": 456,
"user_id": "12345678",
"first_name": "John",
"last_name": "Doe",
"username": "johndoe",
"phone": "+10000000000",
"email": "[email protected]",
"notes": null,
"tags": "lead",
"is_active": true,
"is_blocked": false,
"last_active_at": "2026-04-30T08:11:22.000000Z",
"created_at": "2026-04-05T09:00:00.000000Z",
"utm_tags": { "source": "fb" },
"custom_fields": {},
"access": true,
"access_until": null
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/123/funnels/12/subscribers?page=1",
"last": "https://app.zenedu.io/api/v1/bot/123/funnels/12/subscribers?page=10",
"prev": null,
"next": "https://app.zenedu.io/api/v1/bot/123/funnels/12/subscribers?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 10,
"per_page": 30,
"to": 30,
"total": 287
}
}

Поля відповіді

  • id — ID підписника

  • user_id — Telegram user ID

  • first_name, last_name, username — ім'я, прізвище, нік

  • phone, email — контакти підписника (можуть бути null)

  • notes — нотатки по підписнику

  • tags — теги через кому

  • is_active, is_blocked — прапорці активності та блокування бота

  • last_active_at — дата останньої активності

  • created_at — дата підписки на бота

  • utm_tags — об'єкт з UTM-мітками (type → value)

  • custom_fields — об'єкт з користувацькими полями (name → value)

  • access — чи має підписник доступ до воронки (true/false)

  • access_until — дата закінчення доступу (null, якщо безстроково)

Підписники тарифу (Offer Subscribers)

Опис

Отримати список підписників, яким наразі відкрито активний доступ через вказаний тариф (офер). Список ID тарифів можна отримати через ендпоінт GET /api/v1/bot/{bot_id}/offers.

  • Метод: GET

  • Автентифікація: Bearer-токен у заголовках

  • Параметри шляху:

    • bot_id — ID бота

    • offer_id — ID тарифу (офера)

  • Параметри запиту (опціональні):

    • per_page — кількість записів на сторінці, за замовчуванням 30

    • page — номер сторінки

  • Результат: повертаються лише підписники з активним доступом за вказаним тарифом. Кожен підписник представлений у списку один раз, навіть якщо тариф відкриває доступ до кількох продуктів/воронок. Термін активного доступу передається у полі access_until. Тариф має належати вказаному боту, інакше буде повернуто 404. Сортування — за датою реєстрації підписника в боті (спочатку нові).

Можливі помилки

  • 401 — відсутній або некоректний токен

  • 403 — у користувача немає доступу до вказаного бота

  • 404 — тариф не належить вказаному боту

Приклад запиту

curl -X GET "https://app.zenedu.io/api/v1/bot/123/offers/55/subscribers?per_page=30" \   -H "Accept: application/json" \   -H "Authorization: Bearer YOUR_API_TOKEN"

Приклад відповіді

{
"data": [
{
"id": 456,
"user_id": "12345678",
"first_name": "John",
"last_name": "Doe",
"username": "johndoe",
"phone": "+10000000000",
"email": "[email protected]",
"notes": "VIP-подписчик",
"tags": "vip,paid",
"is_active": true,
"is_blocked": false,
"last_active_at": "2026-04-30T08:11:22.000000Z",
"created_at": "2026-04-05T09:00:00.000000Z",
"utm_tags": { "source": "fb", "campaign": "spring_2026" },
"custom_fields": { "city": "Kyiv", "age": "30" },
"access": true,
"access_until": "2026-12-31T23:59:59.000000Z"
}
],
"links": {
"first": "https://app.zenedu.io/api/v1/bot/123/offers/55/subscribers?page=1",
"last": "https://app.zenedu.io/api/v1/bot/123/offers/55/subscribers?page=5",
"prev": null,
"next": "https://app.zenedu.io/api/v1/bot/123/offers/55/subscribers?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"per_page": 30,
"to": 30,
"total": 142
}
}

Поля відповіді

  • id — ID підписника

  • user_id — Telegram user ID

  • first_name, last_name, username — ім'я, прізвище, нік

  • phone, email — контакти підписника (можуть бути null)

  • notes — нотатки по підписнику

  • tags — теги через кому

  • is_active, is_blocked — прапорці активності та блокування бота

  • last_active_at — дата останньої активності

  • created_at — дата підписки на бота

  • utm_tags — об'єкт з UTM-мітками (type → value)

  • custom_fields — об'єкт з користувацькими полями (name → value)

  • access — завжди true (у видачу потрапляють лише активні)

  • access_until — дата закінчення активної підписки за цим тарифом (null, якщо безстроково)


Вебхуки

Вебхук — це спосіб, за якого Zenedu при настанні певної події (наприклад, нове замовлення або підписка) надсилає HTTP-запит на зовнішній URL, щоб повідомити інший сервіс.

Додати вебхуки можна в розділі Налаштування проєкту → API та вебхуки.
Там ви обираєте подію, при настанні якої спрацьовуватиме вебхук.

Події, які можуть відстежуватися:

  • створено нове замовлення (order.created)

  • змінено статус замовлення (order.status.changed)

  • додано підписника (subscriber.added)

  • підписника додано до продукту (product.subscriber.added)

  • підписника додано до воронки (funnel.subscriber.added)

  • створено контакт підписника (subscriber.contact.created)

  • підписка скасована (subscription.cancelled)

  • створено тег (tag.added)

  • отримано повідомлення від підписника (message.received)

  • відправлено повідомлення підписнику (message.sent)

Приклад payload:

{
"_id": "01JNV....",
"event": "message.received",
"description": "My webhook",
"timestamp": "2026-03-04T10:42:00+00:00",
"data": {
"botId": 1,
"id": 2,
"telegram_message_id": 123,
"subscriber": {
"id": 44,
"user_id": 123456789,
"first_name": "John",
"last_name": null,
"username": "john",
"phone": null,
"email": null,
"notes": null
},
"text": "Hi",
"outgoing": false,
"file": {
"type": "photo",
"url": "https://app.zenedu.io/api/v1/bot/1/file/50",
"title": null,
"size": null,
"duration": null
},
"reply_to_message_id": null,
"created_at": "2026-03-04T10:41:55+00:00"
}
}

Ви отримали відповідь на своє запитання?