/api/v1/:workspace/rendersList render artifacts
Workspace-scoped list of every persisted render artifact (one row per /generate, one per /bulk-sync ZIP) whose expiresAt is still in the future. Rows past their retention TTL are excluded. Returns {renders, meta}; default sort is createdAt:desc.
Parameters
workspacepath | Workspace slug.required |
templateIdquery | Only artifacts produced by this template. |
limitquery | 1 – 100 (default 50) |
offsetquery | Rows to skip (default 0). |
sortByquery | createdAt | expiresAt, suffixed with :asc or :desc. |
totalResultsquery | true to include meta.total. |
Response
{
"renders": [
{
"id": "…",
"templateId": "…",
"contentType": "application/pdf",
"filename": "Invoice-42.pdf",
"bytes": 23428,
"expiresAt": "2026-07-09T22:46:04.000Z",
"createdAt": "2026-06-09T22:46:04.000Z"
}
],
"meta": {
"count": 1,
"limit": 50,
"offset": 0,
"hasMore": false
}
}/api/v1/:workspace/renders/:id/urlRefresh a render URL
Mints a fresh presigned URL against the same artifact. Use this when urlExpiresAt has passed but expiresAt is still in the future. The new URL is capped at 7 days (or the artifact's remaining lifetime, whichever is shorter).
Parameters
workspacepath | Workspace slug.required |
idpath | renderId from the /generate or /bulk response.required |
Response
{
"url": "https://…",
"urlExpiresAt": "2026-06-16T22:46:04.000Z",
"expiresAt": "2026-07-09T22:46:04.000Z",
"filename": "Invoice-42.pdf",
"bytes": 23428,
"contentType": "application/pdf"
}410 render_expired means the artifact's expiresAt has passed. Re-render to get a fresh one.
Subscribe to the render.url_expiring webhook to be notified ~24 h before each URL closes.
Need help?
Open a ticket from the in-app Support page, or email [email protected].