Skip to content
Skip to Content
Docs
Studio

Get Recipe Audit Trail

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.

GET
/studio/recipes/{recipe_id}/audit-trail

Path Parameters

recipe_id*Recipe Id

Query Parameters

event_type?||

Filter by audit event type

since_version_id?|

Return events that produced versions after this version_id (forward window). Omit for no lower bound.

up_to_version_id?|

Return events that produced versions up to and including this version_id (point-in-time window). Omit for no upper bound.

actor_id?|

Filter by member_id or system actor identifier

actor_type?|

Filter by actor type: 'member' or 'system'

from?|

ISO 8601 timestamp lower bound (inclusive)

to?|

ISO 8601 timestamp upper bound (inclusive)

limit?Limit

Maximum number of audit events to return (1-100)

Range1 <= value <= 100
Default20
cursor?|

Opaque pagination cursor returned in meta.cursor from a previous response. Omit on the first page.

Response Body

Successful Response

application/json
  1. response

Response for get recipe audit trail endpoint.

data*

Audit trail data for a recipe.

meta*

Paginated response metadata.

Example Request
curl -X GET 'https://api.bettermenu.live/studio/recipes/string/audit-trail'
Example Response
{  "data": {    "recipe_id": "string",    "events": [      {        "event_id": "string",        "actor": {          "type": "member",          "id": "string",          "display_name": "string",          "former_member": false,          "is_viewer": false        },        "channel": "studio",        "client": "claude",        "client_id": "string",        "timestamp": "string",        "version_id": "string",        "event_type": "recipe.created"      }    ]  },  "meta": {    "version": "string",    "request_id": "string",    "timestamp": "string",    "cursor": "string",    "has_more": true  }}

Recipe in, FDA-format Nutrition Facts out, with every version kept.

Start freeNo card needed.