---
title: "Let several actions on this connection run without asking, in one request"
method: POST
path: "/v1/integrations/accounts/{account_id}/tool-overrides:batch-grant"
tags: ["integrations"]
---

# Let several actions on this connection run without asking, in one request

`POST /v1/integrations/accounts/{account_id}/tool-overrides:batch-grant`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/integrations/accounts/{account_id}/tool-overrides:batch-grant`
- Auth: HTTP bearer

The batch primitive behind a group control: mints the CALLING member's consent for every item in ``items`` against ONE shared admission, answering PER ITEM for anything about one action. Every item carries its OWN ``consent_token`` — no shared token could bind two different actions' confirmations. Two conditions are about the REQUEST and refuse all of it before any grant is stored: naming more than one distinct Critical action, and naming an action whose live tier this process cannot rank. Same self-serve rule and ``preferences:edit`` scope as the single-action route above; a foreign/unknown or not-visible account 404s the whole call, exactly as it does there.

## Path parameters

- `account_id` string, uuid, required

## Headers

- `X-Tenant-Id` string, nullable

## Request body

- ToolOverrideBatchGrantRequest
  - `items` ToolOverrideBatchGrantItem[], required
    - `tool_ref` string, nullable, required
    - `consent_token` string, required

## Response `200`

Successful Response

- ToolOverrideBatchGrantResponse
  - `items` ToolOverrideBatchGrantItemResult[], required
    - `tool_ref` string, nullable, required
    - `override` ToolOverrideResponse: One consent row, in the shape a client may see. Deliberately NOT the ORM row: that carries both account generations and the execution fingerprint, which are internal bindings and would hand a client the ingredients of the consent token it is not supposed to be able to forge.
      - `id` string, uuid, required
      - `integration_account_id` string, uuid, nullable, required
      - `tool_ref` string, required
      - `granted_tier` string, required
      - `created_at` string, date-time, required
      - `audience_class` 'non_audience' | 'audience' | 'legacy' | 'task_non_audience' | 'task_audience', required: Which calls of one action a standing consent covers, named by the audience each call reaches. ``tools.contracts.call_audience_class`` reads every call as ``non_audience`` or ``audience``, from the call itself and before any consent is consulted. A ``tool_overrides`` row stores the class it covers, and the class is part of its key, so a non-audience consent never covers an audience-reaching call of the same action. The ``ck_tool_overrides_audience_class`` CHECK holds the stored values to this set.
    - `code` string, nullable
    - `message` string, nullable

## Other responses

- `400`: Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `404`: Not found
- `409`: Refused for a state the member can change. ``code`` is one of ``stale_tool_state``, ``tenant_master_disabled``, ``tool_disabled``.
- `422`: Refused for a property of the tool or the connection the member cannot change. ``code`` is one of ``audience_reaching``, ``managed_account``, ``mandatory_call``, ``no_tool_ref``, ``tool_override_batch_critical_limit``, ``unreadable_live_tier``. ``VALIDATION_ERROR`` is the ordinary boundary refusal for a malformed body.

---

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