post_finance_payouts_by_transactionid_resend_transfer

Changes data · you confirm first

Calls POST /api/finance/payouts/{transactionId}/resend-transfer as the signed-in person · REST reference

Send the Stripe transfer of a settled payout that Stripe never received (platform staff)

The remedy for a NO_TRANSFER_FOUND row of the reconcile report. The payout is already settled in the ledger (the clinic's balance drained, its vouchers PAID) and Stripe holds no live transfer in its transfer_group, so the clinic has not been paid. This asks Stripe again first, exactly as the reconcile does, and only when Stripe still holds nothing does it create the transfer, under an idempotency key that names this attempt, records the row SENT and emails the clinic that its payout was initiated (an offset payout records its clawback's OFFSET leg instead). A row Stripe does hold a transfer for is refused with 409 — the reconcile promotes it; one with a different amount, or one Stripe could not answer for, is refused too, since re-sending on either would risk paying twice. A transfer Stripe refuses is recorded FAILED and reported on the result, not thrown.

Arguments

ArgumentTypeDescription
transactionIdpathstringrequiredThe settled PAYOUT transaction, as the reconcile report names it

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_finance_payouts_by_transactionid_resend_transfer",
    "arguments": {
      "transactionId": "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.

What happened; every money field is integer CENTS

json
{
  "amount": 1,
  "attempt": 1,
  "currency": "string",
  "offsetForClawbackId": "string",
  "orgId": "string",
  "sent": true,
  "stripeDestination": "string",
  "stripeTransferError": "string",
  "stripeTransferId": "string",
  "transactionId": "string"
}

Fields

FieldTypeDescription
amountintegerThe SETTLED amount, in CENTS
attemptintegerWhich transfer attempt this was for the settlement, counting the run's own as the first
currencystring
offsetForClawbackIdstring | nullThe clawback an offset payout collected for; null for a payout
orgIdstring
sentbooleanWhether Stripe accepted the transfer
stripeDestinationstring
stripeTransferErrorstringStripe's refusal, when sent is false; the row is recorded FAILED
stripeTransferIdstring
transactionIdstring

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.

403

Not platform staff

409

PAYOUT_NOT_AWAITING_TRANSFER (the payout is not settled, or its transfer is already SENT or NOT_REQUIRED), PAYOUT_TRANSFER_NOT_MISSING (Stripe holds a transfer for it, or could not be asked), or PAYOUT_NO_DESTINATION (the organization has no connected account)

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_finance_payouts_by_transactionid_resend_transfer",
  "description": "POST /api/finance/payouts/{transactionId}/resend-transfer — The remedy for a `NO_TRANSFER_FOUND` row of the reconcile report. The payout is already settled in the ledger (the clinic's balance drained, its vouchers PAID) and Stripe holds no live transfer in its `transfer_group`, so the clinic has not been paid. This asks Stripe again first, exactly as the reconcile does, and only when Stripe still holds nothing does it create the transfer, under an idempotency key that names this attempt, records the row SENT and emails the clinic that its payout was initiated (an offset payout records its clawback's OFFSET leg instead). A row Stripe does hold a transfer for is refused with 409 — the reconcile promotes it; one with a different amount, or one Stripe could not answer for, is refused too, since re-sending on either would risk paying twice. A transfer Stripe refuses is recorded FAILED and reported on the result, not thrown.\n\nThis changes data. The person is asked to confirm it before it runs, and nothing happens if they decline.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "transactionId": {
        "type": "string",
        "description": "The settled PAYOUT transaction, as the reconcile report names it"
      }
    },
    "required": [
      "transactionId"
    ]
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": true,
    "idempotentHint": false,
    "openWorldHint": false
  }
}