/api/v1/object/data/{objectSlug}/{dataSlug}Get one record by slug, with its columns and change history.
Get one record by slug, with its columns and change history.
Returns the record in data.data, keyed by field slug, with the same keys
as a record in GET /object/data/{objectSlug}, plus logs: every change
to the record, newest first. data.fields lists the object's columns.
Linked records live in relations, keyed by relation slug. Each cell
holds one page of linked records, newest first, and a pagination block.
page and limit set that page for every cell. When a cell's
pagination.nextPage is not null, fetch the rest from
GET /object/data/{objectSlug}/{dataSlug}/relations/{relationSlug}.
data.duplicate_flag is null unless the credential holds
duplicate-flag.view. Then it holds is_duplicate, linked_records (the
other records flagged as duplicates of this one) and match_keys (the
field slugs that matched).
Query parameters:
page— the page of linked records in each relation cell, from 1. Default1.limit— linked records per relation cell, up to200. Default10.
Scope: read.<object slug>, for example read.contacts.
Errors:
400— no active object has that slug.400—Data with slug '9f2c4b7a1e03' not found: the record does not exist or the credential cannot see it.403— the credential lacksread.<object slug>.422— a query parameter is invalid, for examplelimitis above200.
Response 200:
{
"status": 200,
"message": "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"]
}
],
"data": {
"name-mp9nm29v": "Sara Ali",
"assignees": [],
"name": "Sara Ali",
"relations": {},
"slug": "9f2c4b7a1e03",
"random_id": "a3f9c21b",
"createdAt": "2026-09-14T10:00:00.000Z",
"updatedAt": "2026-09-14T10:05:00.000Z",
"position": null,
"creator": null,
"updater": {
"type": "user",
"slug": "5e1a9c3b7d20",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
},
"linked_record": null,
"capabilities": { "can_edit": true, "can_delete": true, "can_assign": true },
"logs": [
{
"id": 58213,
"action": "updated",
"field_name": "Name",
"old_value": "Sara",
"new_value": "Sara Ali",
"record_name": "Sara Ali",
"record_type": "record",
"object_slug": "contacts",
"data_slug": "9f2c4b7a1e03",
"performed_by": {
"id": 7,
"name": "Omar Hassan",
"profile_image": null,
"actor_type": "admin",
"on_behalf_of": null
},
"ip_address": "203.0.113.24",
"source_type": "manual",
"action_category": "field_change",
"changes": [
{
"fieldName": "name-mp9nm29v",
"displayName": "Name",
"oldValue": "Sara",
"newValue": "Sara Ali",
"type": "updated"
}
],
"metadata": null,
"timestamp": "Sep 14, 2026, 10:05 AM",
"summary": "Name changed from \"Sara\" to \"Sara Ali\"\nin Contacts: Sara Ali\nby Omar Hassan"
}
]
},
"duplicate_flag": 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"
}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