Key concepts
Response format
Every response on the API is wrapped in a consistent envelope.
Success
{
"success": true,
"data": { /* ... */ }
}Error
{
"success": false,
"statusCode": 403,
"code": "INSUFFICIENT_SCOPE",
"message": "This credential is missing the render:write scope",
"path": "/v1/templates/tpl_123/render",
"timestamp": "2026-09-08T12:00:00.000Z"
}A render response — the shape returned inside data — looks like:
Render response
{
"id": "rnd_789",
"templateId": "tpl_123",
"format": "png",
"url": "https://.../rnd_789.png",
"byteSize": 482113,
"width": 1080,
"height": 1080,
"createdAt": "...",
"credits": { "charged": 1, "balanceAfter": 1879 }
}| Param | Type | Notes |
|---|---|---|
| id | string | Unique id of this render. |
| templateId | string | The template that was rendered. |
| format | "png" | "jpeg" | "pdf" | |
| url | string | Hosted URL of the rendered file. |
| byteSize | number | |
| width / height | number | Pixel dimensions of the rendered file. |
| createdAt | string (ISO 8601) | |
| credits.charged | number | 0 if this exact render already existed (see idempotencyKey). |
| credits.balanceAfter | number | Remaining credits on the plan. |
Requesting allPages with a raster format (png/jpeg) returns an array under pages instead of a single render object — one entry per page, each shaped like the response above.