# contractorOps.payments.update

Administrators set a contractor's payment method (Wise email, bank transfer, Interac, or other), currency, and payment details. Omitted detail fields keep their saved values; null clears them. Responses are masked, the audit log records only which fields changed, the saved Wise recipient is reset, and approved payouts must be approved again. When the saved details can't be read (the profile's paymentDetailsState isn't readable), nothing changes unless the details sent are a complete set for the method; with an encryption key that isn't set any more, that also needs replaceUnreadable: true.

`POST /api/v1/accounting/contractorOps.payments.update`

Permissions: `accounting:read`, `accounting:write`, `accounting:admin` · Roles: admin · Idempotency key required · Send `expectedRevision`

Not available over MCP: Replacing unreadable saved bank details needs an administrator in the dashboard.

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `contractorId` | string (ID) | Yes | The ID of a contractor, from contractors.list. |
| `expectedRevision` | integer |  | The record's current revision, from the last time you read it. If someone changed the record since, the request is refused with a conflict so you can reload and check before trying again. at most 9007199254740991; greater than 0. |
| `idempotencyKey` | string | Yes | Any unique text you generate once per intended change, so a retried request only happens once. Send it as the Idempotency-Key header instead if you prefer; if you send both they must match. 8–200 characters. |
| `method` | enum | Yes | One of: `wise_email`, `bank_transfer`, `interac`, `other`. |
| `currency` | string | Yes | Three-letter currency code, such as CAD or USD. |
| `details` | object | Yes | No other fields. |
| `details.wiseEmail` | string (email) or null |  |  |
| `details.wiseLink` | string or null |  |  |
| `details.accountHolderName` | string or null |  |  |
| `details.bankName` | string or null |  |  |
| `details.bankAddress` | string or null |  |  |
| `details.accountNumber` | string or null |  |  |
| `details.swiftBic` | string or null |  |  |
| `details.iban` | string or null |  |  |
| `details.institutionNumber` | string or null |  |  |
| `details.transitNumber` | string or null |  |  |
| `details.routingNumber` | string or null |  |  |
| `details.accountType` | enum or null |  | One of: `checking`, `savings`. |
| `details.country` | string or null |  |  |
| `details.interacEmail` | string (email) or null |  |  |
| `details.otherInstructions` | string or null |  |  |
| `replaceUnreadable` | boolean |  |  |

## Example request

```bash
curl https://app.getoatmilk.com/api/v1/accounting/contractorOps.payments.update \
  -H "Authorization: Bearer $OATMILK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "contractorId": "4d5e6f7a-8b9c-4d0e-8f1a-2b3c4d5e6f7a",
  "method": "wise_email",
  "currency": "CAD",
  "details": {}
}'
```

Reference page: https://app.getoatmilk.com/docs/api/contractorOps.payments.update
