# Get the catalog

> Every gallery video with its prompt or skill, creator, model, stack, effort, colours and media URLs, plus the videos removed as duplicates.

`GET https://motionvideo.xyz/api/catalog`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `If-None-Match` | header | string | No | The `ETag` of an earlier response. If it is still current, the response is a `304` with no body. Send the value exactly as received (one quoted value): lists, weak `W/` validators and `*` always get a full response. |

## Example request

```bash
curl https://motionvideo.xyz/api/catalog
```

## Responses

### 200

The motion video catalog.

| Header | Description |
| --- | --- |
| `ETag` | Quoted SHA-256 hex digest of the response body. Changes whenever the data does. |
| `Cache-Control` | Browsers reuse a response for 5 minutes and shared caches for an hour, then may serve it stale for up to a day while they revalidate. Value: `public, max-age=300, s-maxage=3600, stale-while-revalidate=86400` |

Body (`application/json`):

- `importedAt` (string (date-time), required): When the catalog was last imported.
- `videos` (array of MotionVideo, required): Every gallery video, in catalog order.
  - `slug` (string, required): Stable ID: the creator's handle and a short hash. The video's page is `/videos/{slug}` under a locale, e.g. `/en/videos/{slug}`.
  - `title` (string, required)
  - `date` (string (date), required): When the creator posted it (YYYY-MM-DD).
  - `tags` (array of string, required): What it shares to remake it: a prompt, a skill, or both. One of `prompt`, `skill`.
  - `contentTags` (array of string, required): Gallery categories, at least one. One of `product-ui`, `phone`, `charts`, `diagrams`, `kinetic-type`, `shapes`, `particles`, `characters`, `photos`, `music`, `code`.
  - `promptShared` (boolean, required): Whether the creator shared the prompt.
  - `handle` (string, required): The creator's X handle, without `@`.
  - `creatorName` (string): The creator's display name on X, when known.
  - `avatar` (string (uri), required): The creator's avatar (WebP).
  - `poster` (string (uri), required): Poster image (WebP).
  - `blur` (string): A tiny version of the poster as a `data:` URI, to show while media loads.
  - `preview` (string (uri), required): Small looping preview (MP4).
  - `video` (string (uri), required): The full video (MP4).
  - `width` (integer, required): Video width in pixels.
  - `height` (integer, required): Video height in pixels.
  - `prompt` (string): The prompt the creator used, when shared.
  - `skillUrl` (string (uri)): The agent skill the video was made with.
  - `skillInstall` (string): The command that installs the skill, e.g. `npx skills add …`.
  - `tweetUrl` (string (uri)): The source post on X.
  - `description` (string)
  - `model` (string): The model it was made with, as the creator reported it. One of `Opus 5.5`, `Fable 5.5`, `Gemini 4 Argon`, `GPT-6 Astra`.
  - `stack` (string): What rendered it, as the creator reported it, e.g. `Remotion` or `HTML + Playwright`.
  - `effort` (string): The reasoning effort the model ran at. One of `medium`, `high`, `max`.
  - `iterations` (string): How many rounds of feedback it took. One of `one-shot`, `few-rounds`, `many-rounds`.
  - `colors` (array of string): Dominant colours as hex without `#`, the largest share of the frame first.
- `removed` (array of RemovedVideo, required): Videos removed as duplicates. Their old page URLs redirect to the video they duplicated.
  - `slug` (string, required): The removed video's slug.
  - `duplicateOf` (string, required): Slug of the video it duplicated (which may itself be removed later).
  - `tweetUrl` (string (uri), required)

Example:

```json
{
  "importedAt": "2026-10-24T21:04:06.396Z",
  "videos": [
    {
      "slug": "stephanlivera-df17a2",
      "title": "Claude motion designer showreel",
      "date": "2026-09-25",
      "tags": [
        "prompt"
      ],
      "contentTags": [
        "kinetic-type",
        "shapes",
        "music"
      ],
      "promptShared": true,
      "handle": "stephanlivera",
      "prompt": "make a dynamic 15-second motion graphics video that shows what an incredible motion designer you are, like it's your showreel for a résumé. go all out.",
      "avatar": "https://assets.motionvideo.xyz/avatars/stephanlivera-b812a8857d.webp",
      "poster": "https://assets.motionvideo.xyz/motion/stephanlivera-df17a2/poster-f2e1162434.webp",
      "blur": "data:image/webp;base64,UklGRjwAAABXRUJQVlA4IDAAAAAwAQCdASoQAAkAAoBCJZwAA3AA/vhFoHeXAMvl50Xzx1TOS+ixn4fsDcDIAjAsAAA=",
      "preview": "https://assets.motionvideo.xyz/motion/stephanlivera-df17a2/preview-b43ead41b8.mp4",
      "video": "https://assets.motionvideo.xyz/motion/stephanlivera-df17a2/video-5f45198f0d.mp4",
      "width": 1920,
      "height": 1080,
      "tweetUrl": "https://x.com/stephanlivera/status/2103315922098470926",
      "model": "Opus 5.5",
      "effort": "max",
      "creatorName": "Stephan Livera",
      "colors": [
        "0d0d10",
        "ed4938",
        "8b0703"
      ]
    }
  ],
  "removed": [
    {
      "slug": "rossaxbt-94583b",
      "duplicateOf": "rossaxbt-4e066d",
      "tweetUrl": "https://x.com/rossaxbt/status/2108933141406638456"
    }
  ]
}
```

### 304

Not modified: `If-None-Match` matched the current `ETag`. No body; reuse the copy you have.

| Header | Description |
| --- | --- |
| `ETag` | Quoted SHA-256 hex digest of the response body. Changes whenever the data does. |