# Get an object's change timeline `GET /ledger/v1/catalogs/{catalog_id}/objects/{public_id}/timeline` Fetch the change-history timeline of a single object by its public ID. Entries are ordered newest first. `public_id` is the object's canonical, typed id — `/` — and is passed as-is, slash included. The window runs from `date_from` (inclusive) to now; omitting it returns the full retained timeline. Requires a read grant on the catalog named in the path; a token granted on another catalog cannot read this one. ## Request example ```bash curl --request GET \ --url 'https://api.eu1.luigisbox.ai/ledger/v1/catalogs//objects//timeline' \ --header 'Authorization: Bearer ' ``` ## Path Parameters | Name | Type | Required | Description | Constraints | |---|---|---|---|---| | `catalog_id` | `string` | Yes | Catalog Id | — | | `public_id` | `string` | Yes | Public Id | — | ## Query Parameters | Name | Type | Required | Description | Constraints | |---|---|---|---|---| | `date_from` | `anyOf(string, null)` | No | Date From | — | ## Responses | Status | Description | Content | |---|---|---| | `200` | Successful Response | application/json: object | | `401` | Missing or invalid credentials | application/json: object | | `403` | Authenticated but not permitted | application/json: object | | `422` | Request validation failed | application/json: object | ### 200 Successful Response #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `catalog_id` | `string` | Yes | Catalog Id | — | | `entries` | `Array` | Yes | Entries | — | | `entries[].event_id` | `string` | Yes | Event Id | — | | `entries[].operation` | `string` | Yes | The kind of change recorded on the timeline. | allowed values: update, partial_update, delete | | `entries[].payload` | `object` | Yes | Payload | — | | `entries[].payload.*` | `any` | No | Additional property. | — | | `entries[].source_system` | `string` | Yes | Source System | — | | `entries[].status` | `string` | Yes | Whether a change has been confirmed applied. | allowed values: acked, pending | | `entries[].timestamp` | `string` | Yes | Timestamp | format: date-time | | `identity` | `string` | Yes | Identity | — | | `window` | `object` | Yes | The time window the timeline covers. | — | | `window.date_from` | `string` | Yes | Date From | format: date-time | | `window.to` | `string` | No | To | allowed value: now | ##### Response example ```json { "catalog_id": "example", "entries": [ { "event_id": "example", "operation": "update", "payload": {}, "source_system": "example", "status": "acked", "timestamp": "2026-04-15T12:00:00Z" } ], "identity": "example", "window": { "date_from": "2026-04-15T12:00:00Z", "to": "now" } } ``` ### 401 Missing or invalid credentials #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 403 Authenticated but not permitted #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ``` ### 422 Request validation failed #### application/json Schema: `object` ##### Attributes | Attribute | Type | Required | Description | Constraints | |---|---|---|---|---| | `exception_details` | `object` | No | Machine-readable error context; empty object when there is nothing to add. | — | | `exception_details.validation_errors` | `anyOf(Array, null)` | No | Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value. | — | | `exception_details.validation_errors[].loc` | `Array` | Yes | Path to the offending value from the request root, e.g. `["body", "filters", 0, "operator"]`. | — | | `exception_details.validation_errors[].msg` | `string` | Yes | What is wrong with the value at `loc`. | — | | `exception_details.validation_errors[].type` | `string` | Yes | Stable machine code for the problem, e.g. `missing` or `string_too_short`. | — | | `exception_details.*` | `any` | No | Additional property. | — | | `reason` | `string` | Yes | Human-readable, actionable error message. | — | | `request_id` | `anyOf(string, null)` | No | Request correlation ID (matches the X-Request-Id response header). | — | ##### Response example ```json { "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example" } ```