GET /v1/platform/courses/:id
Returns the current status and details of a course generation request. Use this endpoint to poll for completion when using async mode.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The course request ID returned by the create endpoint |
Example Request
curl https://api.tutorflow.io/v1/platform/courses/a1c2d3e4-f5g6-7h8i-9j0k-l1m2n3o4p5q6 \
-H "Authorization: Bearer tf_platform_..."Response
Returns the same CourseResDto structure as the create endpoint. See
Create Course for the full list of response fields.
When the course generation is still in progress, isTerminal will be false
and pollAfterMs will indicate how long to wait before polling again.
Example Response (Completed)
{
"id": "a1c2d3e4-f5g6-7h8i-9j0k-l1m2n3o4p5q6",
"status": "COMPLETED",
"courseId": "c7d8e9f0-1a2b-3c4d-5e6f-7g8h9i0j1k2l",
"title": "Python for Beginners",
"description": "A beginner-friendly Python course.",
"language": "en",
"subject": null,
"level": "beginner",
"slug": "python-for-beginners-2e5ad6",
"tier": "default",
"mode": "sync",
"hasQuiz": true,
"hasPractice": true,
"lessonCount": 1,
"priceSnapshot": {
"category": "course",
"catalogKey": "course.default",
"tier": "default",
"unit": "lesson",
"unitPrice": 0.05,
"units": 6,
"amountUsd": 0.3,
"currency": "USD",
"source": "platform_pricing_catalog_v2"
},
"shareToken": "b018172542f9a3c4d5e6f7890abcdef12345678",
"thumbnailUrl": null,
"previewUrl": "https://tutorflow.io/en/platform/courses/edit/9f3a...",
"publicUrl": "https://tutorflow.io/en/platform/courses/b018172542f9.../lessons/1",
"chapters": [
{ "title": "Getting Started with Python", "sequence": 1, "lessonCount": 2, "slug": "getting-started-with-python-cf1710" },
{ "title": "Control Flow and Functions", "sequence": 2, "lessonCount": 3, "slug": "control-flow-and-functions-253716" }
],
"lessons": [
{ "title": "Welcome to Python", "type": "ai-tutor", "sequence": 1, "chapterTitle": "Getting Started with Python", "chapterSlug": "getting-started-with-python-cf1710", "lessonSlug": "welcome-to-python-29ae64", "lessonUrl": "https://tutorflow.io/en/platform/courses/b018.../lessons/1" }
],
"idempotencyKey": null,
"idempotentReplay": null,
"isTerminal": true,
"createdAt": "2026-03-24T12:00:00.000Z",
"completedAt": "2026-03-24T12:00:15.000Z"
}Example Response (Pending)
While a request is pending, only the request-side fields are populated. Result-side
fields (chapters, lessons, lessonCount, shareToken, thumbnailUrl,
previewUrl, publicUrl, completedAt) are omitted until generation completes.
{
"id": "a1c2d3e4-f5g6-7h8i-9j0k-l1m2n3o4p5q6",
"status": "PROCESSING",
"courseId": null,
"title": null,
"description": null,
"level": "beginner",
"language": "en",
"subject": null,
"tier": "default",
"mode": "async",
"hasQuiz": true,
"hasPractice": true,
"priceSnapshot": {
"category": "course",
"catalogKey": "course.default",
"tier": "default",
"unit": "lesson",
"unitPrice": 0.05,
"units": 6,
"amountUsd": 0.3,
"currency": "USD",
"source": "platform_pricing_catalog_v2"
},
"idempotencyKey": null,
"idempotentReplay": null,
"isTerminal": false,
"pollAfterMs": 3000,
"createdAt": "2026-03-24T12:00:00.000Z"
}Public Share-Token Endpoints
These endpoints do not require a Platform API key. Use them only when you have
the shareToken returned by a completed course request.
| Method | Endpoint | Returns |
|---|---|---|
GET | /v1/platform/courses/public/:shareToken | Public CourseResDto summary |
GET | /v1/platform/courses/public/:shareToken/full | CourseFullResDto with chapters, lessons, and a refreshed edit token when needed |
GET | /v1/platform/courses/public/:shareToken/lessons/:sequence | One PlatformLessonPublicDto by lesson sequence |
Agent rule: use GET /v1/platform/courses/:id for owned API-key polling and
management. Use the public share-token routes only for learner-facing playback
or open editor flows that already have the share token.