Version
GET

List the inbox

/v1/approvals in the Approvals API.

curl "https://api.example.test/v1/approvals?scope=waiting" \  -H "Authorization: Bearer $TOKEN"

The approvals inbox of the token's holder across every project the token may see, 25 per page (per_page 1 to 100), newest first. scope picks the view: waiting (the default) is what still waits for their own decision, leaving out the rounds they already answered; raised is what they submitted; all is everything they may see, which for a client guest is only the requests that name them. status, kind, artefact_type and project_id narrow the page, and search to the requests whose reference or title contain the words. sort_by takes reference, title, kind, status, round, due_at, decided_at, created_at or updated_at. Each row carries its approvers and a tally of where the approvals stand.

GET
/v1/approvals

Requires ability

The token must hold this ability, or the call is refused with 403.

Runs the same action from an agent, behind the same ability.

Authorization

bearerToken
AuthorizationBearer <token>

A personal access token minted in the app under Account Settings, then API Tokens, sent as Authorization: Bearer zg_live_…. The token carries the abilities each endpoint lists under Requires ability and is frozen to one team, and optionally to one project, at mint time.

In: header

Query Parameters

scope?|

Which view of the inbox: waiting for what still waits for the token holder's own decision (the default), raised for what they submitted, all for everything they may see. Ignored on a project's list, which is always all.

status?|

Narrow to one status: pending, approved, rejected, changes_requested, withdrawn or expired.

kind?|

Narrow to one kind of approval, such as requirement_review.

artefact_type?|

Narrow to one family of record under approval: epic, work-item, requirement, business-rule or use-case.

project_id?|

Narrow the inbox to one project, by id.

Formatuuid
search?|

Words the reference or the title must contain, up to 120 characters.

Lengthlength <= 120
page?integer

The 1-based page to return. A page past the last answers an empty data array with meta.total still filled, so a loop can stop without guessing.

Range1 <= value
Default1
per_page?integer

Rows per page, 1 to 100. A higher value clamps to the cap silently. Defaults to 25.

Range1 <= value <= 100
Default25
sort_by?string

The column to order by. Defaults to created_at; a column the endpoint does not offer falls back to the default rather than failing.

Default"created_at"
sort_direction?string

asc or desc. Defaults to desc.

Default"desc"

Value in

  • "asc"
  • "desc"
limit?integer

Alias of per_page, kept for clients that send it. per_page wins when both are sent.

Range1 <= value <= 100

Responses

200OK

One page of requests, newest first.

401Unauthorized

The request carries no bearer token, or one that is revoked, malformed, or minted for another environment (a zg_test_ token on production).

403Forbidden

The token is valid but does not carry the ability this endpoint requires; error.context.required_ability names the one to grant. An endpoint that also checks who registered a row answers FORBIDDEN with the same status, and says so in its own description.

422Validation failed

The payload broke a rule, and error.fields maps each offending key to its messages. A refusal from the domain, such as a role code already taken or a team the caller does not own, uses the same code with error.message saying why and no fields. On this endpoint: VALIDATION_FAILED: when scope, status, kind or artefact_type is not one of its values, project_id is not a uuid, or search is longer than 120 characters.

429Too many requests

The token has spent its 300 requests a minute or 10,000 an hour; Retry-After says when the next one is accepted.

How is this guide?

Last updated on