title: Create Federation Rule url: https://platform.claude.com/docs/en/api/beta/organization/federation/rules/create
Create Federation Rule
POST /v1/organizations/federation_rules
Requires an OAuth access token with the org:admin scope, from ant auth login --scope org:admin or a workload identity federation rule; Admin API keys are not accepted. See Manage WIF with the Admin API.
Create a federation rule owned by your organization.
The referenced issuer and the target service account must already exist
in the same organization; invalid references are rejected with a 400
error. The workspace reference is validated. Membership is not checked
at rule creation: token exchange resolves a single enabled workspace per
call and is rejected unless the target service account is a member of
that workspace (it is implicitly a member of the default workspace).
Rules on well-known shared issuers (GitHub Actions, GitLab, Buildkite,
Terraform Cloud, Google) must constrain tenant identity via an
identity-bearing claim, a tenant-pinning subject prefix (such as
repo:YOUR_ORG/...), or a CEL condition referencing one of those
identity claims (e.g. claims.repository_owner). OAuth callers may only
manage rules whose oauth_scope is workspace:developer or
workspace:inference; other scopes require a Console session.
Headers
-
"anthropic-beta": optional array of AnthropicBetaOptional header to specify the beta version(s) you want to use.
-
string -
"message-batches-2024-09-24" or "prompt-caching-2024-07-31" or "computer-use-2024-10-22" or 43 more-
"message-batches-2024-09-24" -
"prompt-caching-2024-07-31" -
"computer-use-2024-10-22" -
"computer-use-2025-01-24" -
"pdfs-2024-09-25" -
"token-counting-2024-11-01" -
"token-efficient-tools-2025-02-19" -
"output-128k-2025-02-19" -
"files-api-2025-04-14" -
"mcp-client-2025-04-04" -
"mcp-client-2025-11-20" -
"dev-full-thinking-2025-05-14" -
"interleaved-thinking-2025-05-14" -
"code-execution-2025-05-22" -
"extended-cache-ttl-2025-04-11" -
"context-1m-2025-08-07" -
"context-management-2025-06-27" -
"model-context-window-exceeded-2025-08-26" -
"skills-2025-10-02" -
"fast-mode-2026-02-01" -
"output-300k-2026-03-24" -
"user-profiles-2026-03-24" -
"user-profiles-2026-08-18" -
"user-profiles-2026-09-04" -
"advisor-tool-2026-03-01" -
"managed-agents-2026-04-01" -
"cache-diagnosis-2026-04-07" -
"dreaming-2026-04-21" -
"thinking-token-count-2026-05-13" -
"server-side-fallback-2026-06-01" -
"server-side-fallback-2026-07-01" -
"fallback-credit-2026-06-01" -
"fallback-credit-2026-07-01" -
"agent-memory-2026-07-22" -
"mid-conversation-tool-changes-2026-07-01" -
"compact-2026-01-12" -
"computer-use-2025-11-24" -
"mcp-tunnels-2026-06-22" -
"structured-outputs-2025-11-13" -
"task-budgets-2026-03-13" -
"thinking-display-updates-2026-08-18" -
"ce-user-management-2026-07-13" -
"mid-conversation-output-config-2026-07-01" -
"thinking-binding-controls-2026-08-01" -
"mid-conversation-system-clear-at-2026-08-21" -
"compact-2026-09-04"
-
-
Body parameters
-
issuer_id: stringTagged ID of the federation issuer.
-
match: BetaFederationRuleMatchConditions the verified JWT must satisfy for this rule to apply. At least one of
subject_prefix(other than a wildcard-only value like*),claims, orconditionis required;audiencealone is not sufficient.-
audience: optional string or nullExact match against the
audclaim (any element if array). When omitted, the JWT'saudmust still equal Anthropic's expected audience for the issuer; setting this field overrides that default.maxLength: 1024
-
claims: optional map[string] or nullExact-match
{claim: value}pairs against top-level claims. Only string-valued claims can be matched; useconditionfor non-string claims. -
condition: optional string or nullCEL expression over claims for logic the structural fields can't express. Must evaluate to a boolean and may reference only the
claimsvariable; a constant-true expression (such astrue) is rejected with 400.maxLength: 4096
-
subject_prefix: optional string or nullMatch the verified JWT
subclaim. Exact match unless the value ends with*, in which case it is a prefix match. Example:repo:my-org/my-repo:ref:refs/heads/main.maxLength: 1024
-
-
name: stringSlug identifier (lowercase, digits, hyphens). Unique within the organization; a duplicate name returns 409.
maxLength: 255, minLength: 1
-
oauth_scope: stringSpace-separated OAuth scopes. OAuth callers may only set
workspace:developerorworkspace:inference; other scopes (such asorg:admin) require a Console session.minLength: 1
-
target: BetaServiceAccountTargetIdentity that tokens minted via this rule act as. Currently always a
service_accounttarget.-
type: "service_account" -
service_account_id: stringTagged ID of the service account to mint tokens for.
-
service_account_name: optional string or nullService account's display name at read time. Ignored on writes.
-
-
applies_to_all_workspaces: optional booleanWhen true, enable this rule for every workspace in the org (including workspaces created later).
-
attributes: optional map[string] or nullCEL expressions
{name: expr}extracting named values from claims. Not yet supported; any non-empty value is rejected with 400. -
description: optional string or nullOptional free-text description.
maxLength: 2000
-
token_lifetime_seconds: optional numberLifetime in seconds for access tokens minted via this rule (60-86400). Defaults to 3600 (1h). Minted tokens are capped at
max(60, min(this value, 2 × remaining assertion validity))seconds.maximum: 86400, minimum: 60
-
workspace_id: optional string or nullTagged ID of the workspace to enable this rule for. Required unless
applies_to_all_workspacesis true. Additional workspaces can be added via the/federation_rules/{federation_rule_id}/workspacessub-resource.
Returns
-
BetaFederationRule objectAuthorization rule binding an external OIDC identity to Anthropic.
Evaluates the match conditions and mints an OAuth access token for the resolved target, scoped to a single workspace where the rule is enabled (chosen by the caller at exchange time when the rule is enabled for more than one). For rules enabled via
workspace_idsorapplies_to_all_workspaces, the target service account must be a member of that workspace (it is implicitly a member of the default workspace); rules carrying only the legacyworkspace_idbinding do not enforce this.-
type: "federation_rule"default: federation_rule
-
id: stringTagged ID of the federation rule.
-
applies_to_all_workspaces: booleanWhen true, this rule is enabled for every workspace in the org (including ones created after the rule).
workspace_idsis ignored at exchange time. -
archived_at: string or nullIf set, this rule is archived and rejects token exchange.
format: date-time
-
archived_by_actor_id: string or nullTagged ID (
user_/svac_) of the actor that archived this rule. -
attributes: map[string] or nullCEL expressions extracting named values from claims. Not yet supported; always null.
-
created_at: stringWhen this rule was created.
format: date-time
-
created_by_actor_id: string or nullTagged ID (
user_/svac_) of the actor that created this rule. -
description: string or nullOptional free-text description.
-
issuer_id: stringTagged ID of the issuer whose tokens this rule accepts.
-
issuer_name: string or nullIssuer's display name at read time.
-
match: BetaFederationRuleMatchConditions the verified JWT must satisfy for this rule to apply. All populated matcher fields must pass.
-
audience: optional string or nullExact match against the
audclaim (any element if array). When omitted, the JWT'saudmust still equal Anthropic's expected audience for the issuer; setting this field overrides that default.maxLength: 1024
-
claims: optional map[string] or nullExact-match
{claim: value}pairs against top-level claims. Only string-valued claims can be matched; useconditionfor non-string claims. -
condition: optional string or nullCEL expression over claims for logic the structural fields can't express. Must evaluate to a boolean and may reference only the
claimsvariable; a constant-true expression (such astrue) is rejected with 400.maxLength: 4096
-
subject_prefix: optional string or nullMatch the verified JWT
subclaim. Exact match unless the value ends with*, in which case it is a prefix match. Example:repo:my-org/my-repo:ref:refs/heads/main.maxLength: 1024
-
-
name: stringAdmin-chosen slug identifier.
-
oauth_scope: stringSpace-separated OAuth scopes granted on the minted token.
-
target: BetaServiceAccountTargetIdentity that tokens minted via this rule act as. Currently always a
service_accounttarget.-
type: "service_account" -
service_account_id: stringTagged ID of the service account to mint tokens for.
-
service_account_name: optional string or nullService account's display name at read time. Ignored on writes.
-
-
token_lifetime_seconds: numberLifetime in seconds of access tokens minted via this rule. Minted tokens are capped at
max(60, min(this value, 2 × remaining assertion validity))seconds. -
updated_at: stringWhen this rule was last updated.
format: date-time
-
updated_by_actor_id: string or nullTagged ID (
user_/svac_) of the actor that last updated this rule. -
workspace_id: string or nullLegacy single-workspace binding. Prefer
workspace_idsand the/federation_rules/{federation_rule_id}/workspacessub-resource for managing workspace enablement. -
workspace_ids: array of stringTagged IDs of the workspaces this rule is enabled for. May be empty for older rules that only carry the legacy
workspace_idbinding. Ignored at exchange time whenapplies_to_all_workspacesis true (the list may still be non-empty).
-
Example
curl https://api.anthropic.com/v1/organizations/federation_rules \
-H 'Content-Type: application/json' \
-H 'anthropic-version: 2023-06-01' \
-H "X-Api-Key: $ANTHROPIC_API_KEY" \
-d '{
"issuer_id": "issuer_id",
"match": {},
"name": "x",
"oauth_scope": "x",
"target": {
"service_account_id": "svac_01SDCCSbTxrXDpWc1phhtcfK",
"type": "service_account"
}
}'Response (200)
{
"id": "fdrl_01SDCCSbTxrXDpWc1phhtcfK",
"applies_to_all_workspaces": true,
"archived_at": "2019-12-27T18:11:19.117Z",
"archived_by_actor_id": "archived_by_actor_id",
"attributes": {
"foo": "string"
},
"created_at": "2024-10-30T23:58:27.427722Z",
"created_by_actor_id": "created_by_actor_id",
"description": "description",
"issuer_id": "issuer_id",
"issuer_name": "issuer_name",
"match": {
"audience": "audience",
"claims": {
"foo": "string"
},
"condition": "condition",
"subject_prefix": "subject_prefix"
},
"name": "prod-deploy-pipeline",
"oauth_scope": "oauth_scope",
"target": {
"service_account_id": "svac_01SDCCSbTxrXDpWc1phhtcfK",
"type": "service_account",
"service_account_name": "service_account_name"
},
"token_lifetime_seconds": 0,
"type": "federation_rule",
"updated_at": "2024-10-30T23:58:27.427722Z",
"updated_by_actor_id": "updated_by_actor_id",
"workspace_id": "workspace_id",
"workspace_ids": [
"string"
]
}