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_pageandpageparameters 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_pageandpageparameters 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": "« Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/offers?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"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": "« Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/funnels?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"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": "« Previous",
"active": false
},
{
"url": "https://app.zenedu.io/api/v1/bot/1/products?page=1",
"label": "1",
"active": true
},
{
"url": null,
"label": "Next »",
"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.
Method: POST
Authentication: Bearer token in headers
Parameters: funnel_id in form data.
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.
Method: POST
Authentication: Bearer token in headers
Parameters: offer_id in form data.
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
Method: POST
Authentication: Bearer token in headers
Parameters: offer_id in form data.
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.
Method: POST
Authentication: Bearer token in headers
Parameters: tags[] in form data.
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.
Method: POST
Authentication: Bearer token in headers
Parameters: notes in form data.
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.
Method: POST
Authentication: Bearer token in headers
Parameters: in form data:
offer_id - required
usage_limit
expire_date
create_order
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.
Method: POST
Authentication: Bearer token in headers
Parameters: in form data:
funnel_id - required
name - required
expire_date
request_email
request_phone
tags
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.
Method: POST
Authentication: Bearer token in headers
Parameters:
- text (required, string, max 4096)
- reply_to_message_id (optional, integer) — Telegram ID of the message to which the reply is made
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 IDstudent_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 identifiername— funnel namestatus— funnel subscription status (e.g.active,stopped)stop_reason— reason for stopping (if any), otherwisenullsteps_total— total number of active steps in the funnelsteps_completed— number of steps already completed by the subscriberaccess— whether the subscriber has access to the funnel (true/false)access_until— access expiration date (nullif 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 IDstudent_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 identifiername— product namestatus— product subscription status (e.g.active,stopped)stop_reason— reason for stopping (if any), otherwisenullsteps_total— total number of active steps in the productsteps_completed— number of steps already completed by the subscriberaccess— whether the subscriber has access to the product (true/false)access_until— access expiration date (nullif 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 IDproduct_id— product ID
Query parameters (optional):
access—trueorfalse; filter by active accessper_page— number of records per page, default 30page— 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 IDuser_id— Telegram user IDfirst_name,last_name,username— first name, last name, usernamephone,email— subscriber contacts (may benull)notes— notes about the subscribertags— comma-separated tagsis_active,is_blocked— activity and bot block flagslast_active_at— date of last activitycreated_at— date of subscription to the botutm_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 (nullif 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 IDfunnel_id— funnel ID
Query parameters (optional):
access—trueorfalse; filter by active accessper_page— number of records per page, default 30page— 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 IDuser_id— Telegram user IDfirst_name,last_name,username— first name, last name, usernamephone,email— subscriber contacts (may benull)notes— notes about the subscribertags— comma-separated tagsis_active,is_blocked— activity and bot block flagslast_active_at— date of last activitycreated_at— date of subscription to the botutm_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 (nullif 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 IDoffer_id— offer ID
Query parameters (optional):
per_page— number of records per page, default 30page— 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_untilfield. 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 IDuser_id— Telegram user IDfirst_name,last_name,username— first name, last name, usernamephone,email— subscriber contacts (may benull)notes— notes about the subscribertags— comma-separated tagsis_active,is_blocked— activity and bot block flagslast_active_at— date of last activitycreated_at— date of subscription to the botutm_tags— object with UTM tags (type → value)custom_fields— object with custom fields (name → value)access— alwaystrue(only active subscribers are returned)access_until— active subscription expiration date for this offer (nullif 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"
}
}