/api/v1/object/data/{objectSlug}/{dataSlug}Update a record.
Update a record.
Send only what changes. data is keyed by field slug, never by field
name or label; a key you omit keeps its value, and an empty value clears
the field (a required field cannot be cleared). relations is keyed by
relation slug and replaces the links of each relation you send.
admin_slug changes the owner and is ignored when the credential may not
assign records; null removes the owner.
The same values are dropped as on create and listed in dropped_fields.
To upload files, send multipart/form-data as on create; in data, a
file or photo field then lists the stored files to keep.
The response is the whole record after the write, computed fields
included, in the same shape as a record read. _meta.pending_fields
names fields whose value a background recalculation will still replace.
Scope: update.<object slug>, for example update.contacts.
Errors:
400— no record has that slug, a value is invalid (the message startsValidation failed:), a status change is not an allowed transition, a linked record inrelationscannot be found or seen, a file is rejected, or no active object has that slug.403— the credential may not edit this record.409— another record already has the same value in a unique field.422— the body is invalid, for exampledatais not an object.
Request:
{
"data": { "stage-k2j9h4g7": "b2c4d6e8-1a3b-4c5d-8e7f-9a0b1c2d3e4f" }
}
Response 200:
{
"status": 200,
"message": "Data updated successfully",
"data": {
"title-mpoc3dn1": "Sara Ali",
"assignees": [
{
"type": "user",
"slug": "a3f1b2c8e9d7",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
}
],
"email-p0zx7c1v": "sara@example.com",
"stage-k2j9h4g7": [
{
"id": "b2c4d6e8-1a3b-4c5d-8e7f-9a0b1c2d3e4f",
"value": "customer",
"label": "Customer",
"color": "#10B981",
"icon": null
}
],
"name": "Sara Ali",
"relations": {
"company-mf3k2p9a": {
"items": [
{
"type": "relation",
"name": "Acme Inc",
"label": "Acme Inc",
"slug": "2e8b5d1f7c4a",
"random_id": "7d3e9a1c",
"object_slug": "companies",
"object_name": "Companies",
"object_icon": "tabler-building"
}
],
"pagination": {
"total": 1,
"page": 1,
"limit": 10,
"totalPages": 1,
"nextPage": null,
"prevPage": null
}
}
},
"slug": "9f2c4b7a1e03",
"random_id": "5c0e7a9b",
"createdAt": "2026-09-14T10:00:00.000Z",
"updatedAt": "2026-09-14T11:30:00.000Z",
"position": "1000",
"creator": {
"type": "user",
"slug": "a3f1b2c8e9d7",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
},
"updater": {
"type": "user",
"slug": "a3f1b2c8e9d7",
"name": "Omar Hassan",
"email": "omar@example.com",
"profile_image": null
},
"linked_record": null,
"capabilities": {
"can_edit": true,
"can_delete": true,
"can_assign": true
}
},
"_meta": { "enriched": true }
}
Send request
Use the documented inputs to call this endpoint directly.
Parameters
Values are applied to the request and the example on the right.
Request body
application/jsonrequiredData object where keys are field slugs (not field names) Only include fields that need to be updated Example: { "first_name": "Jane", "phone_number": "+1234567890" }
Relations object where keys are field slugs for relation fields Only include relations that need to be updated
Optional slug of another data record to link this record to. Set to null to remove the link. Primarily used for tasks.
Slug of the object that owns linked_data_slug.
Optional for back-compat: a client that sends only linked_data_slug still
links, resolved by scanning object tables for that slug. Sending it here
skips the scan and, more importantly, removes the ambiguity — slugs are
unique per table, not per workspace, so two objects can hold the same one.
Responses
Successful response
{
"dropped_fields": "string",
"warnings": "string",
"message": "string",
"data": "string",
"_meta": "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