Publish Course
Publish a course. The body is empty. The course becomes public, then its pending edits are applied to the live course, so has_draft is false. This is the only call that applies pending edits. It does not change the name or the paywall, which are always live. A course that is already published is published again, and published_at becomes the time of this call. With no pending edits, the call still returns 200 and applies nothing.
When pending edits are applied, draft_version increases by 1. Read the course with Get Course before the next draft write: a write that sends the value from before the publish returns 409. See Draft version.
Publishing requires an Easytools trial or a paid plan with a free publish slot. When the account cannot go live, the call returns 402 and changes nothing: the course keeps its status and its pending edits.
Request
POST /players/{id}/publish
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Course UUID. See Identifiers. |
Example Request
curl -X POST "https://app.easy.tools/api/v1/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71/publish" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json"
Response
Success Response (200)
{
"data": {
"id": "8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71",
"slug": "course-intro",
"name": "Course intro",
"status": "published",
"created_at": "2026-01-15T10:30:00.000Z",
"updated_at": "2026-01-16T14:00:00.000Z",
"published_at": "2026-01-16T14:00:00.000Z",
"has_draft": false,
"preview_url": "https://app.easy.tools/players/8f3c1a62-d047-4e89-9b25-1c6a4d8e0f71/preview?expires=1768575600&signature=7d2e9c41a6b85f03e1c7d94a2b6f80e35c1a9d7b4e2f60c8a3d5b1e9f7c2a046"
}
}
Response Fields
See Course Object and Status. The response also includes preview_url, minted for this response. It does not include public_url, draft_version, or draft_updated_at — read them with Get Course.
Error Responses
Not Found Error (404)
See Identifiers.
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Resource not found"
}
}
Payment Required Error (402 — Publish Not Allowed)
The account needs to start the Easytools trial or choose a plan. Nothing was published. Retry after the account owner does that in Easytools. When the plan has ended, the message says so.
{
"error": {
"code": "PUBLISH_NOT_ALLOWED",
"message": "This store cannot go live until the account owner starts the Easytools trial or chooses a plan. Nothing went live. Ask them to do that in Easytools, then retry."
}
}
Payment Required Error (402 — Publish Limit Reached)
The account has no free publish slot left. Nothing was published. Retry after the account owner upgrades in Easytools.
{
"error": {
"code": "PUBLISH_LIMIT_REACHED",
"message": "This account has no free publish slot left. Ask the account owner to upgrade in Easytools, then retry. Nothing went live."
}
}
A caller who may not publish in this workspace receives 403 FORBIDDEN, and nothing changes. Authentication, permission, and rate-limit errors are described in Authorization.