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. meta.has_more=false signals the end of the timeline.

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

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
  }
}
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}