API reference

Get job status

GET /api/v1/courses/jobs/:jobId — poll the status of a course-generation job. Status enum and response shape.

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 callbackUrl on the create request and use the course.created webhook instead.

Errors

This endpoint may return:

See Errors for response shape and full code definitions.