Skip to main content

Create Course

Create a course in your workspace. The new course is a draft. { "name" } is enough, and that request keeps the starting values. The same request can set styles, layout, settings, and the certificate template. Those sections are saved on the new course, which visitors cannot see until you publish. The response includes preview_url. See Updates and Draft, preview, and publish.

Request​

POST /players

Request Body​

ParameterTypeRequiredDescription
namestringYesCourse name, 1–255 characters
stylesobjectNoStyles Object. Omit a key for its starting value.
layoutobjectNoLayout Object. Omit a key for its starting value.
settingsobjectNoSettings Object. Omit a key for its starting value.
certificateobjectNoCertificate Object. Omit a key for its starting value.

Example Requests​

Name only:

curl -X POST "https://app.easy.tools/api/v1/players" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name": "Course intro"
}'

Name and a style:

curl -X POST "https://app.easy.tools/api/v1/players" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name": "Course intro",
"styles": {
"main_color": "#111827"
}
}'

Response​

Success Response (201)​

Both requests return the Course Object and preview_url. The sections are not in this body — read them with Get Course or the section routes. A new course is a draft, so the sections are saved on the course itself and has_draft is false either way.

{
"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,
"preview_url": "https://app.easy.tools/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71/preview?expires=1768478400&signature=7d2e9c41a6b85f03e1c7d94a2b6f80e35c1a9d7b4e2f60c8a3d5b1e9f7c2a046"
}
}

Response Fields​

The created course has the fields described in Course Object. preview_url is minted for this response.

Error Responses​

Validation Error (422 Unprocessable Entity)​

{
"error": {
"code": "VALIDATION_ERROR",
"message": "The given data was invalid",
"details": {
"name": ["name should not be empty"]
}
}
}

Authentication, permission, and rate-limit errors are described in Authorization.