Claude API Key Permissions and Scopes Explained
If you're looking for a way to scope a Claude API key to "read-only," restrict it to one model, or cap what a specific key can access, the short answer is: Anthropic's API doesn't have fine-grained, resource-level scopes the way some other platforms do. What it does have is workspace-level separation and role-based access in the Console, plus organization-wide rate limits. That's the real permission model today, and understanding its boundaries will save you from designing around a feature that doesn't exist.
This article covers exactly what Claude API key permissions can and can't do right now, how to structure workspaces and keys to approximate scopes, and how a layer like SubToAPI gives you per-application keys with usage visibility when you need something more granular than Anthropic's native setup.
What Claude API keys actually control
Every API key you generate in the Anthropic Console belongs to a workspace, and every workspace belongs to an organization. The permission model is built around these two layers:
- Organization roles: Primary Owner, Billing, Admin, Developer, User — these control who can create keys, invite members, view billing, and manage workspaces in the Console itself.
- Workspace boundaries: a key created inside a workspace can only be used to call the API as that workspace. Usage and spend are tracked per workspace.
- Rate limits: limits (requests per minute, tokens per minute) are typically applied at the organization or workspace tier you're on, not per individual key.
What's missing compared to, say, cloud IAM systems:
- No way to restrict a key to specific models (e.g., Haiku only, no Opus).
- No way to limit a key to read vs. write operations — there's no "write" concept at the API level since every call is a model request.
- No endpoint-level scoping (a key that can call
/v1/messagesbut not use tool calling, for example). - No per-key rate limit override — limits are account/workspace wide.
If your use case requires locking a key down to "this key can only hit this model, this many times, for this feature," you need to build that layer yourself or rely on tooling that sits in front of the Claude API.
Practical ways to approximate scopes today
Since Anthropic's native model is workspace-based, the realistic way to create boundaries is:
- One workspace per environment or product surface. Separate workspaces for staging vs. production, or for different internal products, each with its own key and its own billing visibility.
- One key per consuming service. Even within a single workspace, issue distinct keys per microservice so you can revoke one without taking down everything else.
- Rotate keys on a schedule. Since there's no scope restriction, treat every key as fully privileged and rotate it like a root credential.
- Log model and token usage per key at your application layer, since Anthropic's dashboards aggregate at the workspace level, not always broken down the way a team lead building internal tooling needs.
This gets you most of the way to "scoped" behavior, but it's manual and still relies on discipline rather than enforcement.
Where SubToAPI fits
SubToAPI adds a practical permission layer on top of your existing Claude access. Instead of handing out your raw Anthropic key, you generate application keys (sub_live_...) through your SubToAPI dashboard — one per app, per environment, or per team member use case. Each key:
- Hits the same
/v1/messages-compatible endpoint, with full support for streaming and tool use - Reports its own usage metadata, so you can see exactly which application or integration is consuming tokens
- Can be revoked independently without touching your other integrations
- Is tied to a seat in your team, so Solo, Team, and Scale plans map naturally to who holds which key
This doesn't give you model-level restriction either (that constraint is upstream, from Anthropic itself), but it does solve the actual problem most teams have when they search for "permissions and scopes": I need to issue distinct, trackable, revocable credentials to different parts of my system without sharing one master key.
curl https://api.subtoapi.app/v1/messages \
-H "Authorization: Bearer $SUBTOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Summarize this changelog entry."}
]
}'
Issue a separate sub_live_ key per service, keep your underlying Claude access centralized, and manage who sees what from one dashboard. Setup takes a few minutes — see the quickstart and full messages API reference.
Key hygiene checklist
Regardless of whether you're using raw Anthropic keys or an API layer, apply the same baseline rules:
- Never commit keys to source control — use environment variables or a secrets manager
- Issue one key per service or environment, not one key shared across your whole stack
- Set up alerts or dashboards that flag unusual token spend per key
- Rotate keys immediately if a key is exposed in logs, client-side code, or a public repo
- Treat every key as having full account privileges unless you've explicitly verified otherwise
questions
Does the Claude API support read-only or restricted-scope API keys? No. Every API key can call any available endpoint and model within its workspace. There's no built-in read-only, model-restricted, or endpoint-restricted key type.
Can I set different rate limits for different Claude API keys? Not natively. Rate limits apply at the organization or workspace tier. If you need per-consumer throttling, you have to implement it at your application or gateway layer.
What's the best way to isolate access for multiple teams using one Claude account? Create separate workspaces per team in the Anthropic Console, or issue separate application keys through a layer like SubToAPI so each team gets its own trackable, revocable credential without sharing a master key.