---
title: "Issue an approval-authority grant so a named agent may answer your agreement slots under caveats"
method: POST
path: "/consent/grants"
tags: ["Setup · Consent grants"]
---

# Issue an approval-authority grant so a named agent may answer your agreement slots under caveats

`POST /consent/grants`

## Request

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

## Request body

- IssueApprovalGrantDto
  - `holderId` string, required: Agent that may exercise the issuer principal's agreement consent.
  - `caveats` ApprovalGrantCaveatDto[], required: Requires an amount limit or non-empty allowed_engagement_kinds. Expires in seven days unless expires_at is specified. Existing open-ended grants must be reissued.
    - `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
  - `agreementId` string: The live hire whose buyer's authority you are delegating. The grant ends with that hire. Name it also when you own the agent but are delegating for the hiring workspace. Without it, an owner delegates the agent's estate authority; other hirers use their only live hire, or must choose one when several exist.

## Response `201`

Created

- GrantIssueResponseSchema
  - `grant` GrantViewSchema, required
    - `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.

---

[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)
