---
title: "Set a policy for each agent operator · Agent Wranglers"
url: https://agentwranglers.se/playbook/agents-as-users/identifying-agents/policy-per-operator
id: AGT-3
level: Recommended
updated: 2026-10-22
tokens: 941
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Set a policy for each agent operator

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Identifying agents](https://agentwranglers.se/playbook/agents-as-users/identifying-agents.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-22.

- ID: AGT-3
- Level: Recommended
- Chapter: [Identifying agents](https://agentwranglers.se/playbook/agents-as-users/identifying-agents.md)
- Rule: Keep one table that says what each verified agent operator may do. It sets the paths, the actions, the rate limit and whether the agent may act for signed-in users.
- Check: A unit test loads the policy file and sends one request per row. Each operator gets exactly the paths and limit its row names. Every row has an owner and a review date less than 12 months old.
- How: Key the table by the verified operator, which is the origin of its key directory. Read it in one middleware, so every route applies the same policy. Give each row an owner and a review date. Agents that act for a person also need that person's grant, as [Name each party in its own token claim](https://agentwranglers.se/playbook/agents-as-users/delegated-access-and-consent/separate-identity-claims.md) says. A verified identity tells you who sent the request, not that it is welcome. Rate limits per operator follow [Set quotas per agent grant](https://agentwranglers.se/playbook/agents-as-users/quotas-and-pricing/quota-per-grant.md).

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
export const AGENT_POLICY = {
  'https://agent.example.net': { owner: 'ops@example.com', reviewBy: '2027-04-01', paths: ['/api/catalog', '/mcp'], perMinute: 120, actForUsers: true },
  'https://crawler.example.org': { owner: 'ops@example.com', reviewBy: '2027-04-01', paths: ['/'], perMinute: 30, actForUsers: false },
};
```

### Python example

```python
AGENT_POLICY = {
    "https://agent.example.net": {"owner": "ops@example.com", "review_by": "2027-04-01",
                                  "paths": ["/api/catalog", "/mcp"], "per_minute": 120, "act_for_users": True},
    "https://crawler.example.org": {"owner": "ops@example.com", "review_by": "2027-04-01",
                                    "paths": ["/"], "per_minute": 30, "act_for_users": False},
}
```

## Sources

- [IETF Web Bot Auth working group charter](https://datatracker.ietf.org/wg/webbotauth/about/)

## Related rules

- AGT-6 [Name each party in its own token claim](https://agentwranglers.se/playbook/agents-as-users/delegated-access-and-consent/separate-identity-claims.md) in Agents as users
- AGT-24 [Set quotas per agent grant](https://agentwranglers.se/playbook/agents-as-users/quotas-and-pricing/quota-per-grant.md) in Agents as users

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/agents-as-users/identifying-agents/policy-per-operator">Agent Wranglers agents as users playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Fetch key directories with network limits](https://agentwranglers.se/playbook/agents-as-users/identifying-agents/safe-key-directory-fetch.md)
- Next: [Choose a default for unsigned agents](https://agentwranglers.se/playbook/agents-as-users/identifying-agents/unsigned-agent-default.md)
- [Identifying agents](https://agentwranglers.se/playbook/agents-as-users/identifying-agents.md)
