rendry-io · Schema

DocumentRequest

CompanyImage RenderingPDF GenerationTemplate EngineAPIAI Integration

Properties

Name Type Description
document_id string Saved template from GET /documents. Either this or pages
pages array
dynamic_data object Shared substitutions for pages without their own
rows object Rows for every page's top-level tables bound to rows_key. A page's own rows win; an absent key retains sample rows, while an explicit empty array clears them. With row_height > 0, body rows paginate i
dry_run boolean Count, do not draw: page count, price and the layers that will be rasterized. No job, no file, no credits spent
format string pdf (default) | html — one self-contained HTML file, pages stacked with print page breaks. html_embed is the same format under its older name
webhook_url string POST-ed {job_id,status,result_url} once the document is done; the outcome of that call is reported as webhook on GET /render/status/{id}. Must be an http or https address on the public internet: an un
compliance object
rows_refs object Page source overrides either document-wide source kind; same-scope rows+rows_refs for the same key refuses, including empty inline rows
print object
watermark object
master array Default master layers; saved default is used when a document_id request supplies none. Every layer, including nested children, accepts an optional literal printable single-line Unicode name label. Abs
master_first arraynull Replacement master for physical page 1, selected after pagination. Omitted/null inherits default; [] is blank. With document_id, omitted/null keeps the saved variant; reset inheritance by saving the d
master_even arraynull Replacement master for other even physical pages, selected after pagination. Omitted/null inherits default; [] is blank. With document_id, omitted/null keeps the saved variant; reset inheritance by sa
pdf_password object
variables arraynull Shared authored definitions, evaluated independently in each page context. Page definitions replace complete source/mode/format tuples. Literal page dynamic_data overrides request dynamic_data, which
deliver_to object
View JSON Schema on GitHub

JSON Schema

rendry-io-document-request-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/rendry-io/json-schema/rendry-io-document-request-schema.json",
  "title": "DocumentRequest",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/rendry-io-openapi.json#/components/schemas/DocumentRequest",
  "type": "object",
  "properties": {
    "document_id": {
      "type": "string",
      "description": "Saved template from GET /documents. Either this or pages"
    },
    "pages": {
      "type": "array",
      "maxItems": 20,
      "items": {
        "$ref": "#/$defs/DocumentPage"
      }
    },
    "dynamic_data": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Shared substitutions for pages without their own"
    },
    "rows": {
      "type": "object",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "description": "Rows for every page's top-level tables bound to rows_key. A page's own rows win; an absent key retains sample rows, while an explicit empty array clears them. With row_height > 0, body rows paginate in order and the header repeats. Row/cell limits apply to each final page for supplied document rows. At most 20 authored pages and 200 final pages; dry_run quotes the exact row_ranges and cost before submission."
    },
    "dry_run": {
      "type": "boolean",
      "description": "Count, do not draw: page count, price and the layers that will be rasterized. No job, no file, no credits spent"
    },
    "format": {
      "type": "string",
      "enum": [
        "pdf",
        "html",
        "html_embed"
      ],
      "description": "pdf (default) | html — one self-contained HTML file, pages stacked with print page breaks. html_embed is the same format under its older name"
    },
    "webhook_url": {
      "type": "string",
      "description": "POST-ed {job_id,status,result_url} once the document is done; the outcome of that call is reported as webhook on GET /render/status/{id}. Must be an http or https address on the public internet: an unparseable address, another scheme, an internal host name or a literal private, loopback or link-local IP is refused with 400 invalid_webhook_url before anything is priced, queued or charged."
    },
    "compliance": {
      "$ref": "#/$defs/PDFCompliance"
    },
    "rows_refs": {
      "$ref": "#/$defs/RowsReferences",
      "description": "Page source overrides either document-wide source kind; same-scope rows+rows_refs for the same key refuses, including empty inline rows"
    },
    "print": {
      "$ref": "#/$defs/PDFPrint"
    },
    "watermark": {
      "$ref": "#/$defs/RenderWatermark"
    },
    "master": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Default master layers; saved default is used when a document_id request supplies none. Every layer, including nested children, accepts an optional literal printable single-line Unicode name label. Absent, null or empty is unnamed; duplicate labels are allowed. C0 controls (U+0000–U+001F), DEL (U+007F), and line/paragraph separators (U+2028/U+2029) are refused. Emoji, RTL and combining marks are preserved. Names never render, substitute variables, or define output IDs or metadata."
    },
    "master_first": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "object"
      },
      "description": "Replacement master for physical page 1, selected after pagination. Omitted/null inherits default; [] is blank. With document_id, omitted/null keeps the saved variant; reset inheritance by saving the document. Every layer, including nested children, accepts an optional literal printable single-line Unicode name label. Absent, null or empty is unnamed; duplicate labels are allowed. C0 controls (U+0000–U+001F), DEL (U+007F), and line/paragraph separators (U+2028/U+2029) are refused. Emoji, RTL and combining marks are preserved. Names never render, substitute variables, or define output IDs or metadata."
    },
    "master_even": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "object"
      },
      "description": "Replacement master for other even physical pages, selected after pagination. Omitted/null inherits default; [] is blank. With document_id, omitted/null keeps the saved variant; reset inheritance by saving the document. Every layer, including nested children, accepts an optional literal printable single-line Unicode name label. Absent, null or empty is unnamed; duplicate labels are allowed. C0 controls (U+0000–U+001F), DEL (U+007F), and line/paragraph separators (U+2028/U+2029) are refused. Emoji, RTL and combining marks are preserved. Names never render, substitute variables, or define output IDs or metadata."
    },
    "pdf_password": {
      "$ref": "#/$defs/PDFPassword"
    },
    "variables": {
      "description": "Shared authored definitions, evaluated independently in each page context. Page definitions replace complete source/mode/format tuples. Literal page dynamic_data overrides request dynamic_data, which overrides authored definitions; final page/pages facts win. document_id inherits omitted/null variables; a supplied list replaces, [] clears. Full saves replace; no dynamic_data is persisted.",
      "items": {
        "$ref": "#/$defs/DocumentVariableDefinition"
      },
      "maxItems": 256,
      "type": [
        "array",
        "null"
      ]
    },
    "deliver_to": {
      "$ref": "#/$defs/DeliverTo"
    }
  },
  "$defs": {
    "DeliverTo": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "put_url"
      ],
      "description": "Request-only presigned HTTPS PUT capability. Presign with the output Content-Type. No userinfo, fragment, private address, proxy or redirects. DNS is rechecked at the pinned dial. Never returned, logged, queued or saved in a design. Async renders and batches only, including token-scoped guest batches.",
      "properties": {
        "put_url": {
          "type": "string",
          "format": "uri",
          "maxLength": 4096,
          "writeOnly": true,
          "description": "Byte limit matches maxLength; HTTPS on any port; must address a public server."
        }
      }
    },
    "DisplayFormat": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "number",
            "currency",
            "percent",
            "date",
            "upper",
            "lower"
          ]
        },
        "decimals": {
          "type": "integer",
          "minimum": 0,
          "maximum": 34,
          "default": 0
        },
        "grouping": {
          "type": "boolean",
          "default": false
        },
        "decimal_mark": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1,
          "default": "."
        },
        "group_mark": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1,
          "default": ","
        },
        "symbol": {
          "type": "string",
          "maxLength": 32
        },
        "symbol_position": {
          "type": "string",
          "enum": [
            "prefix",
            "suffix"
          ],
          "default": "prefix"
        },
        "prefix": {
          "type": "string",
          "maxLength": 32
        },
        "suffix": {
          "type": "string",
          "maxLength": 32
        },
        "pattern": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128,
          "default": "YYYY-MM-DD"
        }
      },
      "description": "One deterministic display vocabulary. Numbers use exact arithmetic and half away from zero rounding. Currency needs symbol (a symbol or ISO code), with explicit spacing in that text. Percent multiplies a raw ratio by 100. Dates accept strict YYYY-MM-DD only and patterns D, DD, M, MM, MMM, MMMM, YY, YYYY with English month names. upper/lower use Unicode simple case mapping; no locale or multi-character expansions. No format leaves existing text untouched. Fields unrelated to the selected type are refused."
    },
    "DocumentCanvas": {
      "type": "object",
      "description": "Canvas for a PDF or HTML page. Raster-only finish_profile is intentionally unavailable and rejected by the server.",
      "properties": {
        "width": {
          "type": "integer"
        },
        "height": {
          "type": "integer"
        },
        "background_color": {
          "type": "string"
        },
        "output_format": {
          "type": "string",
          "description": "The enclosing document render selects PDF or HTML."
        },
        "dpi": {
          "type": "integer"
        },
        "bleed": {
          "type": "integer"
        },
        "safe_area": {
          "type": "integer"
        },
        "crop_marks": {
          "type": "boolean"
        }
      },
      "not": {
        "required": [
          "finish_profile"
        ]
      },
      "additionalProperties": true
    },
    "DocumentPage": {
      "type": "object",
      "description": "A page of a RENDER request: {preset_id, dynamic_data} or the page's own {canvas, layers}. No required field: \"one of two\" is expressible only through oneOf, which clients support unevenly — the server checks the choice and its refusal names both paths.",
      "properties": {
        "canvas": {
          "$ref": "#/$defs/DocumentCanvas",
          "description": "Own page content instead of preset_id"
        },
        "layers": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Ordinary DSL layers; text layers may opt into document continuation with text_flow (see TextFlow). The authoritative native text_flows receipt is returned before charge in dry runs. Text may use text_overflow:\"clip_lines\" with positive integer max_lines and explicit width. It keeps complete native lines without an ellipsis after full-source auto_fit/fit_group; height is optional and never a second line cap. Plates size retained content; text_flow cannot truncate. Every layer, including nested children, accepts an optional literal printable single-line Unicode name label. Absent, null or empty is unnamed; duplicate labels are allowed. C0 controls (U+0000–U+001F), DEL (U+007F), and line/paragraph separators (U+2028/U+2029) are refused. Emoji, RTL and combining marks are preserved. Names never render, substitute variables, or define output IDs or metadata."
        },
        "modifications": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "An own-content page's sources for its {variables}, as PresetInput.modifications; dynamic_data overrides them"
        },
        "variable_modes": {
          "type": "object",
          "additionalProperties": {
            "type": "string",
            "enum": [
              "text",
              "template",
              "formula"
            ]
          },
          "description": "Same shape and rules as PresetInput.variable_modes: an own-content page owns its definitions, a schema problem refuses the save, an unresolvable definition refuses the render before any charge (dry_run included), and a page-dependent value (one that reads page or pages) read by the text of a paginating auto-height table is refused as circular_layout_dependency. A page that only names a preset inherits the preset's sources and modes; a reference to a preset with modes cannot also carry its own modifications or variable_modes — make it an own-content page, or pass per-call values as dynamic_data."
        },
        "derived": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "sample_rows": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            }
          }
        },
        "rows": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            }
          },
          "description": "This page's rows for a table bound to rows_key; overrides the document-wide rows"
        },
        "palettes": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        },
        "preset_id": {
          "type": "string"
        },
        "dynamic_data": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "This page's substitutions; override the document-wide dynamic_data"
        },
        "kind": {
          "type": "string",
          "enum": [
            "fixed"
          ]
        },
        "variable_formats": {
          "type": [
            "object",
            "null"
          ],
          "additionalProperties": {
            "$ref": "#/$defs/DisplayFormat"
          },
          "description": "Sparse name -> display format beside modifications and variable_modes. A name needs a source in modifications and cannot be page, pages or row.*. Applied after source evaluation and also to caller overrides; formulas consume raw exact values while templates insert formatted text. Invalid schema refuses save; invalid data refuses dry run and render before any charge, without echoing values. update_preset patches: absent or {} keeps; name:null removes; top-level null clears. Whole preset and document saves replace the map."
        },
        "rows_refs": {
          "$ref": "#/$defs/RowsReferences",
          "description": "Page source overrides either document-wide source kind; same-scope rows+rows_refs for the same key refuses, including empty inline rows"
        }
      }
    },
    "DocumentVariableDefinition": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "description": "Existing variable display format vocabulary, unchanged.",
          "type": "object"
        },
        "mode": {
          "default": "text",
          "enum": [
            "text",
            "template",
            "formula"
          ],
          "type": "string"
        },
        "name": {
          "description": "Existing variable reference grammar; names are unique within this list.",
          "maxLength": 128,
          "type": "string"
        },
        "source": {
          "maxLength": 8000,
          "type": "string"
        }
      },
      "required": [
        "name",
        "source"
      ],
      "type": "object"
    },
    "FacturXInvoice": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "number",
        "currency",
        "seller",
        "buyer",
        "iban",
        "lines",
        "issue_date",
        "delivery_date",
        "due_date"
      ],
      "properties": {
        "number": {
          "type": "string",
          "maxLength": 64
        },
        "currency": {
          "type": "string",
          "enum": [
            "EUR"
          ]
        },
        "seller": {
          "$ref": "#/$defs/FacturXParty"
        },
        "buyer": {
          "$ref": "#/$defs/FacturXParty"
        },
        "iban": {
          "type": "string",
          "description": "Valid uppercase IBAN without spaces."
        },
        "lines": {
          "type": "array",
          "minItems": 1,
          "maxItems": 6400,
          "items": {
            "$ref": "#/$defs/FacturXLine"
          }
        },
        "issue_date": {
          "type": "string",
          "format": "date"
        },
        "delivery_date": {
          "type": "string",
          "format": "date"
        },
        "due_date": {
          "type": "string",
          "format": "date"
        }
      },
      "description": "Positive ordinary EUR sales invoice (type 380), C62 integer units and SEPA payment only. Cent arithmetic; half-up VAT per group, at most eight rates. No allowances, charges, exemptions, credit notes, custom layouts or arbitrary attachments. Text must be bounded UTF-8 without controls/template braces. Due date is on/after issue date. Shared table pagination/resource admission determines final page count and price."
    },
    "FacturXLine": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "description",
        "quantity",
        "unit_price_cents",
        "vat_rate_basis_points"
      ],
      "properties": {
        "description": {
          "type": "string",
          "maxLength": 80
        },
        "quantity": {
          "type": "integer",
          "minimum": 1,
          "maximum": 1000000
        },
        "unit_price_cents": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100000000000
        },
        "vat_rate_basis_points": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        }
      }
    },
    "FacturXParty": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "name",
        "street",
        "postcode",
        "city",
        "country",
        "vat_id"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 80
        },
        "street": {
          "type": "string",
          "maxLength": 80
        },
        "postcode": {
          "type": "string",
          "maxLength": 16
        },
        "city": {
          "type": "string",
          "maxLength": 64
        },
        "country": {
          "type": "string",
          "maxLength": 2,
          "pattern": "^[A-Z]{2}$"
        },
        "vat_id": {
          "type": "string",
          "maxLength": 32
        }
      }
    },
    "PDFCompliance": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "mode"
      ],
      "description": "Opt-in independently validated PDF product. pdfa3b uses existing static pages. facturx requires the controlled structured invoice and cannot be combined with pages/document_id/master/dynamic_data/rows. Forms, flatten_form, annotations and hyperlinks are refused before charge. A 48 MiB final-file cap and compliance memory reserve apply. dry_run validates admission and price only; validation receipts appear only on completed status.",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "pdfa3b",
            "facturx"
          ]
        },
        "version": {
          "type": "string",
          "enum": [
            "1.09.2"
          ],
          "description": "Required for facturx, forbidden for pdfa3b."
        },
        "profile": {
          "type": "string",
          "enum": [
            "EN16931"
          ],
          "description": "Required for facturx, forbidden for pdfa3b; no profile downgrade."
        },
        "invoice": {
          "$ref": "#/$defs/FacturXInvoice"
        }
      }
    },
    "PDFPassword": {
      "type": "string",
      "writeOnly": true,
      "minLength": 1,
      "description": "Request-only PDF open password (AES-256); never returned or saved in designs. Must remain unchanged under the pinned PDF Unicode opening profile and fit 127 UTF-8 bytes; spaces, controls, normalization changes and longer inputs refuse before charge. PDF only, incompatible with PDF/A and Factur-X. Owner password is generated independently. Price unchanged. Internal plaintext is used only for authenticated page previews; only encrypted PDF bytes are delivered."
    },
    "PDFPrint": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "mode"
      ],
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "cmyk"
          ]
        },
        "profile": {
          "type": "string",
          "enum": [
            "aptec-offset-coated-linearctv-2025-v1"
          ],
          "default": "aptec-offset-coated-linearctv-2025-v1"
        }
      },
      "description": "Selected static CMYK document PDF using the named APTEC coated-offset ICC profile. Omission preserves ordinary RGB output. Opaque canvas required; no HTML, PDF/A/Factur-X or interactive forms. Raster/alpha/effect pages are composited then separated and warn about rasterization/loss of searchable text. Supported square/circle/line/ink/underline/strikeout appearances are server-painted; other annotations refuse before charge."
    },
    "RenderWatermark": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "text"
      ],
      "properties": {
        "text": {
          "type": "string",
          "maxLength": 8000
        }
      },
      "description": "Request-only literal UTF-8 stamp. Blank or unreadable final labels refuse before charge. Adds to required test-key marking; price unchanged. Never saved in the design or draft data."
    },
    "RowsReferences": {
      "type": "object",
      "maxProperties": 40,
      "description": "Request-only UTF-8 source names, 1..128 bytes. Across all scopes at most 40 declarations; all declarations including overridden validate before reads. Effective visible table sources fetch once per URL+format under SafeHTTP, 4194304 aggregate bytes and 25 seconds. JSON array objects must have only string values; CSV preserves exact quoted newlines and strings. At most 8000 rows/source and 200 fields/row. Errors never echo URLs or data. Stdio has a separate local path normalization budget; HTTP paths refuse.",
      "additionalProperties": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "url",
          "format"
        ],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 4096,
            "description": "Absolute public HTTP(S) URL; private host/DNS/redirect addresses refuse"
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "csv"
            ]
          }
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/rendry-io-document-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.