Programs are online courses: a priced program made of weeks, each week of days and each day of steps - text, a video, images. Buyers work through it in the site or the app, and their progress is kept.
Endpoints that need a token: the site owner creates it in their admin (Developers > API reference). AI assistants: how to ask the user for one.
23 endpoints in 4 parts: Program, Program Progress, Tracker, Tracker Progress.
Likes or unlikes a program and notifies its owner. Calling it again takes the like back. Answers { like }.
Needs the token of a signed-in user.
The ID of the program.
Returns the Program object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/program-likes/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}Opens a program in the app (redirects to its app page). For links shared from the app: the website sends the visitor to the program in the app.
Works without a token; with a user token the answer is personal.
The program's URL slug, as in its address on the site.
curl -X GET 'http://bulgariandebateassociation.max-media.io/program-redirect/{url}?ionic=true'{
"zip_code": "example",
"city": "example",
"address": "example",
"contact": "example",
"email": "jane@example.com",
"google_app": "example",
"workhours": "example",
"logo": "6543210fedcba98765432100",
"site_name": "Example",
"domain": "example",
"stock_domain": "example",
"isMarket": false,
"forbidden_collections": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"isInit": false,
"template": "0000",
"lang": "en",
"favicon": "6543210fedcba98765432100",
"cacheEnabled": false,
"has_completed_startup_prompt": true,
"gmb_location": "example",
"ga_property": "example",
"site_generated_at": "2026-11-04T12:00:00.000Z",
"admin_first_opened_at": "2026-11-04T12:00:00.000Z",
"admin_last_opened_at": "2026-11-04T12:00:00.000Z",
"allowedComponents": {
"services": false,
"products": false,
"blogposts": false,
"programs": false
}
}Saves or unsaves a program for the signed-in user. Calling it again unsaves.
Needs the token of a signed-in user.
The ID of the program.
Returns the Program object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/program-saves/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}The programs page, or the programs as JSON with ?ionic. Paged with ?skip, filtered by ?collection and ?published; ?sortBy sets the order. Cached for an hour.
Needs a signed-in user whose plan grants access.
Only programs with this published.
Only programs with this completed.
The order of the results.
Only results in this collection.
How many results to skip - for paging.
Only programs with this where.
Returns a list of Program objects.
curl -X GET 'http://bulgariandebateassociation.max-media.io/programs?ionic=true&published=...&completed=...&sortBy=...' \ -H 'Authorization: Bearer <TOKEN>'
[
{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}
]Creates a program. url is made from title. Answers 201 with the program. 403 without a professional account where social mode requires one.
Needs the token of a signed-in user.
Name of the program, required.
The program's on behalf of.
Returns the Program object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/programs?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "title": "...", "on_behalf_of": "..." }'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}Updates a program. Fields outside the allowed list are silently ignored. Answers the program. 403 unless the owner or an admin.
Needs the token of a signed-in user.
The ID of the program.
The program's converted price.
Returns the Program object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/programs/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "convertedPrice": "..." }'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}Deletes a program. Answers the deleted program. Users' progress in it stays. 403 unless the owner or an admin.
Needs the token of a signed-in user.
The ID of the program.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/programs/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'A program's page, or JSON with ?ionic. By url, not id. 404 when there is no such program.
Pages limited to some users check the token when one is sent.
The program's URL slug, as in its address on the site.
Returns the Program object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/programs/{url}?ionic=true'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"body": "Text shown on the site.",
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"video": "6543210fedcba98765432100",
"about_page": "6543210fedcba98765432100",
"weeks": [
{
"isCompleted": {},
"progress": {},
"title": "Example",
"days": [],
"_id": "6543210fedcba98765432100"
}
],
"suitability_price_plans": [
"6543210fedcba98765432101"
],
"isSuitable": false,
"price": 0,
"collection_id": "6543210fedcba98765432100",
"topics": [
{
"collection_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"ribbon": "example",
"striked": "example",
"isConsistent": false,
"isAcademic": true,
"wildcard_url": {},
"reviewed": false,
"approved": false,
"likes": [
"6543210fedcba98765432101"
],
"popup": {
"title": "Example",
"points": "example"
}
}Users' progress in programs. Answers an array of every record.
Public - no token needed.
Returns the ProgramProgress object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/program-progress?ionic=true'
{
"program": "6543210fedcba98765432100",
"user": "6543210fedcba98765432100",
"no_steps": 1,
"is_completed": false,
"weeks_completed": [
"example"
],
"days_completed": [
"example"
],
"steps_completed": [
"example"
],
"selectedWeek": {},
"selectedWeekIndex": {},
"selectedDay": {},
"selectedDayIndex": {},
"selectedStep": {},
"selectedStepIndex": {},
"about_section": {},
"selected": false,
"percentage": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Creates a program progress record. Enrols the user in a program: 403 "You need to buy course before proceeding." for a paid one they have not bought. Answers 201 { program_progress_id }, or 200 with the existing one when already enrolled.
Needs the token of a signed-in user.
Program.id.
Returns the ProgramProgress object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/program-progress?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "program": "..." }'{
"program": "6543210fedcba98765432100",
"user": "6543210fedcba98765432100",
"no_steps": 1,
"is_completed": false,
"weeks_completed": [
"example"
],
"days_completed": [
"example"
],
"steps_completed": [
"example"
],
"selectedWeek": {},
"selectedWeekIndex": {},
"selectedDay": {},
"selectedDayIndex": {},
"selectedStep": {},
"selectedStepIndex": {},
"about_section": {},
"selected": false,
"percentage": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}One user's progress in a program. With the program; the week and day come from ?week and ?day (both 0 by default) for a weekly program. 404 when there is no such progress.
Works without a token; with a user token the answer is personal.
The ID of the program progress.
Only program progresses with this week.
Only program progresses with this day.
Only program progresses with this step.
Returns the ProgramProgress object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/program-progress/{id}?ionic=true&week=...&day=...&step=...' \
-H 'Authorization: Bearer <TOKEN>'{
"program": "6543210fedcba98765432100",
"user": "6543210fedcba98765432100",
"no_steps": 1,
"is_completed": false,
"weeks_completed": [
"example"
],
"days_completed": [
"example"
],
"steps_completed": [
"example"
],
"selectedWeek": {},
"selectedWeekIndex": {},
"selectedDay": {},
"selectedDayIndex": {},
"selectedStep": {},
"selectedStepIndex": {},
"about_section": {},
"selected": false,
"percentage": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Updates a program progress record. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.
Needs the token of a signed-in user.
The ID of the program progress.
The program progress's concatinated progress.
The program progress's is completed.
The program progress's split.
The program progress's progress.
Returns the ProgramProgress object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/program-progress/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "concatinated_progress": "...", "isCompleted": "...", "split": "...", "progress": "..." }'{
"program": "6543210fedcba98765432100",
"user": "6543210fedcba98765432100",
"no_steps": 1,
"is_completed": false,
"weeks_completed": [
"example"
],
"days_completed": [
"example"
],
"steps_completed": [
"example"
],
"selectedWeek": {},
"selectedWeekIndex": {},
"selectedDay": {},
"selectedDayIndex": {},
"selectedStep": {},
"selectedStepIndex": {},
"about_section": {},
"selected": false,
"percentage": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Deletes a program progress record. Answers the deleted record, or 404. Records that point to it are not changed.
Needs the token of a signed-in user.
The ID of the program progress.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/program-progress/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'The progress trackers. With the signed-in user's entries, newest first, and its video.
Works without a token; with a user token the answer is personal.
Returns the Tracker object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/tracker?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
{
"title": "Example",
"unit": "example",
"score_direction": "up",
"additional_fields": [
{
"label": "Example",
"type": "example",
"options": [],
"_id": "6543210fedcba98765432100"
}
],
"body": "Text shown on the site.",
"video": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"goal_definition": {
"label": "Example",
"type": "example",
"options": "example"
}
}Creates a progress tracker. Answers 201 with the tracker.
Needs a site admin token.
Returns the Tracker object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/tracker?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
{
"title": "Example",
"unit": "example",
"score_direction": "up",
"additional_fields": [
{
"label": "Example",
"type": "example",
"options": [],
"_id": "6543210fedcba98765432100"
}
],
"body": "Text shown on the site.",
"video": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"goal_definition": {
"label": "Example",
"type": "example",
"options": "example"
}
}One progress tracker. 404 when there is no such tracker.
Needs the token of a signed-in user.
The ID of the tracker.
Returns the Tracker object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/tracker/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"title": "Example",
"unit": "example",
"score_direction": "up",
"additional_fields": [
{
"label": "Example",
"type": "example",
"options": [],
"_id": "6543210fedcba98765432100"
}
],
"body": "Text shown on the site.",
"video": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"goal_definition": {
"label": "Example",
"type": "example",
"options": "example"
}
}Updates a progress tracker. Answers the tracker, or 404.
Needs a site admin token.
The ID of the tracker.
Returns the Tracker object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/tracker/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"title": "Example",
"unit": "example",
"score_direction": "up",
"additional_fields": [
{
"label": "Example",
"type": "example",
"options": [],
"_id": "6543210fedcba98765432100"
}
],
"body": "Text shown on the site.",
"video": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z",
"goal_definition": {
"label": "Example",
"type": "example",
"options": "example"
}
}Deletes a progress tracker. Answers the deleted tracker. Users' entries stay.
Needs a site admin token.
The ID of the tracker.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/tracker/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Users' progress entries. The signed-in user's own entries.
Works without a token; with a user token the answer is personal.
Returns the TrackerProgress object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/tracker-progress?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
{
"score": "example",
"user_id": "6543210fedcba98765432100",
"media": "example",
"additional_fields": {},
"goal": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Creates a progress entry. Answers 201 for the app; a website form is sent back to /tracker.
Needs the token of a signed-in user.
The tracker progress's body.
Returns the TrackerProgress object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/tracker-progress?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "body": "..." }'{
"score": "example",
"user_id": "6543210fedcba98765432100",
"media": "example",
"additional_fields": {},
"goal": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}One progress entry. 404 when there is no such record.
Needs the token of a signed-in user.
The ID of the tracker progress.
Returns the TrackerProgress object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/tracker-progress/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"score": "example",
"user_id": "6543210fedcba98765432100",
"media": "example",
"additional_fields": {},
"goal": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Updates a progress entry. Fields outside the allowed list are silently ignored. Answers the updated record, or 404.
Needs the token of a signed-in user.
The ID of the tracker progress.
Returns the TrackerProgress object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/tracker-progress/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"score": "example",
"user_id": "6543210fedcba98765432100",
"media": "example",
"additional_fields": {},
"goal": {},
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Deletes a progress entry. Answers the deleted record, or 404. Records that point to it are not changed.
Needs the token of a signed-in user.
The ID of the tracker progress.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/tracker-progress/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'