---
title: "Create Object Record"
method: POST
path: "/objects/{object_slug}/records"
tags: ["Objects"]
---

# Create Object Record

`POST /objects/{object_slug}/records`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/objects/{object_slug}/records`
- Auth: HTTP bearer

PREVIEW. This endpoint is deployed but gated: it returns 404 unless the hosted app platform is enabled for your organization. It is published here so the contract describes the whole surface, not so it can be called today.

Create a record.

Every field is validated against the object's attribute definitions. Unknown
fields are rejected with 422 — they are not dropped — and the response lists
every problem at once so a client fixes them in one round trip. A collision on
a unique attribute returns 409.

## Path parameters

- `object_slug` string, required

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Request body

- RecordWriteRequest: A record payload: attribute slugs to values. Untyped by necessity — the valid keys and value shapes come from the customer's own attribute definitions at runtime. Every key is validated against those definitions before anything is written, and an unrecognised one is a 422 rather than a silent drop.
  - `values` object: Attribute values keyed by slug. Call `GET /objects/{object_slug}/attributes` for active fields. Canonical contacts and companies retain CONTACT_*, COMPANY_* and udo_* field names. Unknown keys are rejected with 422. PATCH preserves omitted fields; required fields cannot be cleared with null or an empty multivalue list. Record references must resolve to active records of their configured target object in the same organization and app.

## Response `201`

Successful Response

- ApiResponseObjectRecordResponse
  - `data` ObjectRecordResponse, required: One record, with its currently active attribute values.
    - `id` string, required: Opaque record identifier.
    - `object_slug` string, required: The object type this record belongs to.
    - `values` object: Currently active values, keyed by attribute slug. Shapes follow each attribute's own type; call `GET /objects/{object_slug}/attributes` for the schema.
    - `is_archived` boolean: Archived records are excluded from listings.
    - `revision` integer: Record revision for conditional updates.
    - `created_at` string, date-time, nullable
    - `updated_at` string, date-time, nullable
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
