Skip to main content
Glama

Dynamic Document API

Server Details

PDFs, images and e-invoices (XRechnung, ZUGFeRD) from templates and JSON, rendered in the EU.

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.5/5.0

Scored across 9 tools

Disambiguation4/5

The four render tools are cleanly separated by source (template, html, markdown, image), and get_render/list_templates/get_template_schema/merge_pdfs each have distinct roles. The only real overlap is between create_einvoice and render_pdf_from_template's `einvoice` parameter, but the descriptions explicitly cross-reference and clarify the choice.

Naming Consistency5/5

All names use consistent snake_case with a clear verb_noun or verb_noun_prep_noun pattern (render_pdf_from_html, render_pdf_from_markdown, create_einvoice, list_templates, get_render). The render family forms a predictable, parallel set.

Tool Count5/5

Nine tools is well-scoped for a document rendering API, with each tool covering a distinct capability (three PDF sources, images, e-invoice, merge, discovery, schema, status). No redundancy or filler.

Completeness4/5

The surface covers the full render lifecycle: template discovery, schema inspection, rendering across formats, e-invoice generation, merging, and async status retrieval via get_render. Minor gaps exist around template/asset management (create/update/delete templates) and render deletion, but these may be out of scope for a rendering-focused API.

Available Tools

9 tools
create_einvoiceCreate an e-invoice XML (XRechnung, EN 16931, Factur-X / ZUGFeRD)AInspect

Generate a standalone, validated e-invoice XML file from invoice data — e.g. an XRechnung for a German public-sector buyer, or an EN 16931 invoice for a Peppol network. To embed the invoice in a PDF instead, use render_pdf_from_template with einvoice. Returns a signed download URL for the XML (valid for expires_in, default 1 h) and the validator's verdict in conformance.einvoice.status (passed | failed | unavailable). If the data breaks a rule of the profile, the call fails and lists every problem with its field path: fix those fields and call again. This connection's test API key makes every render a free test render: test renders carry a TEST note in the XML (MINIMUM has no field for it) and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
syntaxNoXML syntax: `cii` (UN/CEFACT Cross Industry Invoice, the default, every profile) or `ubl` (UBL 2.1, only EN16931 and XRECHNUNG). Use `ubl` when the recipient asks for UBL, e.g. many Peppol access points.
invoiceYesThe invoice as EN 16931 fields in snake_case. Required: `number`, `issue_date` (YYYY-MM-DD), `currency` (ISO 4217, e.g. EUR), `seller` and `buyer` {name, address {line1, city, postcode, country (ISO 3166 alpha-2)}}, `lines` [{quantity, price {net}, tax {category, rate}, item {name}}]. Often needed: `due_date`, `buyer_reference`, `payment_terms`, `type_code` (380 invoice, 381 credit note), `seller.vat_id`, `electronic_address` {id, scheme: EM for e-mail, 0204 for a Leitweg-ID}, `payment` {means_code: "58" SEPA credit transfer, credit_transfers [{account_id: IBAN}]}, line `unit` (C62 piece, HUR hour, DAY day), `invoice_period` {start, end}. VAT categories: S standard, Z zero-rated, E exempt, AE reverse charge, K intra-EU supply, G export, O not subject to VAT (E, AE, K, G and O need `vat_exemptions` {<category>: {reason}}). Amounts are decimal strings such as "95.00". Do NOT send totals, VAT amounts or line net amounts: they are computed from the lines.
profileYesE-invoice profile. XRECHNUNG: German public-sector buyers — needs `buyer_reference` (the Leitweg-ID), seller `contact` {name, phone, email}, seller and buyer `electronic_address`, and `payment`. EN16931: the full European standard. Factur-X / ZUGFeRD levels: MINIMUM and BASIC_WL (line items are not transmitted), BASIC, EXTENDED.
filenameNoOutput filename; `.xml` is enforced. Default: the invoice number.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, which covers the safety profile. The description adds real value beyond that: a signed download URL with a lifetime tied to `expires_in`, the validator verdict location `conformance.einvoice.status`, per-minute rate limits, and the test-key override of the `test` flag. Given annotations carry the write/open-world semantics, a 3 understates how much the description adds, but the bar is lower with annotations present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the alternative, then failure behavior, then test/rate-limit caveats. It is long, but nearly every sentence carries distinct information an agent needs; the trailing rate-limit note is slightly tangental but still operationally relevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, nested-payload mutation tool the description covers the failure mode, validation verdict, output artifact and its lifetime, and the test/final billing distinction. The output schema already exists, so omitting deeper return-value detail is appropriate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including `invoice`, `profile`, `syntax`, `test`, `metadata`, `reference` and `expires_in` is already documented in the schema with examples and enums. The description echoes only a little of this (`expires_in` default of 1 h), so the baseline of 3 is correct — the schema, not the description, does the parameter work here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact ('Generate a standalone, validated e-invoice XML file from invoice data') and names the concrete profiles it targets. It also distinguishes itself from `render_pdf_from_template`, so an agent can route between XML generation and PDF embedding without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the alternative case ('To embed the invoice in a PDF instead, use `render_pdf_from_template` with `einvoice`') and explains the recovery path on validation failure ('fix those fields and call again'). The test-vs-final key behavior and per-minute limits give the agent the operational context needed before calling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_renderGet a renderA
Read-onlyIdempotent
Inspect

Fetch one render of the connected workspace by id: its status, files with freshly signed download URLs, billed_renders and the conformance report. Use it when a render tool returned queued or processing (call again every few seconds until succeeded or failed), or when a download link has expired. Not needed after a render tool already returned succeeded with its files. New URLs last the render's expires_in again, until the plan's file retention ends; after that the render is expired and its files have no URL. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
render_idYesRender id from a render tool's result, e.g. `rnd_01J9ZM…`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/idempotent safety profile, but the description adds crucial non-obvious behavior: it is not billed, it carries a 60-calls-per-minute shared rate limit, URLs are freshly signed and last expires_in until retention ends, after which the render becomes expired with no URL. This is exactly the context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then expiry semantics and limits in a logical order; every sentence carries information. It is on the long side for a one-parameter tool, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and the description still covers lifecycle semantics (queued/processing/succeeded/failed/expired), URL lifetime, cost, and rate limits. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single render_id parameter already documents its expected form (`rnd_01J9ZM…`). The description explains where the id comes from ('from a render tool's result'), which is minor added value, but the baseline of 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch one render ... by id') and enumerates what comes back (status, files with signed URLs, billed_renders, conformance report). It is unambiguous against siblings like render_pdf_from_html, which create renders rather than retrieve one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when a render tool returned queued or processing', or an expired download link), when-not ('Not needed after a render tool already returned succeeded'), and even the polling cadence ('call again every few seconds until succeeded or failed'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_template_schemaGet a template's data schemaA
Read-onlyIdempotent
Inspect

Get the data a template expects before rendering it: its JSON Schema, every field as a dotted path with type and required flag, an image template's dynamic properties, an example payload and einvoice_default (the template's default ZUGFeRD / Factur-X e-invoice, or null). Call it once per template, after list_templates or with an id the user gave, and build data from fields and example_data: render_pdf_from_template and render_image_from_template reject data that breaks the schema. render_pdf_from_html and render_pdf_from_markdown take no template and need no schema. When einvoice_default is set, every PDF render embeds that e-invoice, so data must also hold the invoice object at its invoice_path (on Free and Starter it is skipped with the warning einvoice_skipped_plan); render_pdf_from_template can replace it or turn it off. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesTemplate id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fieldsYesEvery field of the schema, flattened.
schemaNoThe JSON Schema of `data`.
versionNoThe template version the schema belongs to.
declaredNoFalse when the schema was inferred from the template source rather than declared.
template_idYes
example_dataNoA `data` payload that matches the schema, to fill in.
einvoice_defaultNoThe template's default e-invoice, or null. When set, every PDF render embeds a ZUGFeRD / Factur-X e-invoice read from `data` at `invoice_path`, unless the render passes `einvoice` (replace) or `einvoice: null` (plain PDF).
dynamic_propertiesYesWhat `data` can set on an image (`image_canvas`) template; empty for PDF templates.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/idempotent annotations: discloses billing status ('Not billed'), a concrete rate limit ('60 tool calls a minute per connection, shared by all tools'), the einvoice side effect on every PDF render, and the plan-gated `einvoice_skipped_plan` warning. This is behavior an agent could not infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and tightly packed, with each sentence carrying distinct information (dependencies, e-invoice behavior, rate limit). The einvoice_default sentence is long and condition-heavy, which is the only mild drag on readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still frames what the returned `data` is for and how to build a valid render payload, plus prerequisites, rate limits, and plan constraints. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines `template_id` and its format. The description still adds usable sourcing guidance ('an id the user gave', implicitly from `list_templates`), which is slight but genuine added meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Get the `data` a template expects before rendering it') and enumerates exactly what comes back: JSON Schema, dotted-path fields with type/required, image dynamic properties, example payload, and `einvoice_default`. This clearly separates it from sibling renderers and from `list_templates`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('Call it once per template, after `list_templates` or with an id the user gave') and explicit when-not ('`render_pdf_from_html` and `render_pdf_from_markdown` take no template and need no schema'). The downstream consumers (`render_pdf_from_template`, `render_image_from_template`) and the consequence of skipping it (data rejected) are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList Dynamic Document API templatesA
Read-onlyIdempotent
Inspect

List the published templates of the connected workspace: id, name, type and live version. Use it to find the template_id for a document the user describes; skip it when you already have the id. PDF templates (pdf_code, pdf_markdown) go to render_pdf_from_template, image templates (image_canvas) to render_image_from_template; call get_template_schema next for the data a template expects. Returns 50 templates per page unless limit says otherwise; pass next_cursor as cursor while has_more. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly return templates of this type, e.g. `image_canvas` for image templates.
limitNoPage size, 1-100 (default 50).
queryNoPart of a template name, case-insensitive.
cursorNo`next_cursor` of the previous page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
has_moreYesMore templates match: call again with `cursor: next_cursor`.
templatesYes
next_cursorNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which only declare it as a safe, idempotent read), the description adds pagination behavior (50 per page, next_cursor/has_more contract), the billing status ('Not billed'), and a concrete rate limit shared across all tools. These are operational facts an agent cannot derive from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Information-dense and front-loaded: purpose, usage, routing, pagination, then cost/limits. Every clause carries distinct operational information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation; the description covers everything else an agent needs — discovery role, sibling routing, pagination loop, and throttling — for a 4-parameter read tool with an enum filter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and self-documenting, but the description still adds value by restating the 50-item default and explaining the cursor contract ('pass next_cursor as cursor while has_more'), which links the request parameter to the response field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the published templates of the connected workspace') and enumerates the returned fields (id, name, type, live version). This clearly separates it from the render_* and get_template_schema siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('find the template_id for a document the user describes'), explicit when-not ('skip it when you already have the id'), and routes by template type to render_pdf_from_template or render_image_from_template, plus names get_template_schema as the logical next call.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

merge_pdfsMerge PDFsAInspect

Merge 2-200 existing PDFs into one PDF, in the order given, with a bookmark per source unless bookmarks is none. Use it to combine documents (e.g. a cover letter and an invoice from earlier renders) or PDFs at public URLs. It renders nothing itself: render each part first, then pass its render_id. The sources stay unchanged. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
sourcesYesThe PDFs to merge, in order.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
bookmarksNo`filenames` (default): a top-level bookmark per source, named after its file; `none`: no bookmarks.
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only declaring readOnly=false/destructive=false/openWorld=true, the description carries real behavioral load: sources stay unchanged, a 25 s wait ceiling before returning queued/processing, signed download URLs tied to expires_in, TEST watermark and per-minute test-render limits, and a 60 calls/min connection-wide rate limit. This is context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose, ordering, and bookmark behavior are front-loaded, and each subsequent sentence adds a distinct operational fact. It is on the long side — the rate-limit and test-key details could be compressed — but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested-source, high-parameter tool with an output schema, the description covers the prerequisite chain, ordering, async fallback, link lifetime, and quota constraints. Nothing an agent needs in order to invoke it correctly is missing, and return-value details are appropriately left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: sources are consumed 'in the order given', render_id references an earlier render's stored files, bookmarks defaults to a per-source bookmark, and expires_in defaults to one hour. These tie the parameters into an actual workflow rather than restating field docs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb (merge), resource (existing PDFs), cardinality (2-200), ordering guarantee, and the bookmark default. It also explicitly distinguishes itself from the render_* siblings with 'It renders nothing itself', so an agent can tell what this tool is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names concrete use cases (combining a cover letter and an invoice from earlier renders, or public-URL PDFs) and states the prerequisite workflow: render each part first, then pass its render_id. It also routes the agent to get_render when the result is queued or processing, and to re-sign expired links.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_image_from_templateRender an image from a templateAInspect

Render a PNG, JPEG or WebP image from a saved image template (image_canvas) plus data: social and Open Graph images, banners, badges. Find the template with list_templates (type: image_canvas) and what it lets you set with get_template_schema (its dynamic properties), then pass those in data as dotted keys such as title.text or hero.src (an image URL). For a PDF, use render_pdf_from_template. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoTemplate data as JSON. Canvas/image templates accept dotted keys (`title.text`, `hero.src`) or the equivalent nested objects. Call `get_template_schema` first to learn the shape.
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
imageNoImage output options.
formatNoOutput format (default png).
versionNoTemplate version: `live` (default), `draft` (test keys only) or a version number.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.
template_idYesImage template id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), which only signal a non-idempotent, non-destructive, open-world write. The description adds the 25 s synchronous wait, the queued/processing fallback and how get_render resolves it, signed-URL lifetime tied to expires_in, TEST watermark behavior for test keys, and a 60 calls/min per-connection rate limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool does, then workflow, then alternative, then timing/async/test/rate-limit behavior. Every sentence carries operational information, though the final third is dense and packs async, test-mode, and rate-limit facts into one paragraph that is harder to scan than the opening.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with an output schema, the description is complete: it covers prerequisites, data shape, format scope, async handling, URL lifetime, and quota limits. Return-value detail can correctly be delegated to the output schema, and nothing needed to invoke it successfully is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds concrete semantic framing for data (dotted keys like title.text and hero.src with an image URL) and explains expires_in's default and re-signing behavior. The remaining parameters (image, format, version, filename, metadata, reference) are left entirely to the schema, so it stops short of a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (render an image from a saved image template) and enumerates concrete use cases (social/OG images, banners, badges). It explicitly names the sibling it is not (render_pdf_from_template for PDF), so an agent can route without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite chain: find the template via list_templates (type: image_canvas), learn its settable properties via get_template_schema, then pass them in data. It also gives explicit alternatives for adjacent needs (render_pdf_from_template for PDF, get_render for slow renders) and states when the async path applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_pdf_from_htmlRender a PDF from HTMLAInspect

Render a PDF from HTML and CSS you write, in headless Chromium. Use it when no saved template fits and the layout matters: letters, styled tables, one-off documents. For a saved template use render_pdf_from_template; for a text report without layout work render_pdf_from_markdown is shorter. With data, the HTML is a Jinja template ({{ name }}, {% for row in rows %}). Remote images and fonts must be public URLs; load web fonts with tags in head. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
cssNoCSS injected as a <style> block in <head>.
pdfNoPDF output options; these override the template's defaults.
dataNoJinja variables for the HTML; when present, the HTML is rendered as a Jinja template first.
headNoRaw <head> contents (link/meta/script), appended after `css`.
htmlYesThe HTML to render: a full document or just the <body> content.
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false): it discloses the 25s wait-then-return flow, the queued/processing async path and that get_render collects and re-signs expired links, that remote assets must be public URLs, that the test key yields watermarked test renders, and the shared 60 calls/min limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then routing, then mechanics — a sensible order with no filler sentences. It is dense and long, but each sentence carries distinct operational information rather than restating the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, nested-schema tool with an output schema present, the description supplies everything the schema cannot: async handling, asset restrictions, auth/test-key semantics, and rate limits. Return-value details are correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds Jinja syntax examples (`{{ name }}`, `{% for row in rows %}`) that meaningfully help an agent construct the `data`/`html` inputs, and it restates the expires_in default and test-mode interplay. The many pdf sub-options (scale, margin, page_ranges) are left to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Render a PDF from HTML') and immediately scopes it as 'HTML and CSS you write, in headless Chromium.' It explicitly differentiates from siblings render_pdf_from_template and render_pdf_from_markdown, so an agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use condition ('when no saved template fits and the layout matters: letters, styled tables, one-off documents') plus two named alternatives with the condition selecting each. When-not guidance is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_pdf_from_markdownRender a PDF from MarkdownAInspect

Render a PDF from Markdown with a built-in theme: the quickest way to turn a report, summary or notes you have written into a clean document, with no layout work. Supports tables, task lists, footnotes and strikethrough; raw HTML is not rendered. For a designed layout use render_pdf_from_html, for a saved template render_pdf_from_template. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
cssNoExtra CSS layered on top of the theme.
pdfNoPDF output options; these override the template's defaults.
dataNoJinja variables for the Markdown, e.g. `{{ customer }}`.
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
themeNoBuilt-in stylesheet (default `default`); `none` leaves only your `css`.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
markdownYesThe Markdown source (GitHub-style tables, task lists and footnotes work).
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations (readOnlyHint=false, openWorldHint=true) by disclosing the 25 s blocking window, the signed-URL return with expiry, the queued/processing async fallback and its collector tool, the TEST watermark and per-plan limiting when a test key is used, and the 60 calls/minute connection-wide rate limit. It also states a real content constraint (raw HTML not rendered), which is behavior an agent must know before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and then ordered by escalating need: capabilities, sibling routing, timing/return, async fallback, test-mode and rate limits. Dense but every sentence is operational. Slightly overstuffed in the test-key sentence, which repeats ground the `test` parameter description already covers.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, open-world, potentially asynchronous renderer with an output schema, it covers the pieces an agent actually needs: which sibling to pick, how long it blocks, what comes back, what to do when it does not finish, and the quota/test constraints. Return-value detail is correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns a step above by adding meaning the schema does not, notably that the Markdown source accepts tables/task lists/footnotes but excludes raw HTML, and that the theme is the built-in default path. It does not re-explain individual PDF options, which is appropriate given the schema already documents them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Render a PDF from Markdown') plus its built-in theming, and immediately names the two sibling renderers it is not (render_pdf_from_html, render_pdf_from_template). An agent can select this tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the concrete use case (report, summary, notes with no layout work) and explicit routing rules: designed layout -> render_pdf_from_html, saved template -> render_pdf_from_template. It also names get_render as the follow-up path for queued/processing renders, covering the alternative for the async case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_pdf_from_templateRender a PDF from a templateAInspect

Render a PDF from a saved template of the workspace plus JSON data. Use it when a template exists for the document (invoices, quotes, certificates, recurring reports); otherwise write the layout with render_pdf_from_html or turn text into a PDF with render_pdf_from_markdown, and use render_image_from_template for images. Take template_id from list_templates and the shape of data from get_template_schema; data that breaks the schema fails with each wrong field's path. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Pass einvoice for a hybrid e-invoice PDF (Factur-X / ZUGFeRD / XRechnung) that accounting software can read. A template with einvoice_default (from get_template_schema) embeds a ZUGFeRD / Factur-X e-invoice in every PDF render, a hybrid PDF/A-3b, read from data at its invoice_path (missing: 400 validation_error at /data). einvoice replaces that default, einvoice: null turns it off for a plain PDF. On plans without e-invoicing (Free, Starter) it is skipped with the warning einvoice_skipped_plan: tell the user the e-invoice needs the Growth plan or higher. Limited to 60 tool calls a minute per connection, shared by all tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
pdfNoPDF output options; these override the template's defaults.
dataNoTemplate data as JSON. Canvas/image templates accept dotted keys (`title.text`, `hero.src`) or the equivalent nested objects. Call `get_template_schema` first to learn the shape.
testNoTest mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused).
versionNoTemplate version: `live` (default), `draft` (test keys only) or a version number.
einvoiceNoAn e-invoice object embeds (or replaces the template's default) e-invoice; `null` turns the template's default e-invoice off for this render (a plain PDF); omit it to keep the template's default.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.
template_idYesTemplate id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, open-world, non-idempotent operation, and the description layers on concrete behavior beyond them: a 25 s wait then queued/processing with get_render as the collector, signed URL lifetimes, TEST watermark semantics under a test key, plan-gated e-invoice skipping with a named warning, and a 60 calls/min connection limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and routing, then escalates into behavior, e-invoice rules, and limits. Almost every sentence carries operational content, but the e-invoice passage is dense enough that the section on the default-vs-override interplay could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters, nested objects, and an output schema, the description covers routing, prerequisites, async collection, billing/watermark behavior, and the full e-invoice decision tree. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself is rich, so the baseline is 3; the description still adds cross-parameter meaning the schema cannot express — einvoice replaces the template's einvoice_default, einvoice:null turns it off, and a test API key overrides the test parameter. It does not, however, add format detail for the pdf option object or margins.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Render a PDF from a saved template of the workspace plus JSON data') and immediately distinguishes itself from render_pdf_from_html, render_pdf_from_markdown, and render_image_from_template by naming when each applies. An agent can route without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when a template exists for the document') and when-not, with named alternatives for each case, plus the prerequisite tools list_templates and get_template_schema for the required inputs. No inference left to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updates
    • Changedcreate_einvoice18 fields changed
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedget_render18 fields changed
      • changedInput schema / properties / render_id / description
        Previous value: -"Render id, e.g. `rnd_01J9ZM…`."New value: +"Render id from a render tool's result, e.g. `rnd_01J9ZM…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedget_template_schema11 fields changed
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / declared / description
        Added value: +"False when the schema was inferred from the template source rather than declared."
      • addedOutput schema / properties / dynamic_properties / description
        Added value: +"What `data` can set on an image (`image_canvas`) template; empty for PDF templates."
      • addedOutput schema / properties / dynamic_properties / items / properties / key / description
        Added value: +"Dotted `data` key of an image template, e.g. `title.text` or `hero.src`."
      • addedOutput schema / properties / example_data / description
        Added value: +"A `data` payload that matches the schema, to fill in."
      • addedOutput schema / properties / fields / description
        Added value: +"Every field of the schema, flattened."
      • addedOutput schema / properties / fields / items / properties / enum / description
        Added value: +"The only values the field accepts."
      • addedOutput schema / properties / fields / items / properties / line_item / description
        Added value: +"The field sits inside an array of rows, such as invoice lines."
      • addedOutput schema / properties / fields / items / properties / path / description
        Added value: +"Dotted path into `data`, e.g. `customer.name`, or `items[].price` inside an array."
      • addedOutput schema / properties / schema / description
        Added value: +"The JSON Schema of `data`."
      • addedOutput schema / properties / version / description
        Added value: +"The template version the schema belongs to."
    • Changedlist_templates7 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor from a previous call."New value: +"`next_cursor` of the previous page."
      • changedInput schema / properties / query / description
        Previous value: -"Free-text search over template names."New value: +"Part of a template name, case-insensitive."
      • changedInput schema / properties / type / description
        Previous value: -"Only return templates of this type."New value: +"Only return templates of this type, e.g. `image_canvas` for image templates."
      • addedOutput schema / properties / has_more / description
        Added value: +"More templates match: call again with `cursor: next_cursor`."
      • addedOutput schema / properties / templates / items / properties / id / description
        Added value: +"Template id (`tpl_…`), the `template_id` of the render tools."
      • addedOutput schema / properties / templates / items / properties / live_version / description
        Added value: +"The version renders use by default."
      • addedOutput schema / properties / templates / items / properties / type / description
        Added value: +"`pdf_code`, `pdf_markdown`, `image_canvas`, `docx` or `pdf_form`."
    • Changedmerge_pdfs23 fields changed
      • changedInput schema / properties / bookmarks / description
        Previous value: -"Add a top-level bookmark per source file."New value: +"`filenames` (default): a top-level bookmark per source, named after its file; `none`: no bookmarks."
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • changedInput schema / properties / sources / items / properties / file_id / description
        Previous value: -"Which file of `render_id` to use."New value: +"Which PDF of `render_id` to take (default: its first PDF)."
      • changedInput schema / properties / sources / items / properties / render_id / description
        Previous value: -"A previous render to take a file from."New value: +"An earlier render of this workspace whose files are still stored, e.g. `rnd_…`."
      • changedInput schema / properties / sources / items / properties / upload_id / description
        Previous value: -"Id from an upload, e.g. `upl_…`."New value: +"A PDF uploaded through the API, e.g. `upl_…`."
      • changedInput schema / properties / sources / items / properties / url / description
        Previous value: -"Publicly reachable PDF URL."New value: +"Public https URL of a PDF."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_image_from_template19 fields changed
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Image template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_html20 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"Jinja variables for the HTML."New value: +"Jinja variables for the HTML; when present, the HTML is rendered as a Jinja template first."
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • changedInput schema / properties / html / description
        Previous value: -"The HTML body to render."New value: +"The HTML to render: a full document or just the <body> content."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_markdown21 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"Jinja variables for the Markdown."New value: +"Jinja variables for the Markdown, e.g. `{{ customer }}`."
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • changedInput schema / properties / markdown / description
        Previous value: -"The Markdown source."New value: +"The Markdown source (GitHub-style tables, task lists and footnotes work)."
      • changedInput schema / properties / theme / description
        Previous value: -"Built-in stylesheet (default `default`)."New value: +"Built-in stylesheet (default `default`); `none` leaves only your `css`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_template19 fields changed
      • changedInput schema / properties / expires_in / description
        Previous value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime."
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
  2. 9 tool updates
    • First observedcreate_einvoice
    • First observedget_render
    • First observedget_template_schema
    • First observedlist_templates
    • First observedmerge_pdfs
    • First observedrender_image_from_template
    • First observedrender_pdf_from_html
    • First observedrender_pdf_from_markdown
    • First observedrender_pdf_from_template

Publisher details

Operator
N.M.M. NOBLE MINDS MEDIA LTD · Publisher source
Vendor relationship
First-party
Restrictions
Requires a Dynamic Document API account (free plan: 50 renders per month, no credit card). Sign in with OAuth or send an API key as a Bearer token. Test renders are free and watermarked. Data is processed in the EU (Germany).

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources