๐Ÿ›ก๏ธ Agent Authorization Layer ยท Enterprise-ready

Stop trusting agents.
Govern them.

Every IteraTools API key carries a policy: allow/deny lists, rate-class quotas, daily spend caps, and an immutable audit trail of every call. The control plane your CISO already asked for.

Read the policy docs vs. OAuth 2.1

OAuth covers identity. It doesn't cover behavior.

An OAuth 2.1 token says this agent is allowed to call my API. It does not say which tools, how many times, with what budget, and with what trace. When an agent goes rogue โ€” a bad prompt, a poisoned doc, a runaway loop โ€” the only thing standing between it and your wallet is your authorization layer.

IteraTools ships that layer in front of every endpoint. No SDK, no infra to run.

What's in the box

โœ…

Allow / deny lists

Per-key whitelist or blacklist of tool IDs. Denies hit before billing โ€” a blocked call costs you nothing.

โš–๏ธ

Rate-class quotas

Cap calls/minute per light, medium, heavy class. Stops bursty cost spikes when the LLM goes loop-crazy.

๐Ÿ’ฐ

Daily spend caps

Hard ceiling per key per day. Returns 429 with reset time once exceeded โ€” no "$10k surprise" Monday morning.

๐Ÿ“‹

Tamper-evident audit trail

Every call (allowed, denied, quota-hit) lands in tool_metrics + transactions. Replay any agent's last 24 h in seconds.

๐Ÿ”€

Two-tier policies

Global defaults in policies.json, per-key overrides in DB. Fail-open by default; opt into strictness key-by-key.

โšก

Zero added latency

In-memory sliding-window for quotas, prepared statements for policy reads. Sub-millisecond on the hot path.

Define a policy in one JSON

This policy lets the agent run sales tools but only the safe ones, blocks code execution entirely, and caps heavy compute at 5 calls/min:

// PUT /credits/keys/it-XXXX-XXXX-XXXX/policy { "allow_tools": [ "whatsapp/send", "email/send", "extract/structured", "image/generate" ], "deny_tools": [ "code_execute", "browser/act" ], "rate_class_quota": { "light": 120, "medium": 30, "heavy": 5 } }

A blocked call returns 403 immediately, before the tool runs and before billing:

{ "error": "Tool access denied by policy", "tool": "code_execute", "reason": "deny_tools" }

Quota hits return 403 with reset window:

{ "error": "Policy rate class quota exceeded", "rate_class": "heavy", "limit": 5, "calls_this_minute": 5, "reset_in_seconds": 38 }

Successful calls return the tool result โ€” and an X-Policy-Allowed: true header so your audit dashboard can chart allows vs. denies.

200 OK ยท X-Policy-Allowed: true ยท X-Tool: extract/structured ยท X-Cost-Usd: 0.010

vs. OAuth 2.1 / OAuth-for-MCP

OAuth handles authentication and broad scopes. The Authorization Layer handles fine-grained, per-call governance.

Capability OAuth 2.1 IteraTools Authorization Layer
Verifies agent identityYesYes (api-key or x402 wallet)
Coarse scopes (read/write)YesYes
Per-tool allow/denyCustom scopes onlyBuilt-in
Rate-class quotasNolight / medium / heavy
Daily spend capNoPer-key ceiling
Per-call audit logProvider-dependenttool_metrics + transactions
Block before billingN/A403 pre-execution
Works without OAuth danceNoSingle api-key or x402 header

Layer them: use OAuth 2.1 for human-to-agent delegation, then point the resulting key at our policy engine for per-call governance.

What teams use it for

Read-only research agent
CISO at a 200-person fintech

Whitelist extract/structured, web/search, scrape. Deny everything outbound (email, WhatsApp, code execution). Daily cap $5. Result: an analyst-bot that cannot message customers or move money โ€” even with a prompt-injected document.

Customer-support drafting agent
Head of CX at an e-commerce SaaS

Allow email/draft, whatsapp/draft, vector/query. Deny email/send, whatsapp/send. Drafts always go to a human review queue. heavy-class quota set to 0 โ€” no LLM-fanout loops.

Autonomous DevOps agent
Platform engineer at an infra startup

Allow everything in pack/devops. heavy quota: 10/min. Daily cap $20. Audit log shipped nightly to S3 for SOC 2 evidence. When an agent looped on a flaky CI status check, the quota stopped it at $0.34, not $34.

Public-facing x402 agent
Indie dev shipping a Coinbase Agentic.market listing

No api-key โ€” wallet pays per call via @x402/fetch. Global policy in policies.json denies code_execute for unknown wallets, capping abuse without forcing signup.

Live policy dashboard

A single endpoint exposes the current policy and last-minute quota state for any key. Drop it into your internal admin UI:

GET /authorization/status?api_key=it-XXXX-XXXX-XXXX { "key": "it-XXXX-XXXX-XXXX", "policy": { "allow_tools": ["whatsapp/send", "email/send", "extract/structured", "image/generate"], "deny_tools": ["code_execute", "browser/act"], "rate_class_quota": { "light": 120, "medium": 30, "heavy": 5 } }, "quota_window": { "light": { "used": 17, "limit": 120, "reset_in_s": 42 }, "medium": { "used": 3, "limit": 30, "reset_in_s": 42 }, "heavy": { "used": 0, "limit": 5, "reset_in_s": 42 } }, "spend_today_usd": 0.83, "spend_limit_usd": 5.00, "recent_denials": [ { "at": "2026-04-29T09:14:02Z", "tool": "code_execute", "reason": "deny_tools" } ] }

Turn it on, ship to prod

Default is permissive โ€” your existing keys keep working. Add a policy when you're ready, key-by-key.

Read the docs Rate-limit details