Invoices

Invoices

List, create and send invoices. Scope: invoices.read / invoices.write. Type is fixed to invoice (no type query).

List invoices

GET /v1/invoices

Paginated list of invoices, by default sorted by invoice date (newest first). Filter on client, number, invoice, due or creation date, payment status or `search`

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Query
Name Type Description
page integer
per_page integer
id string
client_id string
number string
date_from string
date_to string
due_date_from string
due_date_to string
created_from string
created_to string
search string
payment_status string Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.
sort string Sort field.
order string Sort direction.
Request body

None

Response
data array
id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

meta object
page integer
per_page integer
total integer
pages integer

Examples

GET /v1/invoices
curl -X GET "https://api.appficient.nl/v1/invoices" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

Create an invoice

POST /v1/invoices

Creates an invoice with `rows` (name, quantity, unit price, VAT rate). The server calculates the totals

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Headers
Name Type Description
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
title string Required
client_id string
client_external_id string
invoice_date string
due_date string
external_id string

Your unique reference. Duplicate → `409`.

Example: inv-2026-00123
generation_mode string

`draft` (default) or `final`.

Enum
draft final
Example: draft
generate boolean

Shortcut for `final`.

rows array
name string
title string
quantity number
unit_price number
unit string
vat_rate string

VAT for this row — a `code` from `GET /v1/tax-rates` (e.g. `VAT21`, `VATINEU`, `VATNONE`) or a percentage (`21`, `21.00`, `9%`). Empty uses the environment default; an unknown value returns 422.

vat_code string

Alias of `vat_rate`.

subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
number string
payment_status string

`paid` registers a payment for the open amount, the same as marking the invoice paid in Appficient. Only on a final invoice; otherwise `422`. Other values record the provider status of an unpaid invoice; on a paid invoice they return `409 invoice_paid`. `partial` is derived from payments and cannot be set; on a partly paid invoice any non-`paid` value is returned as `partial`.

Enum
open paid pending failed canceled expired authorized created chargeback refunded
Response
data object

Document list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

rows array
name string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
source_id string Nullable

The document this one was created from (for example the quote of a workorder, or the workorder of an invoice); an invoice, quote, workorder or subscription id. `null` when it was not created from another document, when the source is a template or another document type the API does not return, or when the user may not see the source workorder.

meta object
generation_mode string

`draft` (default) or `final`.

Enum
draft final
Example: draft
pdf object
generated boolean
status string
message string Nullable
url string Nullable
payment_registered boolean

Only when `payment_status` was `paid`. `false` means the invoice was created but the payment could not be registered; its `payment_status` shows the actual state.

Examples

POST /v1/invoices
curl -X POST "https://api.appficient.nl/v1/invoices" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "00000000-0000-0000-0000-000000000001",
    "title": "Draft invoice",
    "generation_mode": "draft"
}'

Curl, Node and response are shown to the right of this endpoint.

Retrieve an invoice

GET /v1/invoices/{id}

One invoice with its client, rows, totals, dates and payment status

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Request body

None

Response
data object

Document list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

rows array
name string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
source_id string Nullable

The document this one was created from (for example the quote of a workorder, or the workorder of an invoice); an invoice, quote, workorder or subscription id. `null` when it was not created from another document, when the source is a template or another document type the API does not return, or when the user may not see the source workorder.

meta object

Examples

GET /v1/invoices/{id}
curl -X GET "https://api.appficient.nl/v1/invoices/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

Update an invoice

PATCH /v1/invoices/{id}

Send at least one field. A final invoice (with a number) only accepts `payment_status`; other fields return `409 invoice_final`

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Request body
title string
invoice_date string
due_date string
payment_status string

`paid` registers a payment for the open amount, the same as marking the invoice paid in Appficient. Only on a final invoice; otherwise `422`. Other values record the provider status of an unpaid invoice; on a paid invoice they return `409 invoice_paid`. `partial` is derived from payments and cannot be set; on a partly paid invoice any non-`paid` value is returned as `partial`.

Enum
open paid pending failed canceled expired authorized created chargeback refunded
Response
data object

Document list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

rows array
name string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
source_id string Nullable

The document this one was created from (for example the quote of a workorder, or the workorder of an invoice); an invoice, quote, workorder or subscription id. `null` when it was not created from another document, when the source is a template or another document type the API does not return, or when the user may not see the source workorder.

meta object

Examples

PATCH /v1/invoices/{id}
curl -X PATCH "https://api.appficient.nl/v1/invoices/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string",
    "invoice_date": "2026-07-01",
    "due_date": "2026-07-01",
    "payment_status": "open"
}'

Curl, Node and response are shown to the right of this endpoint.

Delete an invoice

DELETE /v1/invoices/{id}

Draft only

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Request body

None

Response
data object

Invoice list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status string (free text; not a closed enum).

paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your own reference for this document, if set.

rows array
name string
description string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
meta object

Examples

DELETE /v1/invoices/{id}
curl -X DELETE "https://api.appficient.nl/v1/invoices/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

Send an invoice

POST /v1/invoices/{id}/send

Sends a finalized invoice by email to `to` and `cc`. The whole body is validated before anything is sent: every address must be valid (`422` `invalid_email`). `send_type` chooses the mail (`invoice`, `credit`, `invoice_rem1`–`invoice_rem3`; default `invoice`); with `reminder` the server chooses the reminder that is due instead. With `include_pdf` (default `true`) a mail without the PDF is never sent (`409` `pdf_missing`). `409` `invoice_draft` (no number yet), `invoice_paid`, `client_reminders_disabled` (reminder types) or `send_failed` (the mail could not be delivered). `422` `send_failed` when the mail was refused for another reason; nothing was sent. For a user the send right for invoices is required (`403` `forbidden`). `403` `EMAIL_NOT_VERIFIED` when the account email address is not confirmed yet during the trial; nothing was sent. `429` `rate_limited` also when the outbound mail limit of the environment is reached; nothing was sent. The AI tool `invoices_send` (MCP) uses stricter rules: see the MCP section of the developer documentation

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Headers
Name Type Description
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
to string Required

Every address must be a valid email address, otherwise `422` (`invalid_email`) and nothing is sent.

subject string Required
message string Required
cc string

Every address must be a valid email address, otherwise `422` (`invalid_email`) and nothing is sent.

send_type string

Email template for send. Allowed per endpoint: invoices `invoice` (default), `credit`, `invoice_rem1`-`3`; quotes `quote` (default), `quote_rem1`-`3`; workorders `workorder`. Another value gives `422` `invalid_value`.

Enum
invoice quote credit invoice_rem1 invoice_rem2 invoice_rem3 quote_rem1 quote_rem2 quote_rem3 workorder
Example: invoice
include_pdf boolean

With `true` the PDF is required; when it cannot be attached the send fails with `409` and nothing is sent.

Example: 1
reminder boolean

Only `true` when a reminder is asked for. The server then sends the reminder that is due for an invoice or quote that was sent before (`invoice_rem1`–`invoice_rem3`, `quote_rem1`). `409` `reminder_unavailable` when the document was never sent or has no reminder (credit invoice, workorder). On REST it cannot be combined with `send_type` (`422`).

Response
data object
success boolean
recipients array
recipients_list string
template boolean

Only via MCP. Always `true`; the official email template of the environment was sent.

send_type string

Only via MCP. The mail that was sent (`invoice`, `credit`, `invoice_rem1`–`invoice_rem3`, `quote`, `quote_rem1`, `workorder`).

subject string

Only via MCP. The subject of the mail that was sent.

meta object

Examples

POST /v1/invoices/{id}/send
curl -X POST "https://api.appficient.nl/v1/invoices/{id}/send" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "string",
    "cc": "string",
    "subject": "string",
    "message": "string",
    "send_type": "invoice",
    "include_pdf": true,
    "reminder": false
}'

Curl, Node and response are shown to the right of this endpoint.

Credit an invoice

POST /v1/invoices/{id}/credit

Defaults to full credit

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Request body
credit_all boolean
Example: 1
row_indexes array

When `credit_all` is false.

Response
data object

Document list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

rows array
name string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
source_id string Nullable

The document this one was created from (for example the quote of a workorder, or the workorder of an invoice); an invoice, quote, workorder or subscription id. `null` when it was not created from another document, when the source is a template or another document type the API does not return, or when the user may not see the source workorder.

meta object

Examples

POST /v1/invoices/{id}/credit
curl -X POST "https://api.appficient.nl/v1/invoices/{id}/credit" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "credit_all": true,
    "row_indexes": [
        0
    ]
}'

Curl, Node and response are shown to the right of this endpoint.

Download invoice PDF

GET /v1/invoices/{id}/pdf
Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Request body

None

Response
data object
id string
pdf_url string
meta object

Examples

GET /v1/invoices/{id}/pdf
curl -X GET "https://api.appficient.nl/v1/invoices/{id}/pdf" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

Finalize an invoice

POST /v1/invoices/{id}/finalize

Turns a draft invoice into a final invoice: it gets its definitive invoice number and PDF, exactly like generating it in Appficient. A final invoice can no longer be changed, only credited or sent

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Headers
Name Type Description
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
invoice_date_mode string

`keep` keeps the invoice date of the draft; `today` sets the invoice date to today and recalculates the due date.

Enum
keep today
Example: keep
Response
data object

Document list item.

id string
number string
title string
invoice_date string
due_date string
created_at string
subtotal number
vat_rate number
vat_amount number
total_excl_vat number
total_incl_vat number
client_id string
payment_status string

Payment status of a document, the same as Appficient shows it: `paid` when the invoice is marked paid, `partial` when payments cover part of it, otherwise the last status from your payment provider (`pending`, `failed`, `canceled`, `expired`, `authorized`, `created`, `chargeback`, `refunded`) or `open`.

Enum
open partial paid pending failed canceled expired authorized created chargeback refunded
paid_at string Nullable
sent_at string Nullable
project_number string Nullable
is_credit boolean
external_id string Nullable

Your reference, if set.

rows array
name string
quantity number
unit string
unit_price number
vat_rate string
total_excl_vat number
total_incl_vat number
client_company_name string
client_firstname string
client_lastname string
web_url string
pdf_url string
source_id string Nullable

The document this one was created from (for example the quote of a workorder, or the workorder of an invoice); an invoice, quote, workorder or subscription id. `null` when it was not created from another document, when the source is a template or another document type the API does not return, or when the user may not see the source workorder.

meta object

Examples

POST /v1/invoices/{id}/finalize
curl -X POST "https://api.appficient.nl/v1/invoices/{id}/finalize" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "invoice_date_mode": "keep"
}'

Curl, Node and response are shown to the right of this endpoint.

List payments for an invoice

GET /v1/invoices/{id}/payments

All payments of an invoice (manual and online) with amount, date, status, type and method. Payments registered in Appficient itself can have type `cash`, `bank_transfer` or `credit_card`. A payment with status `paid` counts towards the paid amount of the invoice

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Query
Name Type Description
external_id string
status string Payment status.
type string Only payments of this type.
Request body

None

Response
data array
id string
amount number
date string
status string

Payment status.

Enum
open pending paid failed canceled expired authorized created chargeback refunded
type string

`manual` or `online`.

Enum
manual online
Example: manual
method string

Payment method.

Enum
ideal paypal klarna bancontact in3 creditcard banktransfer
external_id string
provider string
meta object

Examples

GET /v1/invoices/{id}/payments
curl -X GET "https://api.appficient.nl/v1/invoices/{id}/payments" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

Create a payment

POST /v1/invoices/{id}/payments

Registers a payment on an invoice. `type` defaults to `manual`: the payment is recorded as paid, the same as registering a payment in Appficient (an activity on the invoice; the invoice becomes paid once its payments cover the total). `amount` defaults to the open amount and may not exceed it (`422`, detail `exceeds_open_amount` with the open amount). For `manual` only: the invoice must be final, so a draft gives `422` (detail `invoice_draft`); a quote, workorder or credit note gives `422` (detail `payment_not_allowed`); an invoice that is already paid gives `409 invoice_paid`; while another request registers a manual payment on the same invoice, the call waits briefly and then gives `409 busy` (try again in a moment); a negative `refunded` amount gives `422` (detail `refund_not_supported_manual`, register refunds as `online` with `external_id`). A repeated `external_id` gives `409 duplicate_external_id`. List the payments first (`GET /v1/invoices/ /payments`) so the same payment is not registered twice. On `server_error` the result is unknown: do not retry, list the payments first. The AI tool `invoice_payments_create` (MCP) only registers manual payments: see the MCP section of the developer documentation

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
Headers
Name Type Description
Idempotency-Key string Optional. Replay within 24h returns the same response.
Request body
type string

`manual` or `online`.

Enum
manual online
Example: manual
amount number

Amount incl. VAT. Defaults to the open amount of the invoice and may not exceed it.

date string

Payment date (YYYY-MM-DD). Defaults to today.

description string

Optional note on the payment.

external_id string
provider string
status string

Payment status.

Enum
open pending paid failed canceled expired authorized created chargeback refunded
method string

Payment method.

Enum
ideal paypal klarna bancontact in3 creditcard banktransfer
payment_data object
feedback_data object
Response
data object
invoice object
id string
paid_amount number
price number
payment object
id string
amount number
date string
status string

Payment status.

Enum
open pending paid failed canceled expired authorized created chargeback refunded
type string

`manual` or `online`.

Enum
manual online
Example: manual
method string

Payment method.

Enum
ideal paypal klarna bancontact in3 creditcard banktransfer
external_id string
provider string
meta object

Examples

POST /v1/invoices/{id}/payments
curl -X POST "https://api.appficient.nl/v1/invoices/{id}/payments" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "manual",
    "amount": 0,
    "date": "2026-07-01",
    "description": "string",
    "external_id": "string",
    "provider": "string",
    "status": "open",
    "method": "ideal",
    "payment_data": [],
    "feedback_data": []
}'

Curl, Node and response are shown to the right of this endpoint.

Update a payment

PATCH /v1/invoices/{id}/payments/{payment_id}

Send at least one field. The payment must belong to this invoice, otherwise `404` (`payment_not_found`)

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
payment_id Required string
Request body
amount number
date string
status string
method string
external_id string
provider string
payment_data object
Response
data object
invoice object
id string
paid_amount number
price number
payment object
id string
amount number
date string
status string

Payment status.

Enum
open pending paid failed canceled expired authorized created chargeback refunded
type string

`manual` or `online`.

Enum
manual online
Example: manual
method string

Payment method.

Enum
ideal paypal klarna bancontact in3 creditcard banktransfer
external_id string
provider string
meta object

Examples

PATCH /v1/invoices/{id}/payments/{payment_id}
curl -X PATCH "https://api.appficient.nl/v1/invoices/{id}/payments/{payment_id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 0,
    "date": "2026-07-01",
    "status": "string",
    "method": "string",
    "external_id": "string",
    "provider": "string",
    "payment_data": []
}'

Curl, Node and response are shown to the right of this endpoint.

Delete a payment

DELETE /v1/invoices/{id}/payments/{payment_id}

The payment must belong to this invoice, otherwise `404` (`payment_not_found`) and nothing is deleted. The paid status of the invoice is recalculated

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Path
Name Type Description
id Required string
payment_id Required string
Request body

None

Response

None

Examples

DELETE /v1/invoices/{id}/payments/{payment_id}
curl -X DELETE "https://api.appficient.nl/v1/invoices/{id}/payments/{payment_id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.

List payment terms

GET /v1/payment-terms

The default payment terms of the environment in days: `default` for documents and `default_client` for clients

Authorization: HTTP
name: httpBearer
type: http
scheme: bearer
Request body

None

Response
data array
code string
days integer
label string
meta object

Examples

GET /v1/payment-terms
curl -X GET "https://api.appficient.nl/v1/payment-terms" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

Curl, Node and response are shown to the right of this endpoint.