Mark an invoice paid
Record a payment received outside Centerfy: sets the invoice to paid and adds its amount to the contact's revenue. No money is moved.
POST
https://api.centerfy.ai/webhooks/inbound/invoices/:id/mark-paid Headers
| Header | Required | Value | Description |
|---|---|---|---|
x-api-key | Yes | your sub-account API key (cfy_…) | Authenticates the request; or use Authorization: Bearer <key>. |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | Yes | The invoice id. |
Body parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
payment_method | string | No | — | How it was paid, e.g. cash or check. Defaults to manual. |
Request body
{
"payment_method": "check"
}Example
curl -X POST "https://api.centerfy.ai/webhooks/inbound/invoices/{id}/mark-paid" \
-H "x-api-key: $CENTERFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"payment_method": "check"
}' import { CenterfyClient } from "@centerfy/sdk";
const centerfy = new CenterfyClient({ apiKey: process.env.CENTERFY_API_KEY! });
const result = await centerfy.invoices.markPaid("<invoiceId>", {
"payment_method": "check"
});
console.log(result); centerfy invoices mark-paid <invoiceId> '{"payment_method":"check"}' MCP tool: centerfy_invoices_mark_paid (see MCP server)
Response
{
"status": "success",
"invoice": {
"id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
"invoice_number": "INV-2026-0012",
"contact_id": "3f1c2a9e-7b4d-4c8a-9e2f-1a2b3c4d5e6f",
"quote_id": null,
"amount": 1575,
"status": "paid",
"issued_at": "2026-10-06T10:00:00.000Z",
"due_date": "2026-11-05",
"paid_at": "2026-10-08T14:00:00.000Z",
"payment_method": "check",
"notes": "Net 30",
"items": [
{
"item": "Website redesign",
"quantity": 1,
"amount": 1500
},
{
"item": "Monthly hosting",
"quantity": 3,
"amount": 25
}
],
"payment_url": null,
"payment_link_expires_at": null,
"created_at": "2026-10-06T10:00:00.000Z",
"updated_at": "2026-10-06T10:00:00.000Z"
},
"contact_revenue_updated": true
}Errors
409— if the invoice is already paid or is void.404— if the invoice is not in this sub-account.
Notes
The body is optional. contact_revenue_updated is false if the invoice has no contact or the revenue update failed (the invoice is still marked paid).