Web Security
API Authorization for AI Tools and Agents
A practical guide to enforcing trusted, tenant-bound API authorization for model-proposed tool calls, background jobs, and delegated agents.
API authorization for AI tools and agents starts with a simple rule: a model-generated function call is a proposal, not proof of permission. When an agent asks to delete invoice 123, trusted server-side code must decide whether the principal may perform that action on that resource in the current tenant and context.
The authorization decision model
Use PRINCIPAL + TENANT + ACTION + RESOURCE + CONTEXT → ALLOW or DENY. Principal identifies the authenticated user, workload, or delegated service. Tenant identifies the active workspace established from membership. Action is the operation, not merely the endpoint. Resource is the exact object and its ownership. Context includes purpose, time, approval, risk, state, and limits.
Authentication proves a credential was accepted. Authorization evaluates what that principal may do now. A valid session, a visible tool button, or a system prompt does not authorize an API request. Agent Permissions explains least-privilege policy; this page focuses on enforcing it at agent-facing APIs.
Model proposes; the gateway decides
Use a trusted gateway:
LLM or Agent → Tool Proposal → Schema Validation → Resolve Principal and Tenant → Resolve Resource → Authorization Decision → Human Approval if needed → Credential Broker → API Adapter → Target API
The model never selects its own credential, tenant, policy, or final destination. Secure Tool Calling for LLM Applications covers the gateway mechanics, while Secure Credential Handling for AI Agents covers custody.
Object-level authorization
Every object or resource ID supplied by a user or proposed by a model must be checked against the caller’s rights. Resolve the object on the server, derive its tenant and owner, and compare them with the authenticated context. Do not accept a tenant ID and object ID as mutually trustworthy inputs. This prevents BOLA-style failures in which a caller can reference another customer’s record simply by changing an identifier.
Apply checks on every route and internal service call, including reads, exports, retries, and background work. A tool registry that hides a resource from the model is useful minimization, but it is not the enforcement point. The downstream API should make the same decision when practical.
Function-level authorization
Operations have different privilege. Read, create, update, delete, approve, export, and administrative functions should have separate policy requirements. An agent that can draft a support ticket should not automatically send it. An agent that can read deployment status should not change production. Do not rely solely on frontend visibility or tool descriptions; a caller can construct a request without using your UI.
Classify operations by effect: read-only, reversible write, external side effect, destructive action, and privileged security change. Add budgets, rate limits, idempotency, and approval to the higher tiers. Human Approval for AI Agents describes binding approval to an exact action.
Property-level authorization
Object access does not imply unrestricted field access. A user may update a profile description but not its role, owner, billing status, security setting, or tenant assignment. Validate the submitted field set against an allowlist for the principal and operation. Reject unknown or protected properties rather than silently accepting them.
For model-generated structured arguments, validate types, ranges, enumerations, resource references, and business invariants. Then authorize the resulting patch. Schema validity answers whether an object is well formed; it does not answer whether the requested field change is allowed.
Identity and delegation
An agent may act as a user, as a workload, or under constrained delegated authority. Preserve those identities in the request and audit record. AI Agent Identity explains the distinction. Do not copy a broad user token into every tool or pass an administrator credential because a model requested it.
Delegation should be bounded by tenant, audience, action, resource, duration, and purpose. Expired or revoked authority must fail closed. A service-to-service call should authenticate the workload and carry only the evidence needed for the downstream decision. The receiving API should not infer authority from an unverified claim in a prompt or free-form header.
Tenant binding and resource resolution
Every decision in a multi-tenant application must include tenant scope and resource ownership. Resolve the active tenant from authenticated membership and a validated workspace selection. Never let the model switch tenant context by returning a different tenant string. Multi-Tenant Security for LLM and RAG Applications covers isolation across data, caches, jobs, credentials, and logs.
Resource resolution should happen before authorization: load the object, determine its tenant, classify its state, and then evaluate the operation. For bulk requests, authorize every item or reduce the request to an approved server-side query. Do not authorize the first item and assume the rest share its ownership.
Background and asynchronous work
A queue payload can contain a tenant reference and task ID, but it should not contain unlimited authority. When a worker starts, authenticate its workload identity, retrieve current policy, recheck tenant status and object ownership, and use short-lived credentials. If the user’s membership or approval was revoked while a job waited, deny or require reauthorization.
Record the original principal, submitting agent, job identity, policy version, and execution result. Cancellation, retry, and timeout paths need the same checks as the initial run. A delayed delete or export is still an authorization event.
Policy decision and enforcement
A policy decision point evaluates the tuple; a policy enforcement point blocks or permits the actual request. They may be separate services, libraries, or modules. The important property is that the enforcement point cannot be bypassed by changing the model prompt, tool list, or client interface.
Deny by default when the tool, action, resource, tenant, scope, or policy version is unknown. Return a safe error to the model and client without revealing unnecessary resource existence or backend details. Keep policy reason codes useful for operators while avoiding sensitive data in messages.
Authorization test matrix
| Operation | Principal | Tenant | Resource | Expected policy | Expected result | Evidence |
|---|---|---|---|---|---|---|
| Read invoice | Member | Own tenant | Owned invoice | Read allowed | Allow | Principal, object, decision |
| Read invoice | Member | Own tenant | Other tenant | Ownership mismatch | Deny | Denial reason |
| Update profile | User | Own tenant | Own profile | Description only | Allow | Field set and policy |
| Change role | User | Own tenant | User account | Admin required | Deny | Protected-field denial |
| Delete document | Agent | Own tenant | Owned document | Destructive + approval | Allow after bound approval | Approval ID and hash |
| Bulk export | Agent | Own tenant | Mixed objects | Every item authorized | Partial deny or reject | Item-level evidence |
| Worker retry | Workload | Disabled tenant | Job object | Current membership required | Deny | Job and tenant state |
| Tool call | Delegated agent | Own tenant | Partner API | Audience and scope match | Allow | Delegation and credential |
Tool-specific controls
Expose only tools required for the task, with explicit owner, risk class, input schema, and policy mapping. Separate read, draft, commit, and administrative adapters. Validate destinations and transaction state in the adapter immediately before execution. Use idempotency keys so retries do not duplicate irreversible effects, and define a transaction boundary that can fail safely.
Tool output is also untrusted. Validate response shape, redact secrets, and prevent an error or retrieved instruction from becoming a new authorization command. A tool result saying “admin approved” is data until the approval service verifies it.
Logging and evidence
Record principal, agent identity, tenant, action, resource, field set, policy version, decision, reason code, approval binding, tool, credential reference, result, and timestamp. Do not log bearer tokens or full sensitive payloads. Correlation IDs should connect the proposal, decision, downstream request, and state change.
Investigators should be able to answer why an action was allowed and what actually executed. Preserve denied requests as well as successes, protect logs from agent alteration, and define retention. AI Agent Observability provides a broader evidence chain.
Testing and failure modes
Build positive and negative tests for object-, function-, and property-level policy. Include cross-tenant IDs, mixed bulk resources, expired or revoked delegation, disabled users, changed roles, approval parameter changes, replayed requests, worker retries, and unknown tools. Test both direct API calls and calls made through the agent gateway.
Common failures include trusting frontend tool visibility, using one universal credential, authorizing only a collection rather than each object, accepting client-supplied tenant IDs, checking approval after execution, and placing unlimited authority in a queue. Treat each as a regression test and monitor denials in production.
Practical checklist
- Define principal, tenant, action, resource, and context for every API.
- Resolve object ownership before making the decision.
- Separate read, write, delete, export, and admin privileges.
- Allowlist mutable properties and reject unknown fields.
- Bind delegated authority to audience, scope, duration, and purpose.
- Reauthorize background jobs with current workload identity.
- Authorize every item in bulk operations.
- Keep enforcement outside the model and outside frontend visibility.
- Use scoped credentials, idempotency, budgets, and approval for risky actions.
- Log attributable decisions with redaction and correlation IDs.
- Test positive, negative, cross-tenant, replay, expiry, and revocation paths.
Sources
- OWASP API Security Top 10
- OWASP ASVS
- OWASP Agentic AI guidance
- NIST authorization and IAM guidance
- IETF OAuth standards for delegated access
An LLM can make an API easier to call, but it cannot make an unauthorized principal legitimate. Keep the authorization decision deterministic, resource-specific, tenant-bound, and enforced at the request that changes state.