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 |
| 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 |
JSON Schema
{
"$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.
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.