---
title: "Make one approval page for the signed-in person from approvals waiting on them (see approvalPendingList): pass item k..."
method: POST
path: "/v1/approval-bundles"
tags: ["packages"]
---

# Make one approval page for the signed-in person from approvals waiting on them (see approvalPendingList): pass item k...

`POST /v1/approval-bundles`

## Request

- Base URL: `https://api.kody.codes`
- URL: `https://api.kody.codes/v1/approval-bundles`
- Auth: HTTP bearer

Make one approval page for the signed-in person from approvals waiting on them (see approvalPendingList): pass item keys, or omit them to include everything pending (narrowed by types and packages). Returns a URL to send to the person. The page groups items by package, shows what each grants, and lets them approve all at once or approve or deny each one. Approving runs each item's own approval, exactly as on its package page. This never approves anything; only the person can, in the browser. Items not waiting on the person are skipped and listed. At most 100 items; the link works for 30 days.

Org permission: none (touches no org data).

## Request body

- object
  - `items` string[]: Item keys from approvalPendingList. Omit to bundle everything pending.
  - `types` string[]: When items is omitted: only these item types.
  - `packages` string[]: When items is omitted: only these packages, by package id or kody id.
  - `note` string: Shown to the person as an untrusted note from you.

## Response `200`

Success.

- object
  - `bundleId` string, required
  - `url` string, required
  - `items` object[], required
    - `key` string, required: Pass to approvalBundleCreate items to bundle exactly this approval.
    - `type` 'publish' | 'capabilities' | 'credential-picks', required: publish: a paused publish (credential needs changed, or going public). capabilities: an internet-visible package whose credentials or storage changed since approval. credential-picks: a recorded credentialMappingPropose proposal.
    - `title` string, required
    - `summary` string, required: What approving does, in plain language.
    - `package` object, nullable, required
      - `id` string, required
      - `kodyId` string, required
      - `name` string, required
    - `grants` object[], required
      - `change` 'added' | 'changed' | 'removed', required
      - `label` string, required
      - `where` string, nullable, required
      - `kind` string, nullable, required
      - `provider` string, nullable, required
      - `hosts` string[], required
      - `before` string, nullable, required
      - `after` string, nullable, required
      - `match` string, nullable, required
    - `canApprove` boolean, required: False when something must be fixed first; see statusMessage.
    - `statusMessage` string, nullable, required
    - `description` string, required: One-line text form of this item.
  - `skipped` string[], required: Requested keys not waiting on the person, left out.
  - `message` string, required

## Other responses

- `400`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `401`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `403`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `404`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `409`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `413`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `429`: Too many requests (edge IP/token limit) or an entitlement / plan-cap limit. Wait at least `Retry-After` seconds before retrying.
- `500`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `503`: Error envelope `{ "error": { "code", "message", "details"? } }`.
- `default`: Error envelope `{ "error": { "code", "message", "details"? } }`.

---

[API](https://skmtc.dev/kody/apis/kody-api.md) · [All operations](https://skmtc.dev/kody/apis/kody-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kody/apis/kody-api/revisions/a020ecedb82b?raw)
