Properties
| Name | Type | Description |
|---|---|---|
| template | string | Template id or slug. Omit when using `html` or `url`. |
| version | string | `published` (default), the name of a release channel such as `staging`, `latest` (the draft the editor works on, test keys only) or a version number. Channels, `published` included, are cached for up |
| html | stringnull | Ad-hoc HTML, max 5 MB. |
| url | stringnull | Public URL to render. |
| engine | object | Engine for `html` sources; `null` disables templating. |
| data | object | Data bound to the template. |
| output | object | Left out, the template decides: `pdf` for a template of kind `pdf`, `settings.image.format` (the request's, then the template's; `png` without one) for kind `image`, `settings.office.output` (else the |
| settings | object | |
| filename | string | May contain template expressions. |
| expires_in | integernull | Seconds until the output expires. `null` uses the workspace retention. |
| access | string | |
| mode | string | |
| locale | stringnull | Overrides the template locale and selects the i18n dictionary. |
| webhook_url | stringnull | |
| webhook_secret | stringnull | Signs the deliveries to `webhook_url` (same scheme as an endpoint secret). Write-only, never returned; without it those deliveries stay unsigned. |
| meta | object | Echoed in the response and webhooks. |
| region | object | |
| dedupe | boolean | Serve identical requests from the dedup cache at zero units. |
| canary_key | stringnull | Decides the canary split of a channel: renders with the same value land on the same version, so one customer's documents look alike. Use an opaque id; it is not stored. Without it the Idempotency-Key |
| validate_data | boolean | Checks `data` against the template's stored data schema before anything is rendered or counted; a mismatch answers 422 `data_validation_error` listing every error. Needs a template with a stored schem |
| post | objectnull | Post-processing of a PDF render, applied in the order merge, watermark, password (0.5 units per step on live keys; Starter plan and above). An unknown step is refused, never skipped. |
| storage | object |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/formfeed/main/json-schema/formfeed-render-request-schema.json",
"title": "RenderRequest",
"x-generated": "2026-09-28",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/formfeed-openapi.json#/components/schemas/RenderRequest",
"type": "object",
"properties": {
"template": {
"type": "string",
"description": "Template id or slug. Omit when using `html` or `url`."
},
"version": {
"type": "string",
"description": "`published` (default), the name of a release channel such as `staging`, `latest` (the draft the editor works on, test keys only) or a version number. Channels, `published` included, are cached for up to a minute; a channel with a canary sends its share of renders to the canary version, chosen by the Idempotency-Key so a retry lands on the same version. A draft renders as it is at that moment.",
"default": "published"
},
"html": {
"type": [
"string",
"null"
],
"description": "Ad-hoc HTML, max 5 MB."
},
"url": {
"type": [
"string",
"null"
],
"format": "uri",
"description": "Public URL to render."
},
"engine": {
"allOf": [
{
"$ref": "#/$defs/Engine"
}
],
"nullable": true,
"description": "Engine for `html` sources; `null` disables templating."
},
"data": {
"type": "object",
"additionalProperties": true,
"description": "Data bound to the template."
},
"output": {
"allOf": [
{
"$ref": "#/$defs/OutputFormat"
}
],
"description": "Left out, the template decides: `pdf` for a template of kind `pdf`, `settings.image.format` (the request's, then the template's; `png` without one) for kind `image`, `settings.office.output` (else the template's own format) for kinds `docx` and `pptx`. Ad-hoc `html` and `url` render `pdf`. On the Free plan, test renders of `docx` and `pptx` templates may only request `pdf` (403 `test_output_unavailable`)."
},
"settings": {
"$ref": "#/$defs/Settings"
},
"filename": {
"type": "string",
"description": "May contain template expressions."
},
"expires_in": {
"type": [
"integer",
"null"
],
"description": "Seconds until the output expires. `null` uses the workspace retention."
},
"access": {
"type": "string",
"enum": [
"public",
"signed"
],
"default": "signed"
},
"mode": {
"type": "string",
"enum": [
"sync",
"async"
],
"default": "sync"
},
"locale": {
"type": [
"string",
"null"
],
"description": "Overrides the template locale and selects the i18n dictionary."
},
"webhook_url": {
"type": [
"string",
"null"
],
"format": "uri"
},
"webhook_secret": {
"type": [
"string",
"null"
],
"minLength": 16,
"maxLength": 200,
"description": "Signs the deliveries to `webhook_url` (same scheme as an endpoint secret). Write-only, never returned; without it those deliveries stay unsigned."
},
"meta": {
"type": "object",
"additionalProperties": true,
"description": "Echoed in the response and webhooks."
},
"region": {
"allOf": [
{
"$ref": "#/$defs/Region"
}
],
"nullable": true
},
"dedupe": {
"type": "boolean",
"default": true,
"description": "Serve identical requests from the dedup cache at zero units."
},
"canary_key": {
"type": [
"string",
"null"
],
"minLength": 1,
"maxLength": 200,
"description": "Decides the canary split of a channel: renders with the same value land on the same version, so one customer's documents look alike. Use an opaque id; it is not stored. Without it the Idempotency-Key decides, which keeps a retry on its version but splits separate renders independently."
},
"validate_data": {
"type": "boolean",
"default": false,
"description": "Checks `data` against the template's stored data schema before anything is rendered or counted; a mismatch answers 422 `data_validation_error` listing every error. Needs a template with a stored schema (400 otherwise). In a batch, nothing is queued unless every item that asks for it fits."
},
"post": {
"type": [
"object",
"null"
],
"description": "Post-processing of a PDF render, applied in the order merge, watermark, password (0.5 units\nper step on live keys; Starter plan and above). An unknown step is refused, never skipped.\n",
"additionalProperties": false,
"properties": {
"merge_after": {
"type": "array",
"minItems": 1,
"maxItems": 49,
"items": {
"type": "string"
},
"description": "PDFs appended after this document, in order: render ids (`rnd_…`) of earlier renders, file ids (`fil_…`) or names of PDFs in the workspace library."
},
"watermark": {
"type": "object",
"additionalProperties": false,
"description": "Either a text or an image from the workspace library, not both.",
"properties": {
"text": {
"type": "string",
"maxLength": 200
},
"image": {
"type": "string",
"maxLength": 200,
"description": "A library file: its id (`fil_…`) or its name. PNG or JPEG."
},
"opacity": {
"type": "number",
"minimum": 0,
"maximum": 1,
"default": 0.2
},
"rotation": {
"type": "number",
"default": -45,
"description": "Degrees clockwise as in CSS."
},
"color": {
"type": "string",
"pattern": "^#?[0-9a-fA-F]{6}$",
"description": "Hex colour of the text; ignored for an image."
}
}
},
"password": {
"type": "object",
"additionalProperties": false,
"properties": {
"user": {
"type": "string",
"maxLength": 127,
"description": "Needed to open the document."
},
"owner": {
"type": "string",
"maxLength": 127,
"description": "Lifts the restrictions; random when omitted."
},
"permissions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"print",
"copy",
"modify",
"annotate"
]
},
"default": []
}
}
}
}
},
"storage": {
"allOf": [
{
"$ref": "#/$defs/StorageOption"
}
],
"nullable": true
}
},
"$defs": {
"Engine": {
"type": "string",
"enum": [
"jinja2",
"liquid",
"handlebars"
]
},
"OutputFormat": {
"type": "string",
"enum": [
"pdf",
"png",
"jpg",
"webp",
"docx",
"pptx"
],
"description": "PDF and image templates, ad-hoc HTML and URLs produce `pdf`, `png`, `jpg` or `webp`; a `docx` template produces `docx` or `pdf`, a `pptx` template `pptx` or `pdf`."
},
"Region": {
"type": "string",
"enum": [
"eu",
"us",
"apac"
]
},
"Settings": {
"type": "object",
"description": "Rendering settings. Deep-merged over the template's settings. See the settings reference.",
"additionalProperties": true,
"properties": {
"paper": {
"type": "object",
"properties": {
"format": {
"type": "string"
},
"width": {
"type": [
"string",
"null"
]
},
"height": {
"type": [
"string",
"null"
]
},
"landscape": {
"type": "boolean",
"default": false
}
}
},
"margin": {
"type": "object",
"properties": {
"top": {
"type": "string"
},
"right": {
"type": "string"
},
"bottom": {
"type": "string"
},
"left": {
"type": "string"
}
}
},
"header": {
"type": "object",
"description": "Printed across the whole page width inside the top margin.",
"properties": {
"html": {
"type": "string"
},
"height": {
"type": "string"
},
"padding": {
"type": "string",
"description": "CSS padding inside the header box; `0` for designs that run edge to edge.",
"default": "0 10mm"
}
}
},
"footer": {
"type": "object",
"description": "Printed across the whole page width inside the bottom margin.",
"properties": {
"html": {
"type": "string"
},
"height": {
"type": "string"
},
"padding": {
"type": "string",
"description": "CSS padding inside the footer box; `0` for designs that run edge to edge.",
"default": "0 10mm"
}
}
},
"printBackground": {
"type": "boolean",
"default": true
},
"scale": {
"type": "number",
"default": 1
},
"image": {
"type": "object",
"properties": {
"width": {
"type": "integer"
},
"height": {
"type": "integer"
},
"deviceScaleFactor": {
"type": "number",
"default": 2
},
"format": {
"type": "string",
"enum": [
"png",
"jpeg",
"webp"
],
"description": "Output of an image template when the request names no `output`. `jpg` is accepted as well."
},
"quality": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"fullPage": {
"type": "boolean",
"default": false
},
"transparent": {
"type": "boolean",
"default": false
}
}
},
"office": {
"type": "object",
"description": "Word and PowerPoint templates. Page setup, margins, headers and footers come from the document; the Chromium settings above do not apply.",
"properties": {
"output": {
"type": "string",
"enum": [
"docx",
"pptx",
"pdf"
],
"description": "Output when the request names none; the template's own format without it."
}
}
},
"locale": {
"type": "string"
},
"timezone": {
"type": "string"
},
"currency": {
"type": "string"
}
}
},
"StorageOption": {
"description": "The copy for the workspace's own bucket (bring your own storage). Left out, every output is\ncopied under the connection's key template. `false` leaves this document out. `key` names its\nobject below the connection's prefix instead of the key template: relative, without `.` or `..`\nsegments, at most 1024 bytes; an existing object is overwritten. A render with its own key is\nnever answered from the dedup cache, and one without a connection answers 409\n`storage_not_configured`. In a batch, each item carries its own.\n",
"oneOf": [
{
"type": "boolean",
"enum": [
false
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"maxLength": 1024
}
}
}
]
}
}
}
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/formfeed-render-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.