Records: Get
Description
A record is a piece of structured, queryable data captured from a story, the API, or the UI. See Records in the Tines docs to learn more.
Fetch a single record by numeric ID. Get supports sparse fieldsets, inline expansion of artifact-backed fields, and embedding its record type, child records, and cases. Every response includes a bare parent record reference when one exists.
You can find record IDs in the response from the Search records API.
Request
HTTP Method: GET
| Path parameter | Description |
|---|---|
| id | The ID of the record to retrieve. |
| Query parameter | Description |
|---|---|
| record_type_id | Optional Scope the lookup to this record type — faster, and returns 404 if the record does not belong to it. |
| include | Optional Accepted values are record_type, parent_record, child_records, child_record_ids, and cases. record_type, child_records, and cases embed bodies under included; parent_record does not change the response because its bare reference is always present in relationships; child_record_ids adds an IDs-only list under relationships.child_record_ids rather than any body. To-many embeds are capped at 20 and flagged truncated. |
| expand | Optional Artifact-backed fields to hydrate inline instead of returning a handle, for example fields.payload or fields.* for all of them. |
| fields | Optional Sparse fieldset: fields[record]=status,severity. Omit for all fields. |
| timezone | Optional IANA timezone name for timestamp output. Defaults to UTC. |
curl -X GET \
https://<tenant-domain>/api/v2/records/<<record_id>> \
-H 'content-type: application/json' \
-H 'Authorization: Bearer <<CREDENTIAL.tines_api_key>>'
For a faster lookup, scope to the record type:
curl -X GET \
"https://<tenant-domain>/api/v2/records/<<record_id>>?record_type_id=<<record_type_id>>" \
-H 'content-type: application/json' \
-H 'Authorization: Bearer <<CREDENTIAL.tines_api_key>>'
Example request embedding relationships
curl -X GET \
"https://<tenant-domain>/api/v2/records/<<record_id>>?include=record_type,child_records,cases" \
-H 'content-type: application/json' \
-H 'Authorization: Bearer <<CREDENTIAL.tines_api_key>>'
Example request expanding an artifact field
curl -X GET \
"https://<tenant-domain>/api/v2/records/<<record_id>>?expand=fields.payload" \
-H 'content-type: application/json' \
-H 'Authorization: Bearer <<CREDENTIAL.tines_api_key>>'
Response
A successful request returns a JSON object with a data object representing the record, a field_ids map, and (when requested) an included object.
Field description
| Field | Description |
|---|---|
| data | The record object (see below). |
| field_ids | Map of each returned field's slug key to its immutable field ID, so callers can pin to the ID across renames. |
| included | Present only when include is used. Holds the embedded bodies: record_type (a one-element array of { id, name, slug }) when include=record_type, and child_records and/or cases when those are requested. |
The data object contains:
| Field | Description |
|---|---|
| id | Integer ID of the record. |
| fields | Field values keyed by field slug (field_<id> when two fields share a slug). Scalar fields hold their typed value; TIMESTAMP fields are ISO 8601 strings; an unexpanded artifact-backed field is returned as a handle (see Artifact-backed fields). |
| relationships | record_type ({ "id" }) and parent_record ({ "id" }, or null), regardless of include. When child_records/cases are included, each also appears here as { "truncated": <bool> }. When child_record_ids is included, it appears here as { "ids": [<int>], "truncated": <bool> } — every direct child's ID, including children the caller cannot read. |
| created_at | ISO 8601 creation timestamp (UTC unless a timezone is supplied). |
| updated_at | ISO 8601 last-updated timestamp (UTC unless a timezone is supplied). |
When include=child_records or include=cases is used, the top-level included object holds the embedded bodies:
child_records— an array of record bodies (same shape asdata), capped at 20.cases— an array of{ id, name, status, priority, linked_at, created_at, updated_at }, capped at 20.idis the public case number (for example42).
child_record_ids is not embedded under included; its IDs live in relationships.child_record_ids and expose every direct child, including children the caller cannot read.
When a to-many embed is capped, its relationships entry carries "truncated": true. Use the List child records API, List child record IDs API, and List linked cases API to page through the full set.
Artifact-backed fields
By default, JSON and ARTIFACT field values are returned as a handle rather than inlined, whatever their size:
{ "expandable": true, "href": "/api/v2/records/<id>/fields/<field_id>" }
Either follow the href with the Get record field API, or pass expand=fields.<key> (or expand=fields.*) to hydrate the value inline in this response.
Sample response
{
"data": {
"id": 555,
"fields": {
"status": "open",
"payload": {
"expandable": true,
"href": "/api/v2/records/555/fields/103"
}
},
"relationships": {
"record_type": {
"id": 42
},
"parent_record": null
},
"created_at": "2026-07-02T00:00:00Z",
"updated_at": "2026-07-02T00:00:00Z"
},
"field_ids": {
"status": 101,
"payload": 103
}
}
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 — unknown query parameter, field, include, expand target, or timezone. |
| 403 | The tenant does not have access to records. |
| 404 | Record not found, or (with record_type_id) the record does not belong to that type. |
| 422 | A scalar field value could not be read for the requested representation. |
| 500 | A stored artifact could not be read, for example because an expanded JSON artifact contains invalid JSON. |
The error object always carries type and message; validation errors add a field pointer, and some add a hint suggesting a correction.