Dedicated tool guide
order_send
Run the full send gates, optionally as a dry run, then create a reviewed or automatic physical-mail order.
Generated contract: apiVersion v1, schemaRevision 1. Examples use placeholders and do not call production.
order_send
actionscope: order:sendSends a letter physically by post: checks the sender's mandatory details, the recipient address, the AVV and the limits, creates the final PDF, calculates the price and releases the send. Look at the letter as an image first: letter_create_draft and letter_preview return the rendered pages, and typesetting defects such as an over-long subject show up only there. A letter arrives either via letterId (an existing draft) or inline: then the body is either content (plain text) OR blocks (structured: tables, headings, totals lines), exactly one of the two. Compact blocks example: {"blocks":[{"type":"heading","text":"Rechnung"},{"type":"table","columns":[{"key":"text","label":"Artikel","width":"grow"},{"key":"sum","label":"Summe","align":"right","format":"eur"}],"rows":[{"text":"Beratung","sum":32000}]},{"type":"totals","lines":[{"label":"Gesamt","amountCents":32000,"emphasis":true}]}]} Full reference incl. styleDefs and limits: MCP resource frankki://blocks-guide. By default the send first lands in the approval queue and a human decides via approval_decide. After that, poll progress with order_status. Two recovery paths: order_cancel cancels a letter before it goes to print, order_fix_resubmit corrects a letter the provider rejected and resubmits it. With dryRun the send is only rehearsed: free of charge, and the letter stays put. dryRun is the full rehearsal of this specific letter through all six gates and therefore the highest-fidelity price. A dryRun stays a pure rehearsal: the returned letterId is a rehearsal handle and answers NOT_FOUND in letter_get or letter_preview. For a real draft, use letter_create_draft. shipping_quote instead answers what a letter would cost while the content is still only planned; letter_preview shows a blocks draft as an image before it is sent here.
Input contract
| Field | Type | Requirement | Meaning |
|---|---|---|---|
letterId | string | optional | Existing draft. Alternatively provide the letter inline. |
subject | string | optional | |
content | string | optional | letter body as plain text. Either content OR blocks, never both. |
blocks | array<object | object | object | object | object | object | object | object | object | object | object | object> | optional | structured letter content as typed blocks (alternative to content, never both). |
styleDefs | object | optional | named document styles (max 24); blocks reference them via style. |
recipientName | string | optional | |
recipientCompany | string | optional | |
recipientStreet | string | optional | |
recipientHouseNumber | string | optional | |
recipientZip | string | optional | |
recipientCity | string | optional | |
recipientCountry | string | optional | ISO 3166-1 alpha-2, defaults to DE. |
priceVersion | string | optional | Optional: the priceVersion from an earlier shipping_quote. If the price at send time differs, the call is aborted with PRICE_CHANGED before anything is charged. |
quotedUnitPriceCents | integer | optional | Optional: the unit price in cents from an earlier shipping_quote (unitPriceCents). If set, it decides the PRICE_CHANGED comparison and returns the old price in the error. |
deliveryType | standard | einschreiben_einwurf | einschreiben_uebergabe | optional | Defaults to standard. |
express | boolean | optional | |
color | boolean | optional | If omitted, colour is detected automatically. |
includeSignature | boolean | optional | |
signatureId | string | optional | |
letterheadId | string | optional | A specific letterhead for this send. If omitted, the default letterhead is used. |
letterheadEnabled | boolean | optional | Set to false to suppress the letterhead for this one send. |
senderAddressId | string | optional | |
senderProfileId | string | optional | |
mandantennummer | string | optional | |
clientOrderId | string | optional | Idempotency key: any string (1-200 characters, e.g. 'mahnung-kunde42-2026-07-20'; no UUID format required). A repeat call with the same value returns the same order instead of sending a second time. The 'approval:' namespace is reserved. |
scheduledAt | string | optional | |
approvalMode | auto | draft | review | optional | How the send is approved. 'draft' and 'review' put it into the approval queue instead of sending immediately. Note: both still reserve the amount in the wallet at submit time, so an approved letter cannot fail on funds later. Without cover the call returns INSUFFICIENT_FUNDS and nothing is created. For a plain draft with no wallet cover, use letter_create_draft. |
maxCostEuros | number | optional | Maximum amount in euros. If the price is above it, the call is aborted. |
presetName | string | optional | |
auditTag | string | optional | |
templateId | string | optional | |
templateVersionId | string | optional | Exact released template version. Only with templateId; the server rerenders it with templateMergeValues and ignores caller-supplied subject/content. |
templateMergeValues | object | optional | Merge values for the exact template version. |
coverTemplateId | string | optional | Cover letter for a standalone form template. |
coverTemplateVersionId | string | optional | Exact released version of the cover letter. |
designId | string | optional | Use a saved letter design for this send. If omitted, in order: the design stored on the draft (when sending by letterId), else the sender profile default design, else none. |
design | object | optional | Exact letter-design snapshot from template_apply_with_merge_fields.composition.design. Takes precedence over designId and prevents later design edits from changing the released template composition. |
reference | object | optional | Per-letter values (Vorgangsnummer, your reference, customer number, QR parameters ...). They fill the info block and the barcode. |
dryRun | boolean | optional |
Contract-shaped example
order_send({
"letterId": "REVIEWED_LETTER_ID",
"recipientName": "Max Mustermann",
"recipientStreet": "Musterstrasse",
"recipientHouseNumber": "1",
"recipientZip": "10115",
"recipientCity": "Berlin",
"recipientCountry": "DE",
"deliveryType": "einschreiben_einwurf",
"priceVersion": "VERSION_FROM_QUOTE",
"quotedUnitPriceCents": UNIT_PRICE_CENTS_FROM_QUOTE,
"maxCostEuros": 10,
"approvalMode": "review",
"clientOrderId": "contract-482-send-v1",
"dryRun": true
})Replace quotedUnitPriceCents with the exact value returned by shipping_quote. Reuse the same clientOrderId and payload for retries; remove dryRun only for an intentional live submission.
For conditional fields and nested object limits, the generated complete tool reference remains authoritative. See errors and safe agent onboarding before implementing retries or a live send.
Trust and live status
Machine-readable service facts and the current operational status of the partner interface are publicly available at all times, no login needed.