Skip to content

Set an approval policy override

The approval_policies.overrides.set operation: PUT /api/v1/approval_policy/overrides in the REST API and the approval_policies_overrides_set tool in the MCP server.

PUT/api/v1/approval_policy/overrides

Creates or changes the approval policy override for one legal entity (entityId), one agent (agentId) or one app (clientId, its OAuth client). Send exactly one of them.

An override has the same parts as the organization's policy: tiers (each tier you send replaces the current one; null removes it), twoPersonFor and amountLimits (each list you send replaces the current one). The strictest applicable rule wins: a call is checked against the organization's policy and every override for its entity, its agent and its app, so an override can only tighten what the organization allows, never loosen it.

Agents and apps are referenced by ID; the entity must belong to the organization. Returns the whole approval policy. Owners and admins only, with a sign-in in the last 15 minutes.

At a glance

  • REST: PUT /api/v1/approval_policy/overrides
  • MCP tool: approval_policies_overrides_set
  • Operation ID: approval_policies.overrides.set
  • Scope: Organization
  • Permission: approvals:admin
  • Risk tier: security
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key optional
  • Modes: Test and live
  • Authentication: API key with the approvals:admin scope
  • Fresh sign-in: In the console, a sign-in within the last 15 minutes
  • Since: M10

Request

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
entityIdent_… IDNo
agentIdagt_… IDNo
clientIdocl_… IDNo
tiersobjectNo
tiers.writeone of allow, require_approval, deny or nullNo
tiers.financialone of allow, require_approval, deny or nullNo
tiers.complianceone of allow, require_approval, deny or nullNo
tiers.securityone of allow, require_approval, deny or nullNo
twoPersonForarray of stringNo
amountLimitsarray of objectNo
amountLimits[].operationIdstringYes
amountLimits[].perCallmoneyYes
versioninteger (at least 0)No

Response

200 OK with a JSON object:

FieldTypeDescription
object"approval_policy"
idapol_… ID or null
orgIdorg_… ID
tiersobject
tiers.writeone of allow, require_approval, deny
tiers.financialone of allow, require_approval, deny
tiers.complianceone of allow, require_approval, deny
tiers.securityone of allow, require_approval, deny
twoPersonForarray of string
amountLimitsarray of object
amountLimits[].operationIdstring
amountLimits[].perCallmoney
versioninteger (at least 0)
updatedAtdate-time or null
overridesarray of object
overrides[].idapol_… ID
overrides[].object"approval_policy_override"
overrides[].entityIdent_… ID or null
overrides[].agentIdagt_… ID or null
overrides[].clientIdocl_… ID or null
overrides[].tiersobject
overrides[].tiers.writeone of allow, require_approval, deny or null
overrides[].tiers.financialone of allow, require_approval, deny or null
overrides[].tiers.complianceone of allow, require_approval, deny or null
overrides[].tiers.securityone of allow, require_approval, deny or null
overrides[].twoPersonForarray of string
overrides[].amountLimitsarray of object
overrides[].amountLimits[].operationIdstring
overrides[].amountLimits[].perCallmoney
overrides[].versioninteger (at least 1)
overrides[].updatedAtdate-time
availableOperationsarray of object
availableOperations[].idstring
availableOperations[].summarystring
availableOperations[].riskTierone of write, financial, compliance, security
availableOperations[].scopeone of org, entity, brand
availableOperations[].amountsboolean

Examples

One agent may not move money

HTTP
PUT /api/v1/approval_policy/overrides
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "agentId": "agt_01m4ttwd3veh9apbewxheq5xhc",
  "tiers": {
    "financial": "deny"
  }
}

Response (200):

JSON
{
  "object": "approval_policy",
  "id": "apol_01m4ttwd3veh9apbewxheq5xh9",
  "orgId": "org_01m4ttwd3veh9apbewxheq5xh3",
  "tiers": {
    "write": "allow",
    "financial": "allow",
    "compliance": "require_approval",
    "security": "require_approval"
  },
  "twoPersonFor": ["brands.update"],
  "amountLimits": [],
  "version": 2,
  "updatedAt": "2026-10-13T14:30:00.000Z",
  "overrides": [
    {
      "id": "apol_01m4ttwd3veh9apbewxheq5xhb",
      "object": "approval_policy_override",
      "entityId": null,
      "agentId": "agt_01m4ttwd3veh9apbewxheq5xhc",
      "clientId": null,
      "tiers": {
        "write": null,
        "financial": "deny",
        "compliance": null,
        "security": null
      },
      "twoPersonFor": [],
      "amountLimits": [],
      "version": 1,
      "updatedAt": "2026-10-13T14:30:00.000Z"
    }
  ],
  "availableOperations": [
    {
      "id": "brands.update",
      "summary": "Update a brand",
      "riskTier": "write",
      "scope": "brand",
      "amounts": false
    },
    {
      "id": "members.remove",
      "summary": "Remove a member",
      "riskTier": "security",
      "scope": "org",
      "amounts": false
    }
  ]
}
HTTP
PUT /api/v1/approval_policy/overrides
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "entityId": "ent_01m4ttwd3veh9apbewxheq5xh4",
  "amountLimits": [
    {
      "operationId": "refunds.create",
      "perCall": {
        "amount": "200000000",
        "currency": "EUR"
      }
    }
  ]
}

Response (200):

JSON
{
  "object": "approval_policy",
  "id": "apol_01m4ttwd3veh9apbewxheq5xh9",
  "orgId": "org_01m4ttwd3veh9apbewxheq5xh3",
  "tiers": {
    "write": "allow",
    "financial": "allow",
    "compliance": "require_approval",
    "security": "require_approval"
  },
  "twoPersonFor": ["brands.update"],
  "amountLimits": [],
  "version": 2,
  "updatedAt": "2026-10-13T14:30:00.000Z",
  "overrides": [
    {
      "id": "apol_01m4ttwd3veh9apbewxheq5xhb",
      "object": "approval_policy_override",
      "entityId": "ent_01m4ttwd3veh9apbewxheq5xh4",
      "agentId": null,
      "clientId": null,
      "tiers": {
        "write": null,
        "financial": null,
        "compliance": null,
        "security": null
      },
      "twoPersonFor": [],
      "amountLimits": [
        {
          "operationId": "refunds.create",
          "perCall": {
            "amount": "200000000",
            "currency": "EUR"
          }
        }
      ],
      "version": 1,
      "updatedAt": "2026-10-13T14:30:00.000Z"
    }
  ],
  "availableOperations": [
    {
      "id": "brands.update",
      "summary": "Update a brand",
      "riskTier": "write",
      "scope": "brand",
      "amounts": false
    },
    {
      "id": "members.remove",
      "summary": "Remove a member",
      "riskTier": "security",
      "scope": "org",
      "amounts": false
    }
  ]
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400The override names no subject or several, an unknown or ineligible operation, compliance or security set to allow, or amount limits that don't fit (details.issues).Fix the fields listed in details.issues and send the request again.
resource_not_found404No legal entity with this ID exists in the organization.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
approval_policy_override_limit_reached409The organization already has 100 overrides.Delete an override you no longer need (details.limit is the maximum), or set the rule in the organization's policy instead.
version_conflict409The override changed since you read it (version); read it again.Fetch the object again and retry the change.
fresh_auth_required403You last signed in more than 15 minutes ago.Sign in again, then repeat the action within 15 minutes.
permission_denied403Only owners and admins change the approval policy.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.