Skip to content

Find API

The Find API is the standard way to query and paginate through component model data. It returns a page of records along with total count metadata, and optionally resolves relation fields to their referenced documents.


When to use Find vs. other endpoints

Use case Recommendation
Paginated UI — fetching a page of results Find API (this page)
Processing all records — exports, migrations find(..., { stream: true })
Complex aggregations — grouping, facets Aggregation endpoint
Relation data exceeds 5 MB find(..., { stream: true })

Usage (SDK)

const result = await platform.component('orders').find({
    currentPage: 1,
    perPage: 25,
    sortBy: 'CreatedAt',
    sortDesc: -1,
    filter: 'paid',
    filterOn: ['status'],
})

console.log(result.total)        // total matching records
console.log(result.total_pages)  // total pages
console.log(result.items)        // records on this page

With an advanced filter (MongoDB query)

const result = await platform.component('orders').find(
    { currentPage: 1, perPage: 25 },
    {
        $adv: { status: 'paid', amount: { $gte: 100 } },
    }
)

With a custom sort pipeline

const result = await platform.component('orders').find(
    { currentPage: 1, perPage: 25 },
    {
        $aggregate: [{ $sort: { 'data.amount': -1 } }],
    }
)

HTTP API

GET /{version}/system/component/{ref}/models

All parameters are passed as URL query string values.

Query parameters

Parameter Type Default Description
offset integer 1 Page number (1-based)
limit integer 250 Records per page. Clamped to 250 if 0 or greater than 250
sortBy string CreatedAt Field to sort by
sortDesc integer -1 Sort direction: -1 descending, 1 ascending
filter string Full-text search term applied across filterable fields
filterOn string Comma-separated list of fields to restrict the text search to
dateFrom string (ISO 8601) Lower bound for date range filter
dateTo string (ISO 8601) Upper bound for date range filter
dateField string CreatedAt Field to apply the date range filter against
$adv JSON string Raw MongoDB query filter (serialised JSON object)
$aggregate JSON string Custom aggregation pipeline stages (JSON array). See pipeline rules
disabled boolean false When true, includes soft-deleted records

Response

{
    "items": [ /* array of model records */ ],
    "total": 1234,
    "total_filtered": 1234,
    "total_pages": 50,
    "page": 1
}
Field Description
items Records on the requested page. Each record has uuid, data, CreatedAt, UpdatedAt, and resolved relation fields
total Total matching records (capped at 5 000, see limits)
total_filtered Same as total when a filter is active
total_pages Total number of pages (capped to reflect the 5 000-record limit)
page The current page number

Pipeline validation

Pipelines supplied via $aggregate are validated before execution.

Allowed stages

Stage Description
$match Filter documents
$sort Sort documents
$project Shape output documents
$addFields / $set Add or overwrite computed fields
$unset Remove fields
$limit Limit result count
$skip Skip documents (maximum value: 5 000)
$group Group and aggregate
$facet Multi-faceted aggregation
$unwind Deconstruct arrays
$count Count documents

Forbidden stages

Stage Reason
$lookup Expensive cross-collection joins are handled internally by the relation resolver
$out / $merge Write operations are not permitted in query pipelines
$sample Random sampling can be slow on large collections
Any other stage Not on the allow-list

Pipeline length

A pipeline may contain at most 10 stages. Requests with longer pipelines are rejected.


Limits

Limit Value
Maximum records per page (limit) 250
Maximum records accessible (skip + limit) 5 000
Maximum pages shown Derived from 5 000 ÷ limit
Maximum total reported Capped at 5 000 even if more records exist
Relation data per page 5 MB
Pipeline stages 10
$skip value in user pipeline 5 000
Operation timeout 30 seconds

5 000-record cap

The Find API is designed for paginated UIs. If you need to access more than 5 000 records, use the streaming endpoint which supports up to 25 000 records with no relation-data cap per record.


Error responses

HTTP status Condition
400 Bad Request Invalid filter, disallowed pipeline stage, page beyond the 5 000-record limit, pipeline too complex
400 Bad Request Relation data for the page exceeds 5 MB — switch to the streaming endpoint
408 Request Timeout Operation did not complete within 30 seconds

Common error messages

pipeline too complex: has N stages, maximum allowed is 10
disallowed pipeline stage: $lookup
maximum allowed page is N (limited to 5000 records)
requested records exceed maximum limit of 5000
$skip value too high: N (maximum 5000)
relation data exceeds 5 MB limit; use the streaming endpoint

FAQ

Can I sort by a relation field? Yes. Use $sort in the $aggregate pipeline targeting the internal _RefObj suffix field that the server embeds for relation fields (e.g., { $sort: { 'data.owner_RefObj.name': 1 } }).

Why is my total capped at 5 000? The Find API enforces a 5 000-record ceiling on offset-based pagination to protect query performance in a multi-tenant environment. Use the streaming endpoint for bulk access.

The relation data size error appears even with a small page size. Why? Each record on the page may reference many documents in another collection. The 5 MB budget accounts for the total raw BSON size of all resolved relation data for the page — not just the number of records. Reduce perPage or switch to the streaming endpoint.