1. API
  2. Records

Records: Update

Description

Update a record's field values and/or re-parent it. Field and re-parent changes commit together in a single transaction. The updated record is returned in the same data / field_ids envelope as the Get record API.

See the Get record API to learn more about records.

Request

HTTP Method: PATCH

URL: https://<tenant-domain>/api/v2/records/<<record_id>>

Path parameter Description
id The ID of the record to update.

The request body is a JSON object with the following fields:

Body parameter Required Description
field_values No An array of field values to set (see Field values). Fields you omit keep their current value.
parent_id No Re-parent the record under this record ID. Send null to detach it from its parent; omit to leave the parent unchanged.
test_mode No Optional JSON boolean guardrail sent in the request body. For an authorized write, a mismatch returns 422: true requires a test record, false a live record. Omit to update regardless of mode.

An unknown body or query parameter returns a 400. The request must set at least one field value or include parent_id; an empty body or field_values: null returns a 400. An empty field_values array is valid only when parent_id is also present, including null to detach the record.

Field values

Each entry in field_values sets one field and takes one of field_id or field_name, never both, and each field may appear at most once:

Key Required Description
field_id or field_name Yes The field to set, by numeric field_id or by field_name (its name or slug; matching is insensitive to case and separators).
value Yes The field's typed value. Send null to clear the field.

Fields omitted from field_values keep their current value — an update is a partial merge, not a replace. value holds the field's typed value: a string, number, boolean, or ISO 8601 timestamp for scalar fields; a JSON object or array for JSON fields; and a (large) text string for ARTIFACT fields.

Timestamps. TIMESTAMP field values are stored in UTC; v2 converts an offset you send to the equivalent UTC instant. Send a Z-suffixed UTC timestamp to avoid ambiguity.

Example request

curl --proto '=https' --tlsv1.2 \
  -X PATCH \
  "https://<tenant-domain>/api/v2/records/<<record_id>>" \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <<CREDENTIAL.tines_api_key>>' \
  -d '{
    "field_values": [
      { "field_name": "status", "value": "closed" }
    ],
    "parent_id": null
  }'

Response

A successful request returns 200 OK with a JSON object containing a data object representing the updated record and a field_ids map.

Field description

Field Description
data The updated record object (same shape as the Create record API response).
field_ids Map of each returned field's slug key to its immutable field ID, so callers can pin to the ID across renames.

As with create, JSON and ARTIFACT field values are returned as a handle — follow its href with the Get record field API to retrieve the full value.

Sample response

{
  "data": {
    "id": 556,
    "fields": {
      "status": "closed"
    },
    "relationships": {
      "record_type": {
        "id": 42
      },
      "parent_record": null
    },
    "created_at": "2026-07-02T00:00:00Z",
    "updated_at": "2026-07-06T12:30:00Z"
  },
  "field_ids": {
    "status": 101
  }
}

Errors

Errors are returned as a JSON object with an error field, along with an appropriate HTTP status code:

{
  "error": {
    "type": "not_found",
    "message": "Record not found"
  }
}
Status Meaning
400 Invalid request — a malformed record ID or body, an unknown parameter, an invalid or duplicated field reference, or a blank parent_id.
403 The tenant does not have access to records, or the caller lacks permission to update this record.
404 Record not found, or the calling token does not have access to it.
408 The write timed out. Retry the request.
422 The record could not be updated — for example the record type is not editable, a field value failed validation (including an impossible timestamp date or object/array for a non-JSON field), re-parenting would create a cycle or cross modes, or the test_mode guardrail did not match the record's mode.

The error object always carries type and message; validation errors add a field pointer, and some add a hint suggesting a correction.

Was this helpful?
Records: Update | API | Tines