contractorOps.history.markPaid
Record imported timesheets as paid, for example once the payroll that settled them went out: ids (the historyId of each imported row, up to 500), paidOn (today when omitted; never in the future), an optional transactionId of the bank payment that paid them (money out of an account, and then every row must be the same contractor's; it counts once as money sent even if it's linked to the contractor later), an optional note, and idempotencyKey. Rows already paid are left as they are and counted in alreadyPaid. Oatmilk pay periods aren't marked here; they're paid through their payouts. Importing the table again never marks them unpaid. Audited for each contractor.
/api/v1/accounting/contractorOps.history.markPaidPermissions
Who can call it
Retries
MCP
accounting_contractor_ops_history_mark_paidFields
idsarray of strings (ID)Required1–500 items
paidOnstring (date)A date, as YYYY-MM-DD.
transactionIdstring (ID) or nullThe ID of a bank or card transaction, from transactions.list.
notestringA short note, kept with the record.
at most 500 characters
idempotencyKeystringRequiredAny 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
Example
curl https://app.getoatmilk.com/api/v1/accounting/contractorOps.history.markPaid \
-H "Authorization: Bearer $OATMILK_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"ids": [
"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"
]
}'{
"data": { … }
}Try it
Try it
Checks your input with this action’s real schema and answers like the API, with synthetic data. No key needed, and nothing changes.
curl https://app.getoatmilk.com/api/v1/accounting/contractorOps.history.markPaid \
-H "Authorization: Bearer $OATMILK_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"ids": [
"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"
]
}'More in Contractors.