BETTERMENU
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.

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)

Default20
Range1 <= value <= 100
cursor?|

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

Response Body

application/json

application/json

application/json

curl -X GET "https://api.bettermenu.live/studio/recipes/string/audit-trail"
{
  "data": {
    "recipe_id": "string",
    "events": [
      {
        "event_id": "string",
        "actor": {
          "type": "member",
          "id": "string"
        },
        "channel": "studio",
        "timestamp": "string",
        "version_id": "string",
        "event_type": "recipe.created"
      }
    ]
  },
  "meta": {
    "version": "string",
    "request_id": "string",
    "timestamp": "string",
    "cursor": "string",
    "has_more": true
  }
}
{
  "type": "https://api.bettermenu.live/errors/recipe_not_found",
  "title": "Recipe Not Found",
  "status": 400,
  "detail": "Recipe rcpe_abc123 does not exist",
  "code": "recipe_not_found",
  "retryable": true,
  "instance": "/api/v1/recipes/rcpe_abc123",
  "trace_id": "req_xyz789",
  "errors": [
    {}
  ],
  "invalid_ids": [
    "f_abc123",
    "f_xyz789"
  ]
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}
BETTERMENU

FDA-compliant nutrition labels from a recipe, in minutes.

Visit bettermenu.live