Job status
/creations/{id}Every generation request returns a creation id — poll this endpoint to track it to completion. {id} accepts either the creation UUID or the task_id from the 202 response. Results are scoped to your account: an id that doesn't exist or belongs to someone else returns the same 404 ERR_NOT_FOUND.
curl https://api.rendergrid.io/api/public/v1/creations/c0ea4d5b-c965-4943-aaad-76fda0c53ca9 \
-H "Authorization: Bearer rg_live_xxx"Statuses
queued— accepted and waiting for a worker.processing— generation is running.completed— terminal; results are ready inresult_urls.failed— terminal; the charge has been refunded anderrordescribes what happened.
Response fields
The response always contains id and status. While the creation is in progress, that's the whole body:
{"id": "5b0214ae-9e39-460a-820a-f6ae3e24400b", "status": "queued"}
{"id": "5b0214ae-9e39-460a-820a-f6ae3e24400b", "status": "processing"}result_urls (a list of output URLs) is present only when the creation is completed:
{
"id": "c0ea4d5b-c965-4943-aaad-76fda0c53ca9",
"status": "completed",
"result_urls": [
"https://cdn.rendergrid.io/images/2026/07/02/d13e03c7-7897-48b5-8571-8cd1e78e5f45/8b5f7dcb_20260702_100059_0f9a5d99_req_c0ea4d5b.jpg"
]
}error is present only when it failed and is a sanitized, human-readable message — never raw provider output. A failed creation has already been refunded in full:
{
"id": "…",
"status": "failed",
"error": "…a sanitized, human-readable reason…"
}Polling rules
The minimum polling interval is 5 seconds per creation per API key — it is enforced server-side. Polling faster returns 429 ERR_RATE_LIMIT with a Retry-After header:
HTTP/1.1 429 Too Many Requests
Retry-After: 2
{
"error": {
"code": "ERR_RATE_LIMIT",
"message": "polled too soon — retry after the minimum interval",
"details": { "min_interval_seconds": 5 }
}
}A robust poller sleeps 5 seconds between polls and, on any 429, honors Retry-After before trying again:
CREATION_ID="5b0214ae-9e39-460a-820a-f6ae3e24400b"
URL="https://api.rendergrid.io/api/public/v1/creations/$CREATION_ID"
while true; do
HTTP_CODE=$(curl -s -o body.json -D headers.txt -w '%{http_code}' "$URL" \
-H "Authorization: Bearer rg_live_xxx")
if [ "$HTTP_CODE" = "429" ]; then
RETRY=$(grep -i '^retry-after:' headers.txt | tr -dc '0-9')
sleep "${RETRY:-5}"
continue
fi
STATUS=$(jq -r '.status' body.json)
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then
cat body.json
break
fi
sleep 5
doneAt scale, prefer webhooks — we call you the moment the creation reaches a terminal status.