# Get the directories

> The tools, skills, extras (articles and resources) and creatives (studios and designers) directories.

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

## 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/directories
```

## Responses

### 200

The resource directories.

| 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 directories were last imported.
- `tools` (object, required): Tools, plus skills (category `Skills`), web articles (`Articles`) and resources (`Resources`); the site lists the last three under Skills and Extras.
  - `entries` (array of DirectoryEntry, required)
    - `id` (string, required)
    - `name` (string, required)
    - `description` (string, required)
    - `category` (string, required): e.g. `Editor`, `AI`, `Skills`, `Studio`.
    - `url` (string (uri), required)
    - `cover` (string | null (uri), required): Cover image (WebP), or `null` without one.
    - `addedAt` (string (date), required): When the entry joined the directory (YYYY-MM-DD).
    - `pricing` (string): Tools only. One of `free`, `freemium`, `open-source`, `paid`.
    - `stars` (integer): Skills only: GitHub stars.
    - `updatedAt` (string (date-time)): Skills only: the repository's last push.
    - `renderers` (array of string): Skills only: what renders the video, most central first. One of `remotion`, `hyperframes`, `html`, `manim`, `adobe`, `blender`, `video-models`, `ffmpeg`.
    - `specialties` (array of string): Studios and designers only: what they're known for, strongest first. One of `product-films`, `explainers`, `3d`, `brand`, `ui-motion`.
    - `resourceType` (string): Resources only. One of `library`, `examples`, `prompts`, `directory`, `archive`.
    - `publishedAt` (string (date-time)): Articles only: when it was published.
- `studios` (object, required): Studios (category `Studio`) and designers (`Designers`), listed on the site as Creatives.
  - `entries` (array of DirectoryEntry, required)
    - `id` (string, required)
    - `name` (string, required)
    - `description` (string, required)
    - `category` (string, required): e.g. `Editor`, `AI`, `Skills`, `Studio`.
    - `url` (string (uri), required)
    - `cover` (string | null (uri), required): Cover image (WebP), or `null` without one.
    - `addedAt` (string (date), required): When the entry joined the directory (YYYY-MM-DD).
    - `pricing` (string): Tools only. One of `free`, `freemium`, `open-source`, `paid`.
    - `stars` (integer): Skills only: GitHub stars.
    - `updatedAt` (string (date-time)): Skills only: the repository's last push.
    - `renderers` (array of string): Skills only: what renders the video, most central first. One of `remotion`, `hyperframes`, `html`, `manim`, `adobe`, `blender`, `video-models`, `ffmpeg`.
    - `specialties` (array of string): Studios and designers only: what they're known for, strongest first. One of `product-films`, `explainers`, `3d`, `brand`, `ui-motion`.
    - `resourceType` (string): Resources only. One of `library`, `examples`, `prompts`, `directory`, `archive`.
    - `publishedAt` (string (date-time)): Articles only: when it was published.

Example:

```json
{
  "importedAt": "2026-10-09T09:35:15.947Z",
  "tools": {
    "entries": [
      {
        "id": "osmo",
        "name": "Osmo",
        "description": "Make stories that move",
        "category": "AI",
        "url": "https://osmo.inc/",
        "cover": "https://assets.motionvideo.xyz/directories/tools/osmo-caab90410f.webp",
        "addedAt": "2026-10-10",
        "pricing": "freemium"
      },
      {
        "id": "oil-motion",
        "name": "Oil Motion",
        "description": "Interactive web animations for agents",
        "category": "Skills",
        "url": "https://github.com/oil-oil/oil-motion",
        "cover": "https://assets.motionvideo.xyz/directories/tools/oil-motion-87c4f3901e.webp",
        "stars": 2682,
        "updatedAt": "2026-10-04T14:54:13Z",
        "addedAt": "2026-10-10",
        "renderers": [
          "html"
        ]
      }
    ]
  },
  "studios": {
    "entries": [
      {
        "id": "pixelframe",
        "name": "Pixel Frame",
        "description": "Motion studio for Web3 and SaaS",
        "category": "Studio",
        "url": "https://www.pixelframe.co/",
        "cover": "https://assets.motionvideo.xyz/directories/studios/pixelframe-859e56d981.webp",
        "addedAt": "2026-10-10",
        "specialties": [
          "product-films",
          "brand"
        ]
      }
    ]
  }
}
```

### 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. |