post_vouchers_batches_by_id_resend
Calls POST /api/vouchers/batches/{id}/resend as the signed-in person · REST reference
Print the same codes again, voiding nothing
Sends the batch's live vouchers that a printer ALREADY accepted to the office printer a second time, under the SAME codes — for paper that never usefully came out (a jam, a misfeed, a printer fault) once a person has judged a second sheet safe. Nothing is voided and nothing is replaced, so two sheets then carry one live code; the voucher is still redeemed once. Because that is the very thing POST /api/vouchers/batches/{id}/print refuses, a reason is required and is appended to the batch's metadata.resends with the time and the printer job. voucherIds may narrow the resend to named vouchers; each must be a live voucher of the batch that a printer already has, or nothing is printed (409 NOT_RESENDABLE). A batch with no such voucher answers 409 NOTHING_TO_RESEND (print it instead). A failed resend records NOTHING on the vouchers — the first paper exists, so they stay SUBMITTED — and answers 502 with the printer's code. Only PHYSICAL batches. Requires execute:CreateVoucherBatchCommand, as the print; platform staff are admitted as on every gate.
Arguments
| Argument | Type | Description | |
|---|---|---|---|
idpath | string (uuid) | required | Inventory batch id. |
bodyJSON | object | required | The request body, as a JSON object. Its fields are listed below. |
Fields of body
| Field | Type | Description | |
|---|---|---|---|
reason | string | required | Why a second sheet of the same codes is safe. Recorded on the batch. |
voucherIds | array of string (uuid) | Resend only these vouchers of the batch. Distinct UUIDs. |
Example call
A client sends this over the MCP session; Claude and other agents build it for you. The values are placeholders — the shape is real.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "post_vouchers_batches_by_id_resend",
"arguments": {
"id": "11111111-1111-4111-8111-111111111111",
"body": {
"reason": "string",
"voucherIds": [
"11111111-1111-4111-8111-111111111111"
]
}
}
}
}Result
On success (HTTP 202) the tool returns one text item holding the API's JSON, pretty-printed.
The printer accepted the job. print.code RESEND_NOT_RECORDED means the paper exists but the reason was not recorded on the batch.
{
"batchId": "11111111-1111-4111-8111-111111111111",
"print": {
"status": "SUBMITTED",
"code": "PRINTER_UNREACHABLE",
"error": "string",
"jobId": 1,
"vouchers": 1
}
}Fields
| Field | Type | Description |
|---|---|---|
batchId | string (uuid) | |
print | object | |
print.code | "PRINTER_UNREACHABLE" | "PRINTER_AUTH_REJECTED" | "PRINTER_TLS_UNVERIFIED" | "PRINTER_REJECTED_JOB" | "PRINTER_NOT_CONFIGURED" | "PRINT_FAILED" | … (7 values) | Machine-readable reason for error. |
print.error | string | Curated and safe to show. On FAILED and NOT_CONFIGURED; on SUBMITTED only when the job was accepted but could not be recorded — its vouchers were then neither marked as sent nor issued. |
print.jobId | integer | The printer's job id, on SUBMITTED. |
print.status | "SUBMITTED" | "FAILED" | "NOT_REQUESTED" | "NOT_CONFIGURED" | SUBMITTED: the printer ACCEPTED the job (accepted, not paper confirmed), and the vouchers it carried are ISSUED — unless code is PRINT_STATUS_NOT_RECORDED. FAILED: nothing was printed or issued. NOT_REQUESTED: no print was asked for, or the batch is DIGITAL. NOT_CONFIGURED: a print was asked for and this server has no printer. |
print.vouchers | integer | How many vouchers the print covered. Absent when none was attempted. |
When it fails
A failed call returns isError: true with the API's message as text. A change the person declines, or lets time out, also comes back this way and nothing changes.
400The request was malformed or failed a guard.
403Authenticated, but the caller holds none of the required permissions.
404No such resource — or none this caller may see.
409The resource is not in a state that allows this operation.
502The printer failed — it could not be reached, or refused the credential, the TLS pin or the job. Nothing was printed and nothing was recorded.
What the model is shown
This is the tool exactly as the server lists it in tools/list. The description starts with the REST call it makes.
{
"name": "post_vouchers_batches_by_id_resend",
"description": "POST /api/vouchers/batches/{id}/resend — Sends the batch's live vouchers that a printer ALREADY accepted to the office printer a second time, under the SAME codes — for paper that never usefully came out (a jam, a misfeed, a printer fault) once a person has judged a second sheet safe. Nothing is voided and nothing is replaced, so two sheets then carry one live code; the voucher is still redeemed once. Because that is the very thing `POST /api/vouchers/batches/{id}/print` refuses, a `reason` is required and is appended to the batch's `metadata.resends` with the time and the printer job. `voucherIds` may narrow the resend to named vouchers; each must be a live voucher of the batch that a printer already has, or nothing is printed (409 `NOT_RESENDABLE`). A batch with no such voucher answers 409 `NOTHING_TO_RESEND` (print it instead). A failed resend records NOTHING on the vouchers — the first paper exists, so they stay SUBMITTED — and answers 502 with the printer's `code`. Only PHYSICAL batches. Requires `execute:CreateVoucherBatchCommand`, as the print; platform staff are admitted as on every gate.\n\nThis changes data. The person is asked to confirm it before it runs, and nothing happens if they decline.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Inventory batch id."
},
"body": {
"type": "string",
"description": "The JSON request body: { reason*: string (Why a second sheet of the same codes is safe.); voucherIds: array of string (Resend only these vouchers of the batch.) }"
}
},
"required": [
"id",
"body"
]
},
"annotations": {
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": false,
"openWorldHint": false
}
}