---
title: "Get render job status"
method: GET
path: "/render/status/{id}"
---

# Get render job status

`GET /render/status/{id}`

## Request

- Base URL: `https://rendry.io/api/v1`
- URL: `https://rendry.io/api/v1/render/status/{id}`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

## Path parameters

- `id` string, required

## Headers

- `X-Rendry-Account` string

## Response `200`

Status

- RenderJobStatus
  - `job_id` string
  - `status` 'queued' | 'processing' | 'done' | 'error'
  - `result_url` string: Download URL through the API file proxy. New paid document attempt results require the same authenticated owner and use private/no-store caching; obsolete attempts are refused. Historical public render links retain their existing policy.
  - `error` string
  - `created_at` string
  - `started_at` string
  - `completed_at` string
  - `format` string: Output format of the finished job: png | jpeg | webp | pdf | html.
  - `warnings` string[]: Visible warnings from admission and the active worker; paid documents retain bounded per-source snapshots. warnings_omitted explains omitted findings. Compliance receipts use a protected typed field.
  - `geometry` RenderGeometry: Geometry of the successful render attempt, bound to job_id and attempt_id. Layout is the DSL coordinate space. Scale layout to pre_finish, map finish.source_rect to finish.destination_rect when present, then scale output to the actual displayed image. Without finish, pre_finish equals output. Display resizing never changes this report. Absent on legacy jobs or document results without raster geometry.
    - `version` 1, required
    - `job_id` string, required
    - `attempt_id` string, required
    - `layout` RenderGeometrySize, required: Positive raster dimensions in pixels.
      - `width` integer, required
      - `height` integer, required
    - `pre_finish` RenderGeometrySize, required: Positive raster dimensions in pixels.
      - `width` integer, required
      - `height` integer, required
    - `output` RenderGeometrySize, required: Positive raster dimensions in pixels.
      - `width` integer, required
      - `height` integer, required
    - `finish` RenderGeometryFinish: source_rect is in pre_finish; destination_rect is in output. These rectangles define the transform. source_bounds is diagnostic alpha in pre_finish; artwork_bounds and finished_bounds are diagnostic alpha in output. Alpha bounds never replace the transform.
      - `profile_id` string, required
      - `source_rect` RenderGeometryRect, required: Half-open integer pixel-edge rectangle. Transform rectangles have positive extents and are contained in their raster space. Diagnostic alpha bounds may be the all-zero rectangle for empty alpha.
        - `x` integer, required
        - `y` integer, required
        - `width` integer, required
        - `height` integer, required
      - `destination_rect` RenderGeometryRect, required: Half-open integer pixel-edge rectangle. Transform rectangles have positive extents and are contained in their raster space. Diagnostic alpha bounds may be the all-zero rectangle for empty alpha.
        - `x` integer, required
        - `y` integer, required
        - `width` integer, required
        - `height` integer, required
      - `source_bounds` RenderGeometryRect, required: Half-open integer pixel-edge rectangle. Transform rectangles have positive extents and are contained in their raster space. Diagnostic alpha bounds may be the all-zero rectangle for empty alpha.
        - `x` integer, required
        - `y` integer, required
        - `width` integer, required
        - `height` integer, required
      - `artwork_bounds` RenderGeometryRect, required: Half-open integer pixel-edge rectangle. Transform rectangles have positive extents and are contained in their raster space. Diagnostic alpha bounds may be the all-zero rectangle for empty alpha.
        - `x` integer, required
        - `y` integer, required
        - `width` integer, required
        - `height` integer, required
      - `finished_bounds` RenderGeometryRect, required: Half-open integer pixel-edge rectangle. Transform rectangles have positive extents and are contained in their raster space. Diagnostic alpha bounds may be the all-zero rectangle for empty alpha.
        - `x` integer, required
        - `y` integer, required
        - `width` integer, required
        - `height` integer, required
  - `geometry_error` string: Invalid or inconsistent recorded geometry; geometry is omitted. The completed result URL remains available. Do not infer a replacement transform from image dimensions.
  - `page_previews` PagePreview[]: pdf only: the available pictures of the requested pages, up to 3 and free of extra charge. Empty while pending; page_preview_status explicitly names requested and missing pages. Pictures of an unfinished job are never advertised.
    - `page` integer: 1-based page number of the document.
    - `url` string: URL of the stored picture (image/jpeg).
    - `width` integer: Pixel width of the picture as stored, not of the pdf page.
    - `height` integer
  - `page_preview_status` PagePreviewStatus: The requested PDF page pictures and their current storage availability. pending means one or more pictures are unavailable now, including older jobs that never uploaded them; it does not promise a future upload. Re-read status to refresh without rendering or charging again.
    - `status` 'pending' | 'ready', required
    - `requested_pages` integer[], required
    - `available_pages` integer[], required
    - `missing_pages` integer[], required
  - `webhook` object: Present only when the job was queued with a webhook_url: what became of calling it. The worker calls the webhook once the job is final (one retry after 2 s).
    - `status` 'pending' | 'delivered' | 'failed' | 'blocked', required: pending — not tried yet; delivered — the endpoint answered 2xx; failed — it could not be reached or did not answer 2xx; blocked — the address is not allowed (its name resolves to a private, loopback or link-local address, or a redirect led to one). Addresses that can be judged without DNS are refused at the door with invalid_webhook_url instead.
    - `reason` string: Why, for failed and blocked. Never contains the webhook URL itself.
  - `compliance` PDFComplianceReceipt: Available only after successful upload. SHA-256 binds the exact final PDF bytes and, for facturx, actual embedded invoice bytes. Independent pinned validator versions; PDF/A-3b is explicitly selected. This does not claim PDF/UA, XRechnung or Peppol.
    - `mode` string, required
    - `version` string
    - `profile` string
    - `sha256` string, required
    - `invoice_sha256` string
    - `verapdf` string, required
    - `mustang` string
  - `text_fit` union: Paid documents return an exact-count bounded numeric summary. Historical raw arrays remain readable. Inline/image metrics retain details and wraps. Historical PDF/HTML arrays use the existing legacy summary without claiming prepared table/page provenance (text_fit_status: legacy).
    - DocumentDiagnostics
      - `version` integer
      - `pages` integer
      - `measured` integer
      - `shrunk` integer
      - `overflowed` integer
      - `header_cells` integer
      - `problems` integer
      - `summaries` TextDiagnosticSummary[]
        - `key` string
        - `layer_id` string
        - `table` boolean
        - `master` boolean
        - `measured` integer
        - `shrunk` integer
        - `overflowed` integer
        - `header_cells` integer
        - `problems` integer
        - `worst` DiagnosticProblem
          - `location` TextDiagnosticOrigin
            - `key` string: Server-created prepared structural identity; independent of generated cell IDs.
            - `layer_id` string: Safe authored layer identifier; values and paths are excluded.
            - `table` boolean
            - `master` boolean
            - `page` integer: Final page, 1-based.
            - `row` integer: Original body row, 1-based; header row zero.
            - `column` integer: Column, 1-based.
            - `header` boolean
          - `fit` TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
            - `id` string: The measured layer's own id. This is why text_fit is a list: the entry names its layer, the list does not
            - `plate` TextPlateFit: Actual unrotated text plate assembly in DSL pixels, before effects and output scaling. Text coordinates identify the logical text box, not tight glyph bounds.
              - …
            - `rotation_origin` TextRotationOrigin: Actual pre-transform assembly center of ordinary raster text relative to the layer origin, in DSL pixels. Half-pixel centers are preserved.
              - …
            - `size` integer: The size that was asked for
            - `fitted_size` integer: The size auto_fit settled on; equal to size when nothing shrank
            - `text_w` integer: Width of the rendered text mask
            - `text_h` integer: Height of the rendered text mask
            - `box_w` integer: Declared layer width; 0 means unconstrained
            - `box_h` integer: Declared layer height; 0 means unconstrained
            - `lines` integer: Lines after wrapping, not only explicit newlines
            - `wraps` integer[]: Where the render broke the text for width: the rune offset, in the text as drawn (variables substituted, list markers and soft hyphens in place, rich_text ** pairs removed), at which each line begins because the line before it was full. A line an explicit newline starts is not listed; absent when nothing wrapped. The editor draws its lines at these offsets
            - `mask_x` integer: mask_text placement inside a shape or image
            - `mask_y` integer
            - `mask_w` integer
            - `mask_h` integer
            - `ink_top` integer: Mask offset from the logical text box; a diagnostic, not an alignment source — Pango bounds can include empty rows
            - `ink_left` integer
            - `fit_group` string: The layer's fit_group name, present only for a member of one
            - `size_alone` integer: The size this member would have taken fitted BY ITSELF, before the group levelled. Present only for a member of a fit_group; a layer in no group reports fitted_size and nothing more
            - `fit_group_size` integer: The size the group settled on — the smallest size_alone among its members. A member whose own min_size is above it keeps min_size, so fitted_size can exceed fit_group_size. Present only for a member of a fit_group
            - `origin` TextDiagnosticOrigin
              - …
        - `problem_locations` DiagnosticProblem[]
          - `location` TextDiagnosticOrigin
            - `key` string: Server-created prepared structural identity; independent of generated cell IDs.
            - `layer_id` string: Safe authored layer identifier; values and paths are excluded.
            - `table` boolean
            - `master` boolean
            - `page` integer: Final page, 1-based.
            - `row` integer: Original body row, 1-based; header row zero.
            - `column` integer: Column, 1-based.
            - `header` boolean
          - `fit` TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
            - `id` string: The measured layer's own id. This is why text_fit is a list: the entry names its layer, the list does not
            - `plate` TextPlateFit: Actual unrotated text plate assembly in DSL pixels, before effects and output scaling. Text coordinates identify the logical text box, not tight glyph bounds.
              - …
            - `rotation_origin` TextRotationOrigin: Actual pre-transform assembly center of ordinary raster text relative to the layer origin, in DSL pixels. Half-pixel centers are preserved.
              - …
            - `size` integer: The size that was asked for
            - `fitted_size` integer: The size auto_fit settled on; equal to size when nothing shrank
            - `text_w` integer: Width of the rendered text mask
            - `text_h` integer: Height of the rendered text mask
            - `box_w` integer: Declared layer width; 0 means unconstrained
            - `box_h` integer: Declared layer height; 0 means unconstrained
            - `lines` integer: Lines after wrapping, not only explicit newlines
            - `wraps` integer[]: Where the render broke the text for width: the rune offset, in the text as drawn (variables substituted, list markers and soft hyphens in place, rich_text ** pairs removed), at which each line begins because the line before it was full. A line an explicit newline starts is not listed; absent when nothing wrapped. The editor draws its lines at these offsets
            - `mask_x` integer: mask_text placement inside a shape or image
            - `mask_y` integer
            - `mask_w` integer
            - `mask_h` integer
            - `ink_top` integer: Mask offset from the logical text box; a diagnostic, not an alignment source — Pango bounds can include empty rows
            - `ink_left` integer
            - `fit_group` string: The layer's fit_group name, present only for a member of one
            - `size_alone` integer: The size this member would have taken fitted BY ITSELF, before the group levelled. Present only for a member of a fit_group; a layer in no group reports fitted_size and nothing more
            - `fit_group_size` integer: The size the group settled on — the smallest size_alone among its members. A member whose own min_size is above it keeps min_size, so fitted_size can exceed fit_group_size. Present only for a member of a fit_group
            - `origin` TextDiagnosticOrigin
              - …
        - `omitted_problem_locations` integer
      - `omitted_summaries` integer
      - `omitted_measurements` integer
      - `omitted_problem_locations` integer
      - `policy` DiagnosticPolicy
        - `version` integer
        - `max_bytes` integer
        - `max_entries` integer
        - `max_problem_locations` integer
    - union[]
      - union
        - TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
          - `id` string: The measured layer's own id. This is why text_fit is a list: the entry names its layer, the list does not
          - `plate` TextPlateFit: Actual unrotated text plate assembly in DSL pixels, before effects and output scaling. Text coordinates identify the logical text box, not tight glyph bounds.
            - `x` integer, required: Plate left relative to the layer origin
            - `y` integer, required: Plate top relative to the layer origin
            - `width` integer, required: Assembled plate width after minimum size and circle sizing
            - `height` integer, required: Assembled plate height after minimum size and circle sizing
            - `text_x` integer, required: Logical text origin inside the plate, including stroke and bearing placement
            - `text_y` integer, required: Logical text origin inside the plate
            - `text_width` integer, required: Resolved advance or constrained wrap width
          - `rotation_origin` TextRotationOrigin: Actual pre-transform assembly center of ordinary raster text relative to the layer origin, in DSL pixels. Half-pixel centers are preserved.
            - `x` number, required
            - `y` number, required
          - `size` integer: The size that was asked for
          - `fitted_size` integer: The size auto_fit settled on; equal to size when nothing shrank
          - `text_w` integer: Width of the rendered text mask
          - `text_h` integer: Height of the rendered text mask
          - `box_w` integer: Declared layer width; 0 means unconstrained
          - `box_h` integer: Declared layer height; 0 means unconstrained
          - `lines` integer: Lines after wrapping, not only explicit newlines
          - `wraps` integer[]: Where the render broke the text for width: the rune offset, in the text as drawn (variables substituted, list markers and soft hyphens in place, rich_text ** pairs removed), at which each line begins because the line before it was full. A line an explicit newline starts is not listed; absent when nothing wrapped. The editor draws its lines at these offsets
          - `mask_x` integer: mask_text placement inside a shape or image
          - `mask_y` integer
          - `mask_w` integer
          - `mask_h` integer
          - `ink_top` integer: Mask offset from the logical text box; a diagnostic, not an alignment source — Pango bounds can include empty rows
          - `ink_left` integer
          - `fit_group` string: The layer's fit_group name, present only for a member of one
          - `size_alone` integer: The size this member would have taken fitted BY ITSELF, before the group levelled. Present only for a member of a fit_group; a layer in no group reports fitted_size and nothing more
          - `fit_group_size` integer: The size the group settled on — the smallest size_alone among its members. A member whose own min_size is above it keeps min_size, so fitted_size can exceed fit_group_size. Present only for a member of a fit_group
          - `origin` TextDiagnosticOrigin
            - `key` string: Server-created prepared structural identity; independent of generated cell IDs.
            - `layer_id` string: Safe authored layer identifier; values and paths are excluded.
            - `table` boolean
            - `master` boolean
            - `page` integer: Final page, 1-based.
            - `row` integer: Original body row, 1-based; header row zero.
            - `column` integer: Column, 1-based.
            - `header` boolean
        - union: Historical read-side summaries. These preserve repeat/page/table totals without claiming prepared document provenance.
          - object
            - `id` string, required
            - `worst` TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
              - …
            - `problem_cells` TextFit[]
              - …
            - `note` string
            - `collapsed_clones` true, required
            - `collapsed_pages` true
            - `collapsed_table_cells` true
            - `rows` integer
            - `measured` integer
            - `worst_row` integer
            - `worst_page` integer
            - `cells` integer
            - `header_cells` integer
            - `shrunk` integer
            - `overflowed` integer
            - `shrunk_rows_more` integer
            - `overflowed_rows_more` integer
            - `problem_cells_more` integer
            - `shrunk_rows` integer[]
            - `overflowed_rows` integer[]
            - `shrunk_pages` integer[]
            - `overflowed_pages` integer[]
          - object
            - `id` string, required
            - `worst` TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
              - …
            - `problem_cells` TextFit[]
              - …
            - `note` string
            - `collapsed_clones` true
            - `collapsed_pages` true, required
            - `collapsed_table_cells` true
            - `rows` integer
            - `measured` integer
            - `worst_row` integer
            - `worst_page` integer
            - `cells` integer
            - `header_cells` integer
            - `shrunk` integer
            - `overflowed` integer
            - `shrunk_rows_more` integer
            - `overflowed_rows_more` integer
            - `problem_cells_more` integer
            - `shrunk_rows` integer[]
            - `overflowed_rows` integer[]
            - `shrunk_pages` integer[]
            - `overflowed_pages` integer[]
          - object
            - `id` string, required
            - `worst` TextFit: What the finished render MEASURED for one text layer. Every number is in DSL layout coordinates.
              - …
            - `problem_cells` TextFit[]
              - …
            - `note` string
            - `collapsed_clones` true
            - `collapsed_pages` true
            - `collapsed_table_cells` true, required
            - `rows` integer
            - `measured` integer
            - `worst_row` integer
            - `worst_page` integer
            - `cells` integer
            - `header_cells` integer
            - `shrunk` integer
            - `overflowed` integer
            - `shrunk_rows_more` integer
            - `overflowed_rows_more` integer
            - `problem_cells_more` integer
            - `shrunk_rows` integer[]
            - `overflowed_rows` integer[]
            - `shrunk_pages` integer[]
            - `overflowed_pages` integer[]
  - `text_fit_status` 'pending' | 'unavailable' | 'invalid' | 'collapsed' | 'detailed' | 'legacy'
  - `text_fit_error` string
  - `warnings_omitted` integer: Exact findings omitted by the paid document count/encoded-byte policy, including oversized entries; replay does not increase this count.
  - `warnings_status` 'pending' | 'unavailable' | 'available' | 'invalid'
  - `warnings_error` string
  - `diagnostics_policy` DiagnosticPolicy
    - `version` integer
    - `max_bytes` integer
    - `max_entries` integer
    - `max_problem_locations` integer
  - `print_receipt` PDFPrintReceipt: Protected receipt bound to the exact uploaded and owner-downloadable final PDF bytes and immutable APTEC profile. Exposed only for the selected done attempt; omitted for ordinary/historical RGB results. This receipt makes no PDF/X certification claim.
    - `version` 1, required
    - `profile` 'aptec-offset-coated-linearctv-2025-v1', required
    - `profile_sha256` '2a0a26387276046dc129d4330a7a45542b736c8640e3ec4cb74df809c5ccfb0e', required
    - `sha256` string, required
    - `color_space` 'CMYK', required
    - `intent` 'relative-colorimetric', required
    - `black_point_compensation` true, required
    - `preflight` PDFPrintPreflight, required: Counts from independent inspection of the actual final CMYK PDF resource graph; effective raster placement resolution is checked against the product print DPI. Low resolution is reported, not silently upsampled.
      - `pages` integer, required
      - `images` integer, required
      - `shadings` integer, required
      - `painted_streams` integer, required
      - `raster_below_300_dpi` integer, required
      - `minimum_dpi` number
  - `expires_at` string, date-time: Persisted server-owned artifact deadline.

## Other responses

- `404`: Job not found — the same answer for an id that does not exist and for another account's job

---

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