> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hawkings.education/llms.txt
> Use this file to discover all available pages before exploring further.

# The Course object

> The syllabus / curriculum. Holds units, lessons, and AI configuration.

```json Example theme={null}
{
  "id": "crs_01HX9N5AB3M0R6P02RT9QZSF8K",
  "object": "course",
  "name": "Intro to Special Relativity",
  "description": "An undergraduate intro course covering frames, the postulates, time dilation, length contraction, and mass-energy equivalence.",
  "language": "en",
  "duration": { "hours": 12, "hours_generated": 11.5 },
  "length": { "words_per_hour": 2400, "words_generated": 27600 },
  "status": "ready",
  "ai": {
    "instructions": "Use SI units. Prefer derivations over hand-waving.",
    "evaluator": { "model": "claude-sonnet-4-6" }
  },
  "tutor": {
    "enabled": true,
    "name": "Dr. Hawking",
    "voice": "encouraging-academic"
  },
  "image": "https://cdn.hawkings.education/i/crs_01HX9.../cover.webp",
  "metadata": { "internal_code": "PHYS-201" },
  "cohorts": ["coh_01HX9N5AB3..."],
  "created_at": "2026-05-10T12:00:00Z",
  "updated_at": "2026-05-10T12:34:56Z"
}
```

## Attributes

<ResponseField name="id" type="string">
  Unique identifier. Prefix `crs_`.
</ResponseField>

<ResponseField name="object" type="string">
  Always `"course"`.
</ResponseField>

<ResponseField name="name" type="string">
  Human-readable course name.
</ResponseField>

<ResponseField name="description" type="string | null">
  Long-form description. Used as the brief for syllabus generation when
  no explicit `brief` is passed.
</ResponseField>

<ResponseField name="language" type="string">
  BCP-47 language code: `"en"`, `"es"`, `"pt-BR"`, etc.
</ResponseField>

<ResponseField name="duration" type="object">
  <Expandable title="properties">
    <ResponseField name="hours" type="integer">
      Target total student hours.
    </ResponseField>

    <ResponseField name="hours_generated" type="number">
      Estimated hours of content actually generated. Should converge on
      `hours` once generation is complete.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="length" type="object">
  <Expandable title="properties">
    <ResponseField name="words_per_hour" type="integer">
      Target reading density.
    </ResponseField>

    <ResponseField name="words_generated" type="integer">
      Total words across all lesson contents.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="status" type="enum">
  One of `draft`, `pending`, `ready`, `error`. The lifecycle:

  * `draft` — created, no syllabus yet.
  * `pending` — syllabus generation is running.
  * `ready` — syllabus and content generated.
  * `error` — generation failed; check `error`.
</ResponseField>

<ResponseField name="ai" type="object">
  <Expandable title="properties">
    <ResponseField name="instructions" type="string | null">
      Free-text guidance applied to every AI call scoped to this course
      (generation, tutor, grading).
    </ResponseField>

    <ResponseField name="evaluator" type="object">
      Default evaluator config inherited by assignments in this course.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="tutor" type="object">
  <Expandable title="properties">
    <ResponseField name="enabled" type="boolean" />

    <ResponseField name="name" type="string" />

    <ResponseField name="voice" type="string" />

    <ResponseField name="avatar" type="string | null" />
  </Expandable>
</ResponseField>

<ResponseField name="image" type="string | null">
  Cover image URL. Generate with `courses.generateImage()` or upload via
  `update`.
</ResponseField>

<ResponseField name="metadata" type="object">
  Free-form key-value store, max 50 keys, 500 chars per value. Always
  returned, never indexed.
</ResponseField>

<ResponseField name="cohorts" type="string[] | Cohort[]">
  IDs by default; expand `"cohorts"` to inline.
</ResponseField>

<ResponseField name="created_at" type="string" />

<ResponseField name="updated_at" type="string" />
