post_vouchers_by_id_perform

Changes data · you confirm first

Calls POST /api/vouchers/{id}/perform as the signed-in person · REST reference

Claim step 2 — mark the procedure performed

Transitions VERIFIED → PERFORMED_PENDING_CLAIM and records the procedure and work order. As with every claim step after verify, the acting clinic is the one that TOOK the voucher (claimedByOrgId); a body orgId is not read. Any other clinic is refused with 403, and a voucher no clinic has taken with 409. Requires execute:TransitionVoucherCommand IN that clinic, and runs as the caller at the DAL — see verify.

Arguments

ArgumentTypeDescription
idpathstring (uuid)requiredVoucher id.
bodyJSONobjectrequiredThe request body, as a JSON object. Its fields are listed below.

Fields of body

FieldTypeDescription
notesstringAccepted and forwarded to the service, which DISCARDS it — no notes field is persisted by this step.
procedurestringrequiredWhat was done. Missing or empty answers 400.
workOrderIdstringThe clinic's own work-order reference. Optional here; required at step 3.

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.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "post_vouchers_by_id_perform",
    "arguments": {
      "id": "11111111-1111-4111-8111-111111111111",
      "body": {
        "procedure": "string",
        "notes": "string",
        "workOrderId": "string"
      }
    }
  }
}
Confirmation
The client shows the person the exact request and waits. Nothing runs until they tick Make this change. See Reading and changing.

Result

On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.

The voucher after the transition, as the DAL's TransitionVoucher selection returns it.

json
{
  "code": "string",
  "currency": "string",
  "expiresAt": 1,
  "id": "11111111-1111-4111-8111-111111111111",
  "state": "ACTIVE",
  "value": 1,
  "assignedToOrgId": "11111111-1111-4111-8111-111111111111",
  "batchId": "11111111-1111-4111-8111-111111111111",
  "issuedAt": 1,
  "issuedToEmail": "string",
  "issuedToPhone": "string",
  "maxPayout": 1,
  "procedure": "string",
  "replacedByVoucherId": "11111111-1111-4111-8111-111111111111"
}

Fields

FieldTypeDescription
assignedToOrgIdstring (uuid) | null
batchIdstring (uuid) | null
codestring
currencystring
expiresAtintegerEpoch MILLISECONDS.
idstring (uuid)
issuedAtinteger | nullEpoch MILLISECONDS.
issuedToEmailstring | null
issuedToPhonestring | null
maxPayoutinteger | nullCatalog face-value cap in CENTS.
procedurestring | null
replacedByVoucherIdstring (uuid) | nullThe voucher the DAL minted to replace this one in its batch, if any.
serviceTypestring | null
speciesstring | null
state"ACTIVE" | "APPROVED" | "ASSIGNED" | "AVAILABLE" | "CLAIMED" | "CREATED" | … (17 values)A voucher's lifecycle state, as the DAL's VoucherState enum names it.
valueintegerFace value in CENTS.
voidReasonstring | null

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.

400

The request was malformed or failed a guard.

403

Authenticated, but the caller holds none of the required permissions.

404

No such resource — or none this caller may see.

409

The resource is not in a state that allows this operation.

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.

json
{
  "name": "post_vouchers_by_id_perform",
  "description": "POST /api/vouchers/{id}/perform — Transitions VERIFIED → PERFORMED_PENDING_CLAIM and records the procedure and work order. As with every claim step after verify, the acting clinic is the one that TOOK the voucher (`claimedByOrgId`); a body `orgId` is not read. Any other clinic is refused with 403, and a voucher no clinic has taken with 409. Requires `execute:TransitionVoucherCommand` IN that clinic, and runs as the caller at the DAL — see verify.\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": "Voucher id."
      },
      "body": {
        "type": "string",
        "description": "The JSON request body: { notes: string (Accepted and forwarded to the service, which DISCARDS it — no notes field is persisted ...); procedure*: string (What was done.); workOrderId: string (The clinic's own work-order reference.) }"
      }
    },
    "required": [
      "id",
      "body"
    ]
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": true,
    "idempotentHint": false,
    "openWorldHint": false
  }
}