Pagination and filtering

For engineers reading lists from the Quant Flow Platform. The four paging styles the API uses, which endpoints use which, and how ordering, page size and filters behave.

Who this is for

Integration engineers writing list readers, exports and reconciliation jobs.

Four paging styles

List endpoints use one of four styles. Build a small reader per style and map each endpoint to it. Do not assume one envelope across the API.

StyleRequest parametersResponse envelopeTotal count
A. Page number, contentpage (zero-based), sizecontent, page, size, totalElements, totalPagesYes
B. Page number, datapage (zero-based), sizedata, page, size, totalItems, totalPagesYes
C. Page number, itemspage (zero-based), size, sortitems, pageNumber, pageSize, totalResultsYes, no totalPages
D. Cursorlimit, cursoritems, nextCursor, limitNo

page defaults to 0 and size or limit to 20 on every paged endpoint.

Which endpoint uses which style

EndpointStyleOrderPage size rule
GET /api/customersAOldest first, fixed1 to 100. Outside the range is a 400.
GET /api/accountsAOldest first, fixed1 to 100, 400 outside
GET /api/contractsAOldest first, fixed1 to 100, 400 outside
GET /api/transactionsA or DNewest first, fixed1 to 100, 400 outside
GET /api/transactions/breaksANewest first, fixed1 to 100, 400 outside
GET /api/automationsAsort, default createdAt,descAbove 100 returns 100; below 1 returns 1
GET /api/automations/{automationId}/historyAsort, default createdAt,descAs above
GET /api/audit/eventsBsort, default occurredAt,descAbove 100 is reduced to 100 without an error
GET /api/policiesBNo default order is guaranteed by the contract; use returned identifiers for deduplication.Not specified; use the returned page size.
GET /api/policies/{policyId}/versionsBNewest version first, fixedNot specified; use the returned page size.
GET /api/templatesBFixed: SYSTEM scope first, then key ascendingignorePaging=true returns everything in one page
GET /api/approvals/tasksBNewest first (createdAt), fixedNot specified; use the returned page size.
GET /api/approvals/requestsBresolvedAt descending, fixedNot specified; use the returned page size.
GET /api/tenants/{id}/usersCsortNot specified; use the returned page size.
GET /api/tenants/{id}/rolesCsort, default name,ascNot specified; use the returned page size.
GET /api/tenants/{id}/groupsCsort, default name,ascNot specified; use the returned page size.
GET /api/webhooksDNewest first, fixedlimit 1 to 100, 400 outside
GET /api/webhook-eventsDNewest first on occurredAt, fixedlimit 1 to 100, 400 outside

Two single-resource reads also page a nested list. GET /api/tenants/{id}/roles/{roleId} pages the role's holders, and GET /api/tenants/{id}/groups/{groupId} pages the group's members. Both default to first name then last name ascending.

Always read the page size from the response. Endpoints differ on whether an oversized value is rejected, reduced or accepted.

Page number styles (A, B, C)

Request pages from 0 upwards until the page index reaches the last page (totalPages - 1) or a page comes back shorter than the page size.

  • Counts are a snapshot. On transactions, totalElements changes if operations are accepted while you page. The transaction list does not offer a date-range filter. Deduplicate by transaction ID and retain your own reconciliation cut-off and record set.
  • Newest-first lists shift. New records arriving at the front move older records onto later pages, so a record can appear on two pages. Deduplicate on the record's identifier.
  • An empty result is an empty page. A filter matching nothing returns an empty page with status 200.

Transaction log: choose a paging style

GET /api/transactions supports both page/size and cursor/limit. Choose one style per request; mixing their parameters produces 400. For cursor paging, start with limit, then pass nextCursor unchanged with the same filters. The response contains items, nextCursor (null on the last page) and limit, with no totals. The page-based envelope remains unchanged.

Cursor style (D)

Omit cursor for the first page. Pass the previous response's nextCursor to get the next. nextCursor is always present and is null on the last page.

  • The cursor is opaque. Do not construct, parse or store one beyond the current read. A cursor the endpoint did not issue is a 400.
  • On GET /api/webhook-events, a cursor replayed with different filters is a 400. Keep filters constant for the whole read.
  • There is no total count.

Sorting

Only some endpoints take sort. Where it is taken, the form is property or property,asc|desc, and it can be repeated.

EndpointSortable propertiesUnknown property
GET /api/audit/eventsoccurredAt, createdAt, action, category, source, actorId, resourceType, resourceId, outcome400
GET /api/tenants/{id}/usersfirstName, lastName, email, status, createdAt, updatedAt, id, and paths such as role.name500
GET /api/tenants/{id}/rolesname, description, createdAt, updatedAt, id500
GET /api/tenants/{id}/groupskey, name, status, createdAt, updatedAt, id500
GET /api/automations, .../historyUse only sorting fields documented by the endpoint or validated in your environment; no complete property allow-list is published.Do not depend on an undocumented error message; handle the returned status and fall back to the endpoint's default order.

On every other list, ordering is fixed and there is no sort parameter. Use only the listed properties.

Filtering

Filters are optional query parameters and combine with AND. The main ones:

EndpointFilters
GET /api/customersstatus
GET /api/accountscustomerRef, status, assetId
GET /api/contractsassetId (case-insensitive), status
GET /api/transactionsstate, accountRef, txType. An unknown state or txType is a 400.
GET /api/transactions/breaksreason, accountRef (originating account only), from (inclusive), to (exclusive), both ISO 8601. An unknown reason returns an empty page, since the set of reasons is open.
GET /api/audit/eventsoccurredFrom, occurredTo, actorIds (repeatable or comma-separated), requestId, action, source, resourceType, resourceId, and query (case-insensitive prefix match on identifier fields, at most 128 characters)
GET /api/webhook-eventstype, from (inclusive), to (exclusive), status, webhookId. from and to accept ISO 8601 or yyyy-MM-dd HH:mm:ss.SSS.
GET /api/automationsstatus, triggerType, scriptId, rootScriptId, userId
GET /api/approvals/tasksstatus (one per call, default PENDING)
GET /api/approvals/requestsstatus, actedBy, resolvedFrom, resolvedTo, action, resourceId
GET /api/policiesstatus, ruleType
GET /api/tenants/{id}/userssearch, status, role

Time windows on breaks and delivery history are half-open (from inclusive, to exclusive), so consecutive windows cover a timeline without overlap.

On GET /api/approvals/requests, either resolvedFrom or resolvedTo excludes every unresolved request. Leave both off to see PENDING requests.

The automation status filter accepts values that an automation does not reach (PAUSED, IN_PROGRESS, COMPLETED, FAILED, DRAFT). The lifecycle statuses are ACTIVE, INACTIVE, DISABLED and DELETED. Filtering by another value returns an empty page.

Exports

GET /api/audit/events/export takes the same filters as the audit list and returns the whole filtered set as CSV, newest first. It is not paged. See Audit and evidence.

Worked example

Read operations for one account, page by page.

Illustrative example built from the schema.

GET /api/transactions?accountRef=ACC-000184-GBP&txType=TRANSFER&page=0&size=2 HTTP/1.1
Host: api.qfp.quantnetwork.net
Authorization: Bearer eyJraWQiOiJ...
API-Version: 1.0.0
HTTP/1.1 200 OK
Content-Type: application/json

{
  "content": [
    {
      "transactionId": "6a2e9c14-8b37-4f0d-a5c1-3e7b9d2f4a80",
      "txType": "TRANSFER",
      "assetId": "GBP",
      "accountRef": "ACC-000184-GBP",
      "customerRef": "CUST-000184",
      "counterpartyRef": "ACC-000207-GBP",
      "amount": "250.00",
      "params": {},
      "state": "CONFIRMED",
      "txHash": "0x9f2c1d5e4b8a37c06d1e5f9a2b4c7d8e0f1a2b3c4d5e6f708192a3b4c5d6e7f8",
      "blockNumber": 18446744,
      "createdAt": "2026-08-06T10:02:41.310Z",
      "updatedAt": "2026-08-06T10:03:05.877Z"
    },
    {
      "transactionId": "1d8f5b30-2c64-4e9a-b7f2-0a4c6e8d1b95",
      "txType": "TRANSFER",
      "assetId": "GBP",
      "accountRef": "ACC-000184-GBP",
      "customerRef": "CUST-000184",
      "counterpartyRef": "ACC-000311-GBP",
      "amount": "75.20",
      "params": {},
      "state": "SUBMITTED",
      "txHash": "0x4b7e2a9c1f3d58e06a2c4b8d9e0f1a3b5c7d9e2f4a6b8c0d1e3f5a7b9c2d4e6f",
      "createdAt": "2026-08-06T09:58:12.004Z",
      "updatedAt": "2026-08-06T09:58:40.512Z"
    }
  ],
  "page": 0,
  "size": 2,
  "totalElements": 7,
  "totalPages": 4
}

Read the next page with page=1, and stop after page=3.

Read delivery history with a cursor:

GET /api/webhook-events?status=PARKED&limit=20 HTTP/1.1
Host: api.qfp.quantnetwork.net
Authorization: Bearer eyJraWQiOiJ...
API-Version: 1.0.0

The response carries nextCursor. Send it back unchanged, with the same filters:

GET /api/webhook-events?status=PARKED&limit=20&cursor=eyJrIjpbIjIwMjYtMDgtMjhUMDk6MTU6MTFaIiwiMDE5OGMyZjctYWFkZC04ZmNjLWUwYTEtM2M0ZDVlNmY3YThiIl0sImYiOiI3YTJmOWMxNCJ9 HTTP/1.1
Host: api.qfp.quantnetwork.net
Authorization: Bearer eyJraWQiOiJ...
API-Version: 1.0.0

View in API Reference

Errors and edge cases

SituationResponse
Negative page400 on style A endpoints.
size outside 1 to 100 on customers, accounts, contracts, transactions, breaks400, not reduced.
limit outside 1 to 100 on cursor endpoints400, not reduced.
Unknown or altered cursor, or cursor reused with different filters400. Restart from the first page.
Unknown sort property400 on audit search, 500 on identity lists.
Inverted time range400 on audit, breaks, approvals and delivery history.

API Reference

Open an endpoint for request fields, response examples and the interactive API console.

Related pages


Did this page help you?