# Get Recipe Audit Trail

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}

Return the compliance timeline for a recipe.

Lists typed audit events newest-first. Each event carries the
actor, channel, timestamp, changed fields, before/after payload,
rationale, and a tamper-evidence ``record_hash``.

Use this endpoint to answer: "who changed what and why?", "what
was the ingredient list before the last edit?", "show me all
nutrition recomputations since version V".

For the tamper-evident chain of state snapshots use
``listRecipeVersions`` instead.

Pagination: pass `meta.cursor` from the previous response back as
`cursor` on the next request, and keep paging until `meta.has_more`
is false.

`actor_id`, `actor_type`, `since_version_id` and `up_to_version_id`
are applied as DynamoDB filters after the page is read, so a
filtered page can return fewer than `limit` events — possibly zero —
even when more matches exist further in. An empty page with
`meta.has_more: true` is not an empty result set: keep paging with
`meta.cursor` rather than reading a short or empty page as the end
of the timeline. `event_type` and the `from`/`to` range narrow the
index range itself and are unaffected.

Passing `event_type` selects a different index that has no cursor:
that path returns a single page of at most `limit` events and always
reports `meta.has_more: false`, which therefore does not mean the
timeline is exhausted. Narrow with `from`/`to`, or raise `limit`, to
see more of a typed slice.

`from` and `to` are inclusive ISO 8601 timestamps; an offset is
honoured and a timestamp without one is read as UTC. A window that
matches no events, or whose `from` is after its `to`, is not an
error: it returns an empty page (`events: []`, `meta.has_more: false`).
An unparseable `from` or `to` is rejected with 422.
