GET /v1/content/:containerId/progress
Fine-grained generation progress on a container. Prefer GET /v1/jobs/:id for most uses.
/v1/content/:containerId/progress- Auth
- Bearer
- Scope
- content:read
Returns the container's generation progress at a finer grain than GET /v1/content/:containerId. Meant for progress bars in end-customer UIs where you want to update a percentage or status line without repeatedly pulling the whole container record.
For most programmatic work, GET /v1/jobs/:jobId is what you want. Use this endpoint when you don't have a jobId handy - for example, you're reading from a list of containers and need per-container status without a separate lookup.
Path parameters
containerIdstring (uuid)requiredThe container id.
Request
curl https://api.layers.com/v1/content/{containerId}/progress \
-H "Authorization: Bearer $LAYERS_API_KEY"const res = await fetch(
`https://api.layers.com/v1/content/${containerId}/progress`,
{ headers: { 'Authorization': `Bearer ${process.env.LAYERS_API_KEY}` } },
);
const progress = await res.json();import os, httpx
r = httpx.get(
f"https://api.layers.com/v1/content/{container_id}/progress",
headers={"Authorization": f"Bearer {os.environ[\'LAYERS_API_KEY\']}"},
)
progress = r.json()Responses
{
"containerId": "cnt_7d18b9a1...",
"status": "processing",
"stage": "generating_visuals",
"stageProgress": 0.42,
"etaSeconds": 38,
"updatedAt": "2026-04-18T09:30:04Z"
}{
"containerId": "cnt_7d18b9a1...",
"status": "completed",
"stage": "finalizing",
"stageProgress": 1.0,
"etaSeconds": null,
"updatedAt": "2026-04-18T09:32:11Z"
}{
"containerId": "cnt_7d18b9a1...",
"status": "failed",
"stage": "generating_visuals",
"stageProgress": 0.3,
"etaSeconds": null,
"updatedAt": "2026-04-18T09:30:41Z"
}Field semantics
stageProgressis a 0.0–1.0 float. For multi-stage jobs, it resets to 0 at each stage transition rather than advancing monotonically across stages.etaSecondsis a best-effort estimate. May benullwhen the stage doesn't have a historical baseline (fresh project, unusual format).statusmirrors the container status -queued,processing,completed,failed, orcanceled.
Polling pattern
Poll often enough for your UI, and back off when the stage is not changing. If you're running an agent that just needs to know "done or not", poll GET /v1/jobs/:jobId at the job level instead.
It's the same data shape for every job kind, so one poll loop covers every async call in the API.
Errors
| Code | When |
|---|---|
NOT_FOUND | Container id not in this org. |
FORBIDDEN_SCOPE | Key lacks content:read. |