Conventions

Conventions

Every request and response follows the same rules. Know this page and you know the API.

The envelope

Every response shares the same shape. Success:

json
{
  "data": { },
  "meta": { }
}

Failure:

json
{
  "error": {
    "code": "not_found",
    "message": "Invoice not found."
  }
}

data holds the object or list you asked for. meta holds extras such as pagination. There is no top-level success boolean. On failures, see Errors for the error object.

Identifiers

Every object has a guid: a stable UUID. Relations use *_guid, for example client_guid on an invoice. Store these GUIDs in your own system.

Have your own ids? Use external_id: a free-form field you set and can filter on where the endpoint supports it.

Dates and amounts

  • Dates: YYYY-MM-DD, e.g. 2026-07-21 (as with invoice_date / due_date).
  • Timestamps: ISO-style strings in fields such as created_at, paid_at and sent_at.
  • Amounts: decimal euro values. On invoices e.g. subtotal, vat, vat_price, total_ex_vat and total_inc_vat.

Pagination

List endpoints paginate with page and per_page. Default page=1, default per_page=25, maximum per_page=200.

bash
curl -sS "https://api.appficient.nl/v1/invoices?page=2&per_page=50" \
  -H "Authorization: Bearer apf_your_key_here"

meta tells you where you are:

json
{
  "data": [ ],
  "meta": {
    "page": 2,
    "per_page": 50,
    "total": 128,
    "pages": 3
  }
}

Filter, search and sort

  • Filter with query parameters, e.g. ?client_guid=... or ?payment_status=....
  • Search with ?search=... (many lists also accept ?qs=...) on fields documented per endpoint.
  • Sort with ?sort= and ?order=asc|desc. Supported sort fields are listed per endpoint.

An unknown filter, sort or enum value returns 422 with details. The API never silently substitutes a value.