# Read the event feed

`GET https://api.cream-ai.de/api/v1/events`

The event feed of your company: every change of a film ordered through the API that matters to you, in a fixed order. Each event has a `seq` that grows within your company. Read the feed with `after` = `next_after` of the previous page (start with `0`) and store `next_after` only after you processed the page. Duplicates (at least once) can be recognized by `id`. `data` is a snapshot at the time of the event. `film` is the current state of the film (as `GET /films/{id}`, without `revisions`) and is only present if the API key also has the scope `films:read`; it is `null` for a film that was deleted in mint. Types: `film.created`, `film.status_changed` (every change of `status`), `film.storyboard_ready` (once per storyboard), `film.approved`, `film.approval_revoked`, `film.cancelled`, `film.deleted`. A specific event comes before its `film.status_changed`. New types may be added within v1; ignore types you do not know. mint keeps events for 180 days. An `after` older than that returns `410 cursor_expired`; an `after` ahead of the feed (for example from another mint server) returns `400 invalid_cursor`. In both cases start again: note `latest_seq`, read `GET /films?status=approved`, then continue with `after` = the noted `latest_seq`. mint writes events together with the change. In rare cases an event comes up to 10 minutes late; intermediate states can then be missing, the final state is always reported.

Scopes: `events:read`

## Parameters

- `after` (query): Return events with a seq greater than this (next_after of the previous page). Default 0 (from the oldest kept event).
- `types` (query): Comma-separated list of event types (default: all). Known types: film.created, film.status_changed, film.storyboard_ready, film.approved, film.approval_revoked, film.cancelled, film.deleted, film.progress, feedback.updated, storyboard.preview_ready, operation.completed.
- `source` (query): api: films ordered through the API (default and currently the only value).
- `limit` (query): Page size (1–100).

## Returns

- 200: One page of events.

## Errors

- 400: Invalid request (invalid_request, invalid_json, invalid_cursor, idempotency_key_required, invalid_idempotency_key, parent_not_found, max_depth_exceeded, narration_too_long, user_not_in_company, template_not_found, category_not_found, feedback_kind_unsupported, upload_not_found).
- 401: Missing, malformed, revoked or expired API key (unauthorized).
- 403: Not allowed (forbidden_scope, ip_not_allowed, company_inactive, api_not_enabled).
- 410: This position is no longer kept (cursor_expired, details.min_after, details.latest_seq). Start again with latest_seq and GET /films?status=approved.
- 429: Too many requests (rate_limited).
- 500: Internal error (internal). Quote the request id when you contact support.
- 503: Temporarily unavailable (service_unavailable). Retry later (after Retry-After seconds, if sent).

## Example request

```sh
curl "https://api.cream-ai.de/api/v1/events?after=10480&types=film.approved,film.approval_revoked,film.deleted" \
  -H "Authorization: Bearer $MINT_API_KEY"
```

## Example response (200)

```json
{
  "object": "list",
  "data": [
    {
      "object": "event",
      "id": "evt_10482",
      "seq": 10482,
      "type": "film.approved",
      "occurred_at": "2026-11-11T14:30:00Z",
      "film_id": "k7m2xq9v4t8n1b5r3c6d0wza",
      "data": {
        "status": "approved",
        "previous_status": "film_ready",
        "approval": {
          "id": "apr_20931",
          "revision": 2,
          "approved_at": "2026-11-11T14:30:00Z",
          "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
          "bytes": 48213377,
          "duration_s": 184.6,
          "resolution": "1920x1080",
          "mime": "video/mp4",
          "has_subtitles": true,
          "approved_by": {
            "kind": "user",
            "name": "Anna Schmidt",
            "email": "anna.schmidt@example.edu"
          },
          "revoked_by": null
        },
        "requested_by": {
          "kind": "user",
          "name": "Anna Schmidt",
          "email": "anna.schmidt@example.edu"
        },
        "cancelled_by": null
      },
      "film": {
        "object": "film",
        "id": "k7m2xq9v4t8n1b5r3c6d0wza",
        "title": "Lesson 3: Market segmentation",
        "status": "approved",
        "stage": "approved",
        "attention_required": false,
        "notice": null,
        "source": "api",
        "automation": "storyboard",
        "video_key": "MKT101-lesson-03",
        "version": "1.0",
        "previous_version_id": null,
        "is_latest_approved_version": true,
        "language": "de",
        "template": "lesson-standard",
        "settings": {
          "format": "16x9",
          "style_id": "b6ed57e1-2c4f-4b8a-9d3e-6f1a0c2b7e45",
          "style_revision": 4,
          "brand_id": "brand-northwind-x7k2p9",
          "voice_id": "Xb7hH8MSUJpSbSDYk0k2",
          "voice_name": "Clara",
          "narration_mode": "verbatim",
          "tempo": "presenting",
          "freedom": 40,
          "video_share": 25,
          "target_duration_s": 180
        },
        "category": {
          "object": "category",
          "id": "rz3p8w1d6c0b",
          "name": "MKT101 Marketing basics",
          "external_key": "MKT101",
          "parent": {
            "id": "mk7t2q9x4v1n",
            "name": "Marketing",
            "external_key": "MKT"
          }
        },
        "requested_by": {
          "kind": "user",
          "email": "anna.schmidt@example.edu",
          "name": "Anna Schmidt"
        },
        "metadata": {
          "course_id": "MKT101",
          "lesson": 3
        },
        "approval": {
          "revision": 2,
          "approved_at": "2026-11-11T14:30:00Z",
          "sha256": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
          "bytes": 48213377,
          "duration_s": 184.6,
          "resolution": "1920x1080",
          "mime": "video/mp4",
          "has_subtitles": true,
          "approved_by": {
            "kind": "user",
            "name": "Anna Schmidt",
            "email": "anna.schmidt@example.edu"
          }
        },
        "cancelled_at": null,
        "created_at": "2026-11-10T08:00:00Z",
        "updated_at": "2026-11-11T14:30:00Z",
        "app_url": "https://app.cream-ai.de/editorial/k7m2xq9v4t8n1b5r3c6d0wza",
        "file_url": "https://api.cream-ai.de/api/v1/films/k7m2xq9v4t8n1b5r3c6d0wza/file",
        "subtitles_url": "https://api.cream-ai.de/api/v1/films/k7m2xq9v4t8n1b5r3c6d0wza/subtitles.srt"
      }
    }
  ],
  "has_more": false,
  "next_after": 10482,
  "latest_seq": 10482
}
```
