Pagination
List endpoints are paginated. Control paging with query parameters:
| Parameter | Default | Description |
|---|---|---|
per_page |
15 | Items per page |
page |
1 | Page number |
Some lists accept filters — for example invoices: ?status=sent&date_from=2026-01-01&date_to=2026-03-31.
Response envelope (core endpoints)
Core /api/v1/* lists (invoices, customers, quotes, expenses, contacts, payments, organizations, …) return a links + meta envelope, with the rows nested under data.data:
{
"success": true,
"message": null,
"data": {
"data": [ { "id": 1, "...": "..." } ],
"links": {
"first": "https://.../api/v1/invoices?page=1",
"last": "https://.../api/v1/invoices?page=5",
"prev": null,
"next": "https://.../api/v1/invoices?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"per_page": 15,
"to": 15,
"total": 73
}
}
}
Use meta.total / meta.last_page for counts and links.next (or page=N) to iterate.
Response envelope (flat variant)
A few endpoint families (/api/v1/recurring/invoices, /api/v1/webhooks) return the paginator fields directly inside data instead:
{
"success": true,
"data": {
"current_page": 1,
"data": [ { "id": 1, "...": "..." } ],
"next_page_url": "https://.../api/v1/webhooks?page=2",
"per_page": 15,
"total": 73
}
}
The OpenAPI specification documents the exact envelope for every endpoint (PaginationMeta/PaginationLinks vs LengthAwarePaginator schemas), so generated clients pick the right shape automatically.