Get Course
Get one course. On a published course with pending edits, the body includes those edits; otherwise it is the live course. name and products, when requested, are always live. The response is the Course Object plus public_url, preview_url, draft_version, draft_updated_at, and the include keys. A key you do not request is null. See Course Detail and Include.
Request
GET /players/{id}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Course UUID. See Identifiers. |
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
include | string | — | Comma-separated styles, layout, settings, files, header_links, certificate, products. See Include. |
Example Requests
curl -X GET "https://app.easy.tools/api/v1/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
With styles, lessons, header links, and the paywall:
curl -X GET "https://app.easy.tools/api/v1/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71?include=styles,files,header_links,products" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
Response
Success Response (200)
Without include, every section key is null:
{
"data": {
"id": "8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71",
"slug": "course-intro",
"name": "Course intro",
"status": "draft",
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-15T10:30:00.000Z",
"published_at": null,
"has_draft": false,
"draft_version": 1,
"draft_updated_at": "2026-01-15T10:30:00.000Z",
"public_url": "https://app.easy.tools/players/course-intro",
"preview_url": "https://app.easy.tools/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71/preview?expires=1768478400&signature=7d2e9c41a6b85f03e1c7d94a2b6f80e35c1a9d7b4e2f60c8a3d5b1e9f7c2a046",
"styles": null,
"layout": null,
"settings": null,
"files": null,
"header_links": null,
"certificate": null,
"products": null
}
}
include=styles,files,header_links,products fills the requested sections. products is the live paywall, the whole collection, not a page. Zero links is []. Leave products out of include and that key stays null, as in the first example.
{
"data": {
"id": "8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71",
"slug": "course-intro",
"name": "Course intro",
"status": "draft",
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-15T10:30:00.000Z",
"published_at": null,
"has_draft": false,
"draft_version": 1,
"draft_updated_at": "2026-01-15T10:30:00.000Z",
"public_url": "https://app.easy.tools/players/course-intro",
"preview_url": "https://app.easy.tools/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71/preview?expires=1768478400&signature=7d2e9c41a6b85f03e1c7d94a2b6f80e35c1a9d7b4e2f60c8a3d5b1e9f7c2a046",
"styles": {
"theme": "light",
"font_family": "Inter",
"main_color": "#F6083D",
"background_color": "#f9fafb",
"text_color": "#0e0f11",
"header_color": "#fff",
"heading_color": "#3c404b",
"border_color": "#e0e3e6"
},
"layout": null,
"settings": null,
"files": [
{
"id": "3a91c4e0-6b27-4f58-9d14-7e2b8c0a5f63",
"name": "Welcome",
"type": "video",
"description": "Start here.",
"text": "",
"src_url": "https://video.example.com/play/welcome",
"video_source": "bunny",
"info": "",
"is_free": true,
"is_hidden": false,
"order": 0,
"schedule": null
},
{
"id": "7c4e2b18-9a30-4d61-b845-1f6d0e8a3c29",
"name": "Week 1",
"type": "header",
"description": null,
"text": "",
"src_url": "",
"video_source": "vimeo",
"info": "",
"is_free": false,
"is_hidden": false,
"order": 1,
"schedule": null
}
],
"header_links": [
{
"id": "4b8e1c70-5d29-4a16-8f33-0c7a2e9d4b51",
"name": "Syllabus",
"link_url": "https://mysite.com/syllabus",
"type": "link",
"side": "left",
"order": 0
},
{
"id": "6d2f9a84-1e47-4c05-b918-3a5c7e0d2f64",
"name": "Community",
"link_url": "https://mysite.com/community",
"type": "button",
"side": "right",
"order": 1
}
],
"certificate": null,
"products": [
{
"product_id": "2f1c0a2e-7b3d-4e1a-9c55-0a1b2c3d4e5f",
"product_name": "Course",
"variant_ids": null,
"missing": false
}
]
}
}
Response Fields
See Course Detail.
Error Responses
Not Found Error (404)
See Identifiers.
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found"
}
}
Validation Error (422 Unprocessable Entity)
{
"error": {
"code": "VALIDATION_ERROR",
"message": "The given data was invalid",
"details": {
"include": ["include has an unknown value"]
}
}
}
With include=products, a workspace that is not connected to an Easycart store also returns 422 VALIDATION_ERROR.
Bad Gateway Error (502)
Only with include=products. Easycart answered, but not with a result the API can use.
{
"error": {
"code": "UPSTREAM_ERROR",
"message": "EasyCart rejected the request"
}
}
Service Unavailable Error (503)
Only with include=products. Easycart is unreachable or failing. Retry later.
{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "EasyCart is unavailable"
}
}
Authentication, permission, and rate-limit errors are described in Authorization.