/api/v1/object/data/{objectSlug}Create a record.
Create a record.
Put field values in data, keyed by field slug, never by field name or
label. Find the slugs with GET /object/{objectSlug}/fields. A choice
field takes the option id, or an array of ids for multi-value fields.
Keys that are not fields of the object are ignored. Fields you leave out
get their default value.
relations links other records, keyed by relation slug, each value a
record slug or an array of record slugs (at most 1,000). admin_slug sets the owner; it
is ignored when the credential may not assign records, and the owner is
then the credential's user. parent_link also points a relation of an
existing record at the new one, in the same transaction; the response
then carries that record in parent_record.
Some values are never written: computed fields (calculation,
serial_number, lookup, rollup); fields marked API-only unless you
call with an API key or OAuth token; and source_name, session_name
and provider_id fields when you call with a user session. The keys
removed are listed in dropped_fields. Non-fatal problems are listed in
warnings.
To upload files, send multipart/form-data: put data and relations
as JSON strings, and add each file as a part named after its file or
photo field's slug. A file may be up to 100 MB; the field's own settings
can narrow the size and the formats.
The response is the new record, in the same shape as a record read.
Scope: create.<object slug>, for example create.contacts.
Errors:
400— a value is invalid or a required field is missing (the message startsValidation failed:), a required relation is missing, a linked record inrelationscannot be found or seen, a file is rejected, a linked or parent record does not exist, another record already has the same values for a field set marked as a possible duplicate, or no active object has that slug.409— another record already has the same value in a unique field.422— the body is invalid, for exampledatais not an object.
Request:
{
"data": {
"title-mpoc3dn1": "Sara Ali",
"email-p0zx7c1v": "sara@example.com",
"stage-k2j9h4g7": "6a1f3c9e-2b7d-4e8a-9f0c-1d2e3f4a5b6c"
},
"relations": { "company-mf3k2p9a": "2e8b5d1f7c4a" },
"admin_slug": "a3f1b2c8e9d7"
}
Response 201:
{
"status": 201,
"message": "Data created 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": "6a1f3c9e-2b7d-4e8a-9f0c-1d2e3f4a5b6c",
"value": "lead",
"label": "Lead",
"color": "#3B82F6",
"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-14T10:00: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
}
}
}
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) Example: { "first_name": "John", "email_address": "john@example.com" }
Relations object where keys are field slugs for relation fields
Optional slug of another data record to link this record to. Primarily used for linking tasks to other objects (customers, orders, etc.)
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.
Optional atomic parent link — creates this record AND points a
relation field on a pre-existing parent record at the newly created
row, inside one transaction. Replaces the legacy two-step FE flow
(POST → PUT). See ParentLinkDto.
Responses
Successful response
{
"dropped_fields": "string",
"warnings": "string",
"parent_record": "string",
"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