GetApprovalAPI mirrors erdo_get_approval: one request in full, the read a
decision is made against — the itemized projection, the recorded reason, and the scope options — where the list is sized for scanning.
Authorizations
An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).
Path Parameters
Response
Success response
service from the stored row and the action registry, never by a consumer. See ApprovalCard for what each field promises; CardContractVersion is what a renderer keys its expectations on.
captured at filing from the call's expected_effect field and stored verbatim — the approval service never interprets it. The decision record turns it into a typed measurement contract when it records the decision this approval became; see ExpectedEffect for the declaration's shape.
Absent on most approvals, and honestly so: a change with no measurable business effect is better declaring nothing than inventing a metric.
report is moot the next day). nil is the default and the common case — an ask with no deadline never ages out; it resolves only when decided, superseded, or withdrawn.
deduplication. OccurrenceCount is how many times this exact action-on-subject has been proposed (1 = proposed once); when > 1 the UI shows "proposed Nx since <FirstProposedAt>". FirstProposedAt/LastProposedAt COALESCE to CreatedAt when the row predates dedupe tracking.
acts on (e.g. "artifact" + its id), when the action's registration declares one. They let a client resolve and render the actual subject — open/preview the page being published — instead of parsing a display string. Empty when the action carries no resolvable subject.
this action would end, captured at filing from the call's supersedes_decision_slug field. Stored as its own column rather than left in action_input because the decision producer must read it after the human answers, and a re-proposal rewrites that blob wholesale.
Empty on almost every approval: most changes reverse nothing.

