---
title: "Get a render and a fresh signed URL"
method: GET
path: "/v1/renders/{id}"
tags: ["Renders"]
---

# Get a render and a fresh signed URL

`GET /v1/renders/{id}`

## Request

- Base URL: `https://api.galleyrender.com`
- URL: `https://api.galleyrender.com/v1/renders/{id}`
- Auth: HTTP bearer

Signed URLs expire after an hour; the stored file is kept until the render's `expires_at` (your plan's retention when it was made). Until then, call this again for a new URL rather than re-rendering — it costs nothing. After it, this answers `410 retention_expired` and the file is deleted; render again to have it back.

## Path parameters

- `id` string, required

## Response `200`

The render.

- Render
  - `object` 'render', required
  - `id` string, required
  - `status` 'queued' | 'processing' | 'succeeded' | 'failed', required
  - `template` string, required: The resolved `name@version`.
  - `format` 'pdf' | 'png' | 'jpg', required
  - `engine` 'chromium' | 'satori', required
  - `cached` boolean, required: True when the stored object was reused. A cache hit is never billed.
  - `url` string, uri, nullable, required: Signed URL to the file. Expires in an hour by default; the stored file lasts until `expires_at`. `null` while the render is unfinished, when it failed, and once `expires_at` has passed.
  - `expires_at` string, date-time, nullable: The end of the file's retention, fixed when the render is made from the account's plan. After it the render is no longer a cache hit, `GET /v1/renders/{id}` answers `410 retention_expired`, and the file is deleted by a daily sweep. Not the signed URL's expiry.
  - `page_count` integer, nullable: Pages in the PDF; 1 for raster output.
  - `billable_units` integer, nullable: 1 per PNG/JPG, 1 per PDF page.
  - `byte_size` integer, nullable
  - `content_type` string, nullable
  - `created_at` string, date-time, required
  - `completed_at` string, date-time, nullable
  - `error` unknown
  - `webhook_status` 'pending' | 'delivered' | 'failed' | 'null', nullable: `null` when no `webhook_url` was given. `pending` while delivery is still being attempted, `delivered` once your endpoint answered 2xx, `failed` once all attempts were used.
  - `webhook_attempts` integer: Delivery attempts made so far.
  - `batch_id` string: Present only for batch items.
  - `warnings` Warning[]: What the request carried that the template did not use, possibly empty. Present on the `POST /v1/render` response (200 and 202) and on every batch item that is not an error. It describes the request, not the render: it is not stored, so `GET /v1/renders/{id}`, `GET /v1/renders` and webhook bodies do not carry it.
    - union: Something about the request that did not stop it. Paths and schema key names only, never a value; at most 20 per response. Discriminated by `type`.
      - object
        - `type` 'unknown_field', required
        - `path` string, required: Where the field is, e.g. `data.deposit`.
        - `message` string, required
        - `did_you_mean` string: The path of the field the template does have, when one is close or a known alias.
      - object
        - `type` 'unsupported_language', required
        - `path` string, required
        - `message` string, required
        - `supported` string[], required: The languages this template has translated text for.
      - object: Language support is switched off on this service, so `data.lang` and `data.labels` were not applied: the fixed text is English, dates and money are formatted for en-US and the paper size is the template's own. Send the same request again later for the document in your language.
        - `type` 'i18n_disabled', required
        - `path` string, required: `data.lang`, or `data.labels` when only labels were sent.
        - `message` string, required
      - object: A PNG made with the Satori engine whose data holds characters outside the Latin fonts the template embeds. Satori has no fallback face, so they render as empty boxes; render with `format: "pdf"` to have them drawn with system fonts.
        - `type` 'font_coverage', required
        - `path` string, required: The first field that holds such text. The text itself is never quoted.
        - `message` string, required
  - `file_deleted_at` string, date-time, nullable: When the file was deleted because its retention had passed. `null` until then. The render record itself is kept; the `data` and `options` it was made from are deleted with the file.

## Other responses

- `401`: `authentication_error`.
- `404`: `not_found` — no render with that id on this account.
- `410`: `retention_expired` — the render's file has passed its retention (`expires_at`) and is deleted, or is about to be. The render itself is in `details.render`, every field, with `url: null` and `file_deleted_at`; `details.rerender` is the request that makes the document again (a new, billed render).

---

[API](https://skmtc.dev/galleyrender/apis/galley-render-api.md) · [All operations](https://skmtc.dev/galleyrender/apis/galley-render-api/llms.txt) · [OpenAPI document](https://skmtc.dev/galleyrender/apis/galley-render-api/revisions/a85d68468cd2?raw)
