Skip to main content

Zenedu API & Webhooks

Introduction

In this documentation, you will learn how to use Zenedu's REST API to integrate our platform with other services

The API is based on the HTTP protocol and all responses are returned in JSON format. All requests must have Accept: application/json key-value in headers.

Base URL

The base URL for all API endpoints is: https://app.zenedu.io/api/v1/

All requests must have Accept: application/json key-value in headers.

Authentication

The Zenedu API uses Bearer token authentication to ensure secure access to protected endpoints. To interact with the API, you must include an authorization header with each request.

Obtaining an API Token

To obtain your API token, navigate to the API section in your account page. The token is generated during registration and remains valid indefinitely.

It is of utmost importance not to expose your API token in publicly accessible code or repositories. If you suspect any compromise of your API token, reset it immediately and acquire a new one through the same page.

Making Authenticated Requests

Once you have obtained your API token, include it in your requests using the Authorization header. Set the value of the header to Bearer YOUR_API_TOKEN.

Example request:

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


Endpoints

Bots

Description

Retrieve a list of all your bots using this endpoint.

  • Method: GET

  • Authentication: Bearer token in headers

  • Parameters: None

  • Results: The list of bots is sorted in descending order by creation date.

Example request

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

Example response

 {
"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

Description

Get a list of all your subscribers for given bot using this endpoint. The results are paginated with 30 items per page.

  • Method: GET

  • Authentication: Bearer token in headers

  • Parameters: Use the per_page and page parameters to control the number of results per page.

  • Results: The list of subscribers is sorted in descending order by creation date.

Example request

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"

Example response

{
"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

Description

Obtain a list of all your orders for given bot using this endpoint. The results are paginated with 30 items per page.

  • Method: GET

  • Authentication: Bearer token in headers

  • Results: The list of orders is sorted in descending order by creation date.

  • Parameters: Use the per_page and page parameters to control the number of results per page.

Example request

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"

Example response

{
"data": [
{
"id": 2,
"uuid": "9d76cf9c-fdb4-4f7b-98e4-76b96159df93",
"number": 2,
"offer_id": 2,
"offer_name": "Offer 2",
"price": 1,
"currency": "USD",
"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

Description

Obtain a list of all your offers for a given bot using this endpoint. The results are paginated with 30 items per page.

  • Method: GET

  • Authentication: Bearer token in headers

  • Results: The list of offers is sorted in descending order by creation date.

  • Parameters: Use the per_page and page parameters to control the number of results per page.

Example request

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"

Example response

{
"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"
},
{
"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"
}
],
"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
}
}

Funnels

Description

Obtain a list of all your funnels for a given bot using this endpoint. The results are paginated with 30 items per page.

  • Method: GET

  • Authentication: Bearer token in headers

  • Results: The list of funnels is sorted in descending order by creation date.

  • Parameters: Use the per_page and page parameters to control the number of results per page.

Example request

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"

Example response

{
"data": [
{
"id": 263,
"name": "Intensiv Leonardo",
"is_active": true,
"subscribers_count": 1,
"steps_count": 1,
"sections_count": 0,
"cover_url": "https://app.zenedu.io/assets/img/product_blank/3.jpg",
"description": null,
"restart_enabled": true,
"autodelete_steps_enabled": true,
"template_url": "https://app.zenedu.io/bots?template=oMzBCK7MZqEwzrTbczlb9YjEIPUS9cK4",
"template_url_enabled": true,
"created_at": "2024-08-15T10:05:58.000000Z",
"direct_subscription_access": false
}
],
"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": 16,
"total": 16
}
}

Products

Description

Obtain a list of all your products for a given bot using this endpoint. The results are paginated with 30 items per page.

  • Method: GET

  • Authentication: Bearer token in headers

  • Results: The list of products is sorted in descending order by creation date.

  • Parameters: Use the per_page and page parameters to control the number of results per page.

Example request

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"

Example response

{
"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

Description

You can add a subscriber to a specific funnel using this method.

Example request

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”

Example response

{
"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

Description

You can add a subscriber to a specific offer using this method.

Example request

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”

Example response

{
"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

Description

You can revoke a subscriber’s access to a specific offer using this method

Example request

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"

Example response

{
"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

Description

You can add tags to a subscriber using this method.

Request example

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’”

Response example

{
"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

Description

You can add notes to subscriber using this method.

Request example

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"

Response example

{
"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

Description

Create offer links for subscribers to get the offer without payment.

Request example

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”

Response example

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

Create Funnel Link

Description

Create funnel links for subscribers.

Request example

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”

Response example

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

Send Message To Subscriber

Description

This method can be used to send a text message to a subscriber.

Request example

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"}'

Response example

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

Possible errors

  • 403 — Not authorized

  • 404 — Bot or Subscriber not found

  • 422 — Subscriber blocked/inactive or incorrect `reply_to_message_id`

  • 502 — Failed to send message

Get Message File

Description

This method allows you to retrieve a file (attachment) from a subscriber's message.

Important:

- The link to the file in the webhook (`file.url`) is not public.

- Always pass `Authorization: Bearer YOUR_API_TOKEN` to download the file.

Method: GET

Authentication: Bearer token in headers

Request example

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

Possible errors

  • 403 — no access to the bot

  • 404 — message not found / file missing

  • 413 — file too large

  • 502 — authorization error with file provider

Subscriber Funnels

Description

Get a list of funnels that a specific bot subscriber is enrolled in.

  • Method: GET

  • Authentication: Bearer token in headers

  • Path parameters:

    • bot_id — bot ID

    • student_id — subscriber ID

  • Query parameters: none

  • Result: returns only funnels (without products) that the subscriber is enrolled in. The subscriber must belong to the specified bot, otherwise a 404 will be returned.

Possible errors

  • 401 — missing or invalid token

  • 403 — the user does not have access to the specified bot

  • 404 — the subscriber does not belong to the specified bot

Request example

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

Response example

{
"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"
}
]
}

Response fields

  • id — funnel identifier

  • name — funnel name

  • status — funnel subscription status (e.g. active, stopped)

  • stop_reason — reason for stopping (if any), otherwise null

  • steps_total — total number of active steps in the funnel

  • steps_completed — number of steps already completed by the subscriber

  • access — whether the subscriber has access to the funnel (true/false)

  • access_until — access expiration date (null if indefinite)

  • offer_id — ID of the offer through which the subscriber was added (if applicable)

  • subscribed_at — date and time of subscription to the funnel

Subscriber Products

Description

Get a list of products that a subscriber has a subscription to or access to.

  • Method: GET

  • Authentication: Bearer token in headers

  • Path parameters:

    • bot_id — bot ID

    • student_id — subscriber ID

  • Query parameters: none

  • Result: returns only products (without funnels) that the subscriber is linked to. The subscriber must belong to the specified bot, otherwise a 404 will be returned.

Possible errors

  • 401 — missing or invalid token

  • 403 — the user does not have access to the specified bot

  • 404 — the subscriber does not belong to the specified bot

Request example

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

Response example

{
"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"
}
]
}

Response fields

  • id — product identifier

  • name — product name

  • status — product subscription status (e.g. active, stopped)

  • stop_reason — reason for stopping (if any), otherwise null

  • steps_total — total number of active steps in the product

  • steps_completed — number of steps already completed by the subscriber

  • access — whether the subscriber has access to the product (true/false)

  • access_until — access expiration date (null if indefinite)

  • offer_id — ID of the offer through which access was granted (if applicable)

  • subscribed_at — date and time of subscription to the product

Product Subscribers

Description

Get a list of subscribers for a specific product along with their access status and expiration.

  • Method: GET

  • Authentication: Bearer token in headers

  • Path parameters:

    • bot_id — bot ID

    • product_id — product ID

  • Query parameters (optional):

    • accesstrue or false; filter by active access

    • per_page — number of records per page, default 30

    • page — page number

  • Result: results are paginated and sorted by subscription date (newest first). The product must belong to the specified bot, otherwise a 404 will be returned. This endpoint works only for products; a 404 will be returned for funnels.

Possible errors

  • 401 — missing or invalid token

  • 403 — the user does not have access to the specified bot

  • 404 — the product does not belong to the specified bot, or a funnel ID was provided

Request example

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"

Response example

{
"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
}
}

Response fields

  • id — subscriber ID

  • user_id — Telegram user ID

  • first_name, last_name, username — first name, last name, username

  • phone, email — subscriber contacts (may be null)

  • notes — notes about the subscriber

  • tags — comma-separated tags

  • is_active, is_blocked — activity and bot block flags

  • last_active_at — date of last activity

  • created_at — date of subscription to the bot

  • utm_tags — object with UTM tags (type → value)

  • custom_fields — object with custom fields (name → value)

  • access — whether the subscriber has access to the product (true/false)

  • access_until — access expiration date (null if indefinite)

Funnel Subscribers

Description

Get a list of subscribers for a specific funnel along with their access status and expiration.

  • Method: GET

  • Authentication: Bearer token in headers

  • Path parameters:

    • bot_id — bot ID

    • funnel_id — funnel ID

  • Query parameters (optional):

    • accesstrue or false; filter by active access

    • per_page — number of records per page, default 30

    • page — page number

  • Result: results are paginated and sorted by subscription date (newest first). The funnel must belong to the specified bot, otherwise a 404 will be returned. This endpoint works only for funnels; a 404 will be returned for products.

Possible errors

  • 401 — missing or invalid token

  • 403 — the user does not have access to the specified bot

  • 404 — the funnel does not belong to the specified bot, or a product ID was provided

Request example

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

Response example

{
"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
}
}

Response fields

  • id — subscriber ID

  • user_id — Telegram user ID

  • first_name, last_name, username — first name, last name, username

  • phone, email — subscriber contacts (may be null)

  • notes — notes about the subscriber

  • tags — comma-separated tags

  • is_active, is_blocked — activity and bot block flags

  • last_active_at — date of last activity

  • created_at — date of subscription to the bot

  • utm_tags — object with UTM tags (type → value)

  • custom_fields — object with custom fields (name → value)

  • access — whether the subscriber has access to the funnel (true/false)

  • access_until — access expiration date (null if indefinite)

Offer Subscribers

Description

Get a list of subscribers who currently have active access through the specified offer. The list of offer IDs can be retrieved via the GET /api/v1/bot/{bot_id}/offers endpoint.

  • Method: GET

  • Authentication: Bearer token in headers

  • Path parameters:

    • bot_id — bot ID

    • offer_id — offer ID

  • Query parameters (optional):

    • per_page — number of records per page, default 30

    • page — page number

  • Result: returns only subscribers with active access under the specified offer. Each subscriber appears in the list once even if the offer grants access to multiple products or funnels. The active access expiration is returned in the access_until field. The offer must belong to the specified bot, otherwise a 404 will be returned. Results are sorted by the subscriber's registration date in the bot (newest first).

Possible errors

  • 401 — missing or invalid token

  • 403 — the user does not have access to the specified bot

  • 404 — the offer does not belong to the specified bot

Request example

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"

Response example

{
"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
}
}

Response fields

  • id — subscriber ID

  • user_id — Telegram user ID

  • first_name, last_name, username — first name, last name, username

  • phone, email — subscriber contacts (may be null)

  • notes — notes about the subscriber

  • tags — comma-separated tags

  • is_active, is_blocked — activity and bot block flags

  • last_active_at — date of last activity

  • created_at — date of subscription to the bot

  • utm_tags — object with UTM tags (type → value)

  • custom_fields — object with custom fields (name → value)

  • access — always true (only active subscribers are returned)

  • access_until — active subscription expiration date for this offer (null if indefinite)


Webhooks

A webhook is a mechanism where Zenedu sends an HTTP request to an external URL when a specific event occurs (for example, a new order or a subscription) to notify another service.

You can add webhooks in Workspace Settings → API & Webhooks.
There, you select the event that will trigger the webhook.

Events that can be tracked:

  • order created (order.created)

  • order status updated (order.status.changed)

  • new subscriber (subscriber.added)

  • new subscriber contact created (subscriber.contact.created)

  • new tag created (tag.added)

  • subscriber added to product (product.subscriber.added)

  • subscriber added to funnel (funnel.subscriber.added)

  • subscription cancelled (subscription.cancelled)

  • message received from subscriber (message.received)

  • message sent to subscriber (message.sent)


Payload Sample:

{
"_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"
}
}
Did this answer your question?