---
title: "Create a narrower child approval-authority grant"
method: POST
path: "/consent/grants/{grantId}/attenuate"
tags: ["Setup · Consent grants"]
---

# Create a narrower child approval-authority grant

`POST /consent/grants/{grantId}/attenuate`

## Request

- Base URL: `https://api.ziggsai.com`
- URL: `https://api.ziggsai.com/consent/grants/{grantId}/attenuate`
- Auth: HTTP bearer

Mints the narrower child when the authority is the caller's own and the recipient is already trusted. Otherwise the owner must approve first: the response is `{ status: "pending_approval", agreementId }` and the grant is minted server-side once they approve.

## Path parameters

- `grantId` string, required

## Request body

- AttenuateApprovalGrantDto
  - `caveats` ApprovalGrantCaveatDto[], required
    - `type` 'require_approval_above' | 'max_amount' | 'expires_at' | 'allowed_engagement_kinds', required: `require_approval_above` (points, hundredths: agent may answer at or below; above escalates to the human), `max_amount` (points, hard refuse), `expires_at` (ISO-8601), or `allowed_engagement_kinds` (string[]).
    - `value` object, required
  - `holderId` string, required: Who holds the narrowed child grant.

## Response `201`

Created

- GrantDelegateResponseSchema
  - `grant` GrantViewSchema
    - `grantId` string, required
    - `issuerId` string, required: Principal that issued the grant (root owner or delegator).
    - `holderId` string, required
    - `parentGrantId` string, nullable, required: Set when this is an attenuated re-delegation.
    - `agreementId` string, nullable, required: Agreement that conferred the grant, if any.
    - `scope` GrantScopeViewSchema, required
      - `kind` 'chat' | 'agreement' | 'org' | 'artifact' | 'task' | 'person' | 'connection' | 'wallet' | 'consent' | 'inbox', required: Which rail/resource this grant points at.
      - `id` string, required: Id of the scoped resource.
      - `label` string: Resolved human name; populated only by the owner-facing GET /grants read.
    - `caveats` GrantCaveatViewSchema[], required: Bounds on the grant, one array across rails.
      - `type` string, required: Caveat name (allowed_actions, max_amount, temporal, …).
      - `value` object, required: Shape depends on type. max_amount and daily_budget are a number of hundredths of a point.
    - `revoked` boolean, required
    - `expiresAt` string, date-time, nullable, required: ISO-8601, or null for no expiry.
    - `createdAt` string, date-time, required
    - `health` 'active' | 'expired' | 'revoked', required
    - `holderKind` 'user' | 'org' | 'agent': Present on rails that record it; absent means "this rail does not say".
    - `access` 'list' | 'read' | 'write' | 'admit'
    - `basis` GrantBasisSchema
      - `kind` 'creation' | 'publication' | 'membership' | 'acceptance' | 'agreement' | 'vouch', required: The consent object the grant rests on.
      - `id` string, nullable, required: Id of the consent object, if any.
  - `status` string
  - `agreementId` string
  - `ownerId` string

---

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