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
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Course name, 1–255 characters |
styles | object | No | Styles Object. Omit a key for its starting value. |
layout | object | No | Layout Object. Omit a key for its starting value. |
settings | object | No | Settings Object. Omit a key for its starting value. |
certificate | object | No | Certificate 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.