GET /api/v1/courses/jobs/:jobId
Poll the status of a course-generation job. Returns the current
status, progress percentage, and once completed, the full course
object.
Request
Path parameters
| Field | Type | Description |
|---|---|---|
jobId |
string | Returned from POST /api/v1/courses. |
No body or query parameters.
Example request
curl -s https://learningstudioai.com/api/v1/courses/jobs/$JOB_ID \
-H "Authorization: Bearer $LS_API_KEY"
Response
200 OK
While the job is running:
{
"jobId": "8aF2k...Xq",
"status": "running",
"progress": 42,
"course": null
}
When the job completes:
{
"jobId": "8aF2k...Xq",
"status": "completed",
"progress": 100,
"course": {
"id": "cou_abc123",
"name": "Workplace Safety Basics",
"headline": "A practical guide for new hires",
"format": "classic",
"languageId": "en-US",
"shareUrl": "https://learningstudioai.com/go/cou_abc123",
"createdAt": "2026-04-28T17:14:08.000Z"
}
}
When the job fails:
{
"jobId": "8aF2k...Xq",
"status": "failed",
"progress": 0,
"course": null,
"error": {
"message": "Course outline could not be generated for this subject.",
"code": "GENERATION_FAILED"
}
}
| Field | Type | Description |
|---|---|---|
jobId |
string | Echoed back from the URL. |
status |
enum | "pending", "running", "completed", or "failed". |
progress |
number (0–100) | Percentage progress. 0 while pending; 100 once completed. |
course |
object | null | Full course object once completed; otherwise null. |
error |
object | undefined | Present only when status is "failed". |
Course object
| Field | Type | Description |
|---|---|---|
id |
string | Stable course identifier. Pass to POST /api/v1/courses/:id/export. |
name |
string | Course title. |
headline |
string | One-line course description. |
format |
string | "onepage" or "classic" — echoes the format passed at creation. |
languageId |
string | Locale code (e.g. "en-US"). |
shareUrl |
string | Public preview page (/go/:id). Hand to learners as a quick preview. |
createdAt |
string (ISO 8601) | When the course was created. |
Polling cadence
- Poll at most once every 5 seconds. The rate limit is 120 requests / minute / key.
- Generation typically completes in 60–120 seconds.
- For zero-poll integrations, pass
callbackUrlon the create request and use thecourse.createdwebhook instead.
Errors
This endpoint may return:
401INVALID_API_KEY403PAID_PLAN_REQUIRED404NOT_FOUND— job not found, or doesn't belong to this key.429RATE_LIMIT_EXCEEDED— 120 requests / minute / key.
See Errors for response shape and full code definitions.