# Movie content

Fetch one section at a time from `GET /movies/{movie}/content/{section}`. This keeps an ending explanation, a timeline, or a set of FAQs independent from the movie detail payload.

## Choose a section

| Section                | What you receive                                                 | Response             |
| ---------------------- | ---------------------------------------------------------------- | -------------------- |
| `summary`              | A plot summary.                                                  | Markdown text object |
| `spoiler-free-summary` | An introduction intended for readers who have not seen the film. | Markdown text object |
| `ending`               | An explanation of the ending.                                    | Markdown text object |
| `timeline`             | Story events with order, title, body, place, and time.           | Paginated list       |
| `setting`              | Place and time information with explanatory text.                | Object               |
| `themes`               | Themes with a title, emoji, and explanation.                     | Paginated list       |
| `characters`           | Character descriptions, tags, and linked person IDs where known. | Paginated list       |
| `faqs`                 | Questions, answers, sections, and optional foreshadowing notes.  | Paginated list       |
| `profile`              | Tone, pacing, intensity, mood, topics, and content warnings.     | Object               |

## Check availability

First read `data.available_content` from the movie detail response. You can also search with `has=ending` or `has=summary,ending` to require sections in advance.

An unknown movie returns `404 not_found`. A known movie without the requested section returns `404 content_not_available`. Hide or disable unavailable sections in your interface instead of retrying them repeatedly. Availability can change after you retrieve the detail record, so still handle the content request's response.

## Read a prose response

The following illustrates the shape; the text and ID are examples:

```json
{
  "data": {
    "movie_id": 123,
    "type": "ending",
    "text": "## The final scene\n\nThe closing moment leaves the central choice unresolved.",
    "format": "markdown"
  }
}
```

Render `data.text` with a Markdown renderer. Sanitize rendered HTML and validate link destinations before displaying content. Preserve paragraph breaks and formatting instead of showing the raw Markdown syntax.

## Paginate structured content

Timeline, themes, characters, and FAQs use the standard `data` array and `pagination` envelope. Pass `limit` and `cursor` to the same content URL. Other content sections do not accept pagination parameters.

For ending-specific FAQs:

```sh
curl --get "$ATM_API_BASE_URL/movies/$ATM_MOVIE_ID/content/faqs" \
  --header "Authorization: Bearer $ATM_API_KEY" \
  --data-urlencode 'section=ending' \
  --data-urlencode 'limit=20'
```

FAQ sections are `summary`, `ending`, and `info`. A character's `person_id` can be `null`; only create a person-profile link when it is present.

## Respect spoiler boundaries

Use the explicit `spoiler-free-summary` section for pre-watch introductions. Treat other sections as potentially revealing plot details, including themes, character descriptions, FAQs, and the profile's ending information. Let readers choose when to reveal them.

A profile describes the viewing experience. Its content warnings are descriptive guidance, not an official age classification.

**Reference:** [Movie content](/api/movie-content)
