Quotes

Quotes

List and create quotes. Same shape as invoices, type quote. Scope: invoices.read / invoices.write.

List quotes

GET /v1/quotes

Paginated list of quotes, with the same filters and sorting as the invoice list

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/quotes
curl -X GET "https://api.appficient.nl/v1/quotes" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

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

Create a quote

POST /v1/quotes

Same body as create invoice

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/quotes
curl -X POST "https://api.appficient.nl/v1/quotes" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "00000000-0000-0000-0000-000000000001",
    "title": "Draft quote",
    "generation_mode": "draft"
}'

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

Retrieve a quote

GET /v1/quotes/{id}

One quote with its client, rows, totals and dates

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/quotes/{id}
curl -X GET "https://api.appficient.nl/v1/quotes/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

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

Update a quote

PATCH /v1/quotes/{id}

Send at least one field

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/quotes/{id}
curl -X PATCH "https://api.appficient.nl/v1/quotes/{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 a quote

DELETE /v1/quotes/{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/quotes/{id}
curl -X DELETE "https://api.appficient.nl/v1/quotes/{id}" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

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

Send a quote

POST /v1/quotes/{id}/send

Same body and checks as sending an invoice. `send_type` is `quote` (default) or `quote_rem1`–`quote_rem3`. `404` when the id is not a quote; `409` `quote_draft` (no number yet) or `quote_paid`. For a user the send right for quotes is required (`403`). The AI tool `quotes_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
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/quotes/{id}/send
curl -X POST "https://api.appficient.nl/v1/quotes/{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.

Accept a quote

POST /v1/quotes/{id}/accept
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

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

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

Download quote PDF

GET /v1/quotes/{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/quotes/{id}/pdf
curl -X GET "https://api.appficient.nl/v1/quotes/{id}/pdf" \
  -H "Authorization: Bearer apf_xxxxxxxx" \
  -H "Accept: application/json"

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

Finalize a quote

POST /v1/quotes/{id}/finalize

Turns a draft quote into a final quote: it gets its definitive number and PDF, exactly like generating it in Appficient. After this it can be 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/quotes/{id}/finalize
curl -X POST "https://api.appficient.nl/v1/quotes/{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.

Convert a quote to a workorder

POST /v1/quotes/{id}/workorder

Creates a new open workorder from the quote, like "Copy to workorder" in Appficient: same client, title and rows, `source_id` is the quote. The quote itself does not change. Like in the app, the new workorder gets its workorder number (WB series) at once; it stays open (editable) until it is completed. No invoice or quote number is used. A quote can be converted more than once (as in the app). Via MCP a second workorder from the same quote within 15 minutes is refused with `409` `workorder_exists` and the existing workorder in `data.id`; use that one instead of retrying. For a user only a workorder he may see counts. While another request converts the same quote, the call waits briefly and then gives `409` `busy`: try again in a moment. Returns the new workorder

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

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

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

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