Source Intelligence
Sweep 28 Aug 2026 ยท 00:00Z Build v2.1.250 478 read Stable v2.1.236 Latest v2.1.250 Next v2.1.250 Feeds RSS JSON llms.txt

DisclaimerUnofficial, and not affiliated with Anthropic. Nearly all of this is read straight out of what ships: npm bundles, captured prompts, published docs. Anthropic's own notes go in verbatim, marked as theirs. The rest is my reading, and every entry carries the strings behind it. If one looks wrong, vote it down and say why.

One change

wif-reference

manage-claude/wif-reference

first seen The page's own history The capture it came from

Nearest release: v2.1.235, published an hour after this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.

manage-claude/wif-reference Changed · +13 / -12 lines

from line 216
 
 `POST /v1/oauth/token` returns errors in the standard [API error shape](https://platform.claude.com/docs/en/api/errors). The SDK wraps exchange failures in a typed `FederationExchangeError` (or language equivalent) that exposes the HTTP status, the response body, and the `request_id`.
 
-| Status | Error             | Cause                                                                                                                            | Resolution                                                                                                                                                                                                                                                                                                                    |
-| ------ | ----------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 400    | `invalid_request` | `federation_rule_id` is malformed or a required request field is missing.                                                        | Verify the `fdrl_` ID and that the request body includes all required fields.                                                                                                                                                                                                                                                 |
-| 400    | `invalid_request` | `workspace_id_required`: the federation rule is enabled for more than one workspace and the request omits `workspace_id`.        | Set `ANTHROPIC_WORKSPACE_ID` (or the `workspace_id` body field on a raw request) to the `wrkspc_...` ID you want the token scoped to. See [Token exchange request](https://platform.claude.com/docs/en/manage-claude/wif-reference#token-exchange-request).                                                                   |
-| 400    | `invalid_grant`   | The JWT `iss` claim does not equal the registered `issuer_url` exactly.                                                          | Compare byte-for-byte, including trailing slashes and scheme: `jq -rR 'split(".")[1] \| gsub("-";"+") \| gsub("_";"/") \| @base64d \| fromjson \| .iss' <<< "$JWT"`.                                                                                                                                                          |
-| 400    | `invalid_grant`   | JWKS fetch failed, JWKS is stale, or the JWT was signed with a key not in the JWKS.                                              | For `inline` mode, update the issuer with the rotated keys. For `discovery` and `explicit_url`, confirm the JWKS endpoint is reachable on port 443; if the issuer recently rotated its signing key, see [Key rotation and caching](https://platform.claude.com/docs/en/manage-claude/wif-reference#key-rotation-and-caching). |
-| 400    | `invalid_grant`   | The JWT `exp` claim is in the past (beyond the 30-second skew window).                                                           | Confirm your identity provider is projecting a fresh token and the SDK is re-reading the token file.                                                                                                                                                                                                                          |
-| 400    | `invalid_grant`   | The JWT was verified but its claims do not satisfy the rule's `match` block.                                                     | Decode the JWT and compare each claim against the rule. `subject_prefix` is case-sensitive. `audience` requires an exact element match.                                                                                                                                                                                       |
-| 400    | `invalid_grant`   | The `federation_rule_id` does not exist, is archived, or the JWT is not authorized for it (consolidated to prevent enumeration). | Confirm the rule ID in the Claude Console and that the rule has not been archived.                                                                                                                                                                                                                                            |
+| Status | Error                   | Cause                                                                                                                                                                   | Resolution                                                                                                                                                                                                                                                                                                                    |
+| ------ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 400    | `invalid_request_error` | `federation_rule_id` is malformed or a required request field is missing.                                                                                               | Verify the `fdrl_` ID and that the request body includes all required fields.                                                                                                                                                                                                                                                 |
+| 400    | `invalid_request_error` | `workspace_id` is present but is not a well-formed `wrkspc_...` ID or the literal `default`.                                                                            | Fix the `workspace_id` value; the response message names the expected format.                                                                                                                                                                                                                                                 |
+| 401    | `authentication_error`  | The JWT `iss` claim does not equal the registered `issuer_url` exactly.                                                                                                 | Compare byte-for-byte, including trailing slashes and scheme: `jq -rR 'split(".")[1] \| gsub("-";"+") \| gsub("_";"/") \| @base64d \| fromjson \| .iss' <<< "$JWT"`.                                                                                                                                                          |
+| 401    | `authentication_error`  | JWKS fetch failed, JWKS is stale, or the JWT was signed with a key not in the JWKS.                                                                                     | For `inline` mode, update the issuer with the rotated keys. For `discovery` and `explicit_url`, confirm the JWKS endpoint is reachable on port 443; if the issuer recently rotated its signing key, see [Key rotation and caching](https://platform.claude.com/docs/en/manage-claude/wif-reference#key-rotation-and-caching). |
+| 401    | `authentication_error`  | The JWT `exp` claim is in the past (beyond the 30-second skew window).                                                                                                  | Confirm your identity provider is projecting a fresh token and the SDK is re-reading the token file.                                                                                                                                                                                                                          |
+| 401    | `authentication_error`  | The JWT was verified but its claims do not satisfy the rule's `match` block.                                                                                            | Decode the JWT and compare each claim against the rule. `subject_prefix` is case-sensitive. `audience` requires an exact element match.                                                                                                                                                                                       |
+| 401    | `authentication_error`  | The `federation_rule_id` does not exist, is archived, or the JWT is not authorized for it (consolidated to prevent enumeration).                                        | Confirm the rule ID in the Claude Console and that the rule has not been archived.                                                                                                                                                                                                                                            |
+| 401    | `authentication_error`  | The federation rule is enabled for more than one workspace and the request omits `workspace_id`. The authentication history entry shows reason `workspace_id_required`. | Set `ANTHROPIC_WORKSPACE_ID` (or the `workspace_id` body field on a raw request) to the `wrkspc_...` ID you want the token scoped to. See [Token exchange request](https://platform.claude.com/docs/en/manage-claude/wif-reference#token-exchange-request).                                                                   |
 
-All `invalid_grant` failures return HTTP 400; the specific cause is logged server-side only and not exposed in the response.
+Every assertion denial returns the same opaque `401` `authentication_error` with the fixed message `Authentication failed`, regardless of which check failed; a distinguishable error would let a caller probe rule configuration. The deny reason is recorded on the attempt's entry in the [authentication history](https://platform.claude.com/settings/workload-identity-federation?tab=history), for example `match_subject_prefix` when the `sub` claim fails the rule's `subject_prefix`, or `workspace_id_required` when the rule spans multiple workspaces and the request names none. Requests rejected before the rule's organization is corroborated (the `400 invalid_request_error` family above) leave no history entry; their response messages name the problem directly. A `401` with no matching history entry usually means the `federation_rule_id` itself was not recognized.
 
 ### Common SDK-side failures
 
from line 241
 
 ## Troubleshoot a failed exchange
 
-A `400 invalid_grant` response is intentionally opaque; the specific cause is logged server-side only.
+A `401` `authentication_error` response is intentionally opaque and its message is always `Authentication failed`; the deny reason is recorded in the authentication history, not in the response.
 
 <Tip>
   Start with the [authentication history page](https://platform.claude.com/settings/workload-identity-federation?tab=history) in the Claude Console. Recent exchange attempts surface the issuer and rule that were evaluated, the JWT claims that were inspected, and which validation step failed, which usually short-circuits the following checks.