/api/v1/object/data/{objectSlug}List an object's records, with filters and sorting.
List an object's records, with filters and sorting.
Returns one page of records in data.data and the object's columns in
data.fields: its fields first, then one entry per relation. Only records
the credential can see are returned. Without filters or sortBy, the
newest records come first.
Record values are keyed by field slug. Each record also carries name,
assignees, creator, updater, createdAt, updatedAt, and
capabilities (what the credential may do to that record). Linked records
live in relations, keyed by relation slug. Each relation cell holds up to
10 linked records and a pagination block; follow pagination.nextPage on
GET /object/data/{objectSlug}/{dataSlug}/relations/{relationSlug}.
A record carries is_duplicate only when the credential holds
duplicate-flag.view. It carries signals (open tasks, overdue, unread
messages, mentions) only when GET /object/features reports
record_signals: true.
Query parameters:
page— page number, from 1. Default1.limit— records per page, up to200. Default25.filters— a URL-encoded JSON array of conditions. A record must match all of them. At most 50 conditions. A value that is not a JSON array is ignored. Each condition has these keys:fieldSlug— a field slug, a relation slug, or one ofcreated_at,updated_at,created_by,updated_byandlinked_record. A condition on an unknown slug is ignored.operator— one ofequals,does_not_equal,includes,does_not_include,multi_includes,starts_with,ends_with,is_empty,is_not_empty,greater_than,less_than,greater_than_or_equal,less_than_or_equal,between,before,after,date_between,today,this_weekorthis_month. Each entry indata.fieldslists the operators it supports infilterOperators.value— what to compare with. Omit it foris_empty,is_not_empty,today,this_weekandthis_month. Formulti_includes, send an array; a record matches if any entry matches.valueTo— the upper bound forbetweenanddate_between. Both bounds are inclusive.
sortBy— a field slug,created_atorupdated_at. A belongs-to relation slug sorts by the linked record's name. An unknown value is ignored.sortDirection—ascordesc. Defaultasc.adminSlug— member slugs, comma-separated. Returns records assigned to any of them.unassigned—truereturns records with no assignee. Combined withadminSlug, a record matches either one.
How value is read:
- Text:
includes,starts_withandends_withignore case;equalsdoes not. - Select, status, priority and source fields: the option
id. Multi-select and tag fields:includeswith an optionid. - Dates,
created_atandupdated_at: a day asYYYY-MM-DD, in the credential owner's timezone.beforeandafterexclude that day. created_byandupdated_by: a member slug.- Relations and
linked_record: the linked record's slug. Relations supportequals,is_emptyandis_not_empty.
Example filters value, before URL encoding:
[
{ "fieldSlug": "email-k2v8x1qa", "operator": "ends_with", "value": "@example.com" },
{ "fieldSlug": "created_at", "operator": "date_between", "value": "2026-09-01", "valueTo": "2026-09-14" }
]
Scope: read.<object slug>, for example read.contacts.
Errors:
400— no active object has that slug.400—sortBynames a relation or lookup that links many records (codeRELATION_SORT_UNSUPPORTEDorLOOKUP_SORT_UNSUPPORTED).400— a condition names a lookup field whose source no longer exists (codeLOOKUP_FILTER_UNSUPPORTED).403— the credential lacksread.<object slug>.422— a query parameter is invalid, for example an unknownoperator, more than 50 conditions, orlimitabove200.
Response 200:
{
"status": 200,
"message": "Object data retrieved successfully",
"data": {
"fields": [
{
"name": "name",
"slug": "name-mp9nm29v",
"label": "Name",
"type": "text",
"icon": null,
"options": null,
"is_system": true,
"api_only": false,
"field_group": null,
"required": false,
"default_value": null,
"sort_order": 0,
"is_active": true,
"filterOperators": ["includes", "multi_includes", "does_not_include", "equals", "does_not_equal", "starts_with", "ends_with", "is_empty", "is_not_empty"]
},
{
"name": "email",
"slug": "email-k2v8x1qa",
"label": "Email",
"type": "email",
"icon": null,
"options": null,
"is_system": false,
"api_only": false,
"field_group": null,
"required": false,
"default_value": null,
"sort_order": 1,
"is_active": true,
"filterOperators": ["includes", "multi_includes", "equals", "does_not_equal", "starts_with", "ends_with", "is_empty", "is_not_empty"]
}
],
"data": [
{
"name-mp9nm29v": "Sara Ali",
"assignees": [
{
"type": "user",
"slug": "5e1a9c3b7d20",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
}
],
"email-k2v8x1qa": "sara@example.com",
"name": "Sara Ali",
"relations": {},
"slug": "9f2c4b7a1e03",
"random_id": "a3f9c21b",
"createdAt": "2026-09-14T10:00:00.000Z",
"updatedAt": "2026-09-14T10:00:00.000Z",
"position": null,
"creator": {
"type": "user",
"slug": "5e1a9c3b7d20",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
},
"updater": null,
"linked_record": null,
"capabilities": { "can_edit": true, "can_delete": true, "can_assign": true }
}
]
},
"pagination": {
"total": 1,
"page": 1,
"limit": 25,
"totalPages": 1,
"nextPage": null,
"prevPage": null
}
}
Send request
Use the documented inputs to call this endpoint directly.
Parameters
Values are applied to the request and the example on the right.
Responses
Successful response
{
"message": "string",
"data": "string",
"pagination": "string"
}Bad request
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Unauthorized
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Internal server error
{
"status": 1,
"message": "string",
"code": "string",
"data": {}
}The HTTP status code of the response.
What went wrong. Several validation messages are joined with ", ".
A stable, machine-readable reason. Only some errors set it.
Extra detail about the error. Only some errors set it.
Powered by heyo-docs