Layers
Partner APIAPI referenceContent

GET /v1/projects/:projectId/content

List content containers on a project, filtered by status, format, and time range.

View as Markdown
GET/v1/projects/:projectId/content
Phase 1stable
Auth
Bearer
Scope
content:read

Cursor-paginated list of containers, newest first. Filter by generation status, format, or a time window.

Path parameters

  • projectId
    string (uuid)required
    Project to list containers for.

Query parameters

  • status
    string | string[]optional
    Filter on generation status. Repeat the param to combine.
    One of: queued, generating, completed, failed, canceled
  • format
    string | string[]optional
    Filter on format.
    One of: video_remix, slideshow_remix, ugc_remix, auto
  • since
    string (ISO-8601)optional
    Only containers created at or after this timestamp.
  • until
    string (ISO-8601)optional
    Only containers created at or before this timestamp.
  • cursor
    stringoptional
    Opaque cursor from the previous page. Pass the `nextCursor` value verbatim — do not decode or modify it. Cursors are bound to the original sort (created_at desc).
  • limit
    integeroptionaldefault: 25
    Max 200.

Request

terminal
curl "https://api.layers.com/v1/projects/{projectId}/content?status=completed&limit=20" \
  -H "X-Api-Key: $LAYERS_API_KEY"
list-containers.ts
const params = new URLSearchParams({
  status: 'completed',
  limit: '50',
});
const res = await fetch(
  `https://api.layers.com/v1/projects/${projectId}/content?${params}`,
  { headers: { 'X-Api-Key': process.env.LAYERS_API_KEY! } },
);
const { items, nextCursor } = await res.json();
list_containers.py
import os, httpx

r = httpx.get(
    f"https://api.layers.com/v1/projects/{project_id}/content",
    params={"status": ["completed", "failed"], "format": ["video_remix"]},
    headers={"X-Api-Key": os.environ["LAYERS_API_KEY"]},
)
data = r.json()

Responses

200Page of containers.
{
  "items": [
    {
      "id": "cnt_01HXZ9...",
      "status": "completed",
      "format": "video_remix",
      "caption": "Your first 30 days of running.",
      "approvalStatus": "pending",
      "createdAt": "2026-04-17T13:10:00Z",
      "completedAt": "2026-04-17T13:14:22Z",
      "primaryAsset": {
        "assetId": "ast_01HXZ9...",
        "kind": "video",
        "thumbnailUrl": "https://media.layers.com/.../cnt_01HXZ9/thumb.jpg",
        "durationMs": 9200
      }
    }
  ],
  "nextCursor": "eyJjcmVhdGVkQXQiOiIyMDI2LTA0LTE3VDEzOjEwOjAwWiIsImlkIjoiNzg5NGIxZDUtMmFhNy00MWY5LWE4NTktMjgwMzA2ZWE1NjcyIn0"
}

Common filters

  • Rescue failed jobs. status=failed&since=2026-04-01T00:00:00Z — sweep for broken containers to regenerate.
  • In-flight work. status=queued&status=generating — everything currently being produced.
  • UGC-only. format=ugc_remix — if you're running a separate UGC review flow from brand content.

Errors

CodeWhen
VALIDATION_FAILEDBad enum value, limit > 200.
NOT_FOUNDProject id not in this org.

See also

On this page