Management API
api.noorle.com accepts a bearer credential on the Authorization header. It
never reads cookies — the surface is built for service accounts and CLI clients,
not a browser session.
API keys
API keys are created in the Portal under Settings → API Keys. They begin withak-.
Authorization: Bearer <credential>Authorization: ApiKey <credential>API-Key: <credential>X-API-Key: <credential>
Authorization: Bearer — it is the form the gateways also accept, so one
code path covers every surface. An API key and a device-flow JWT go in the same
slot; you do not tell the server which kind you are sending, and there is no
prefix rule to satisfy on this host.
An API key row carries an optional expiry and an optional revocation timestamp.
Both are checked before the secret is verified, so a revoked key fails
immediately regardless of whether the secret is correct.
OAuth device flow
The device flow is how the Noorle CLI authenticates a human at a terminal. It is served by the management API, and it is the only grant typePOST /oauth/token accepts on this host.
The device code goes in a request field named
code, not device_code.
The response field from /oauth/device/authorize is named device_code;
the field you send it back in is code.data envelope the /v1 endpoints use. Read their fields off the top level.
See Device Authorization and
Get Token for the full request and response
shapes.
There is no revocation or introspection endpoint
api.noorle.com serves exactly two OAuth routes: /oauth/device/authorize and
/oauth/token. There is no /oauth/token/revoke, no /oauth/introspect, and no
discovery document. To cut off access, revoke the API key in the Portal or wait
out the one-hour token lifetime.
MCP gateways
Each MCP gateway origin is its own OAuth authorization server. A token minted for one gateway does not validate at another. Gateways have three auth modes, set per gateway in the Portal:
A bearer credential is classified by prefix —
ak- is an API key, eyJ is a
JWT, anything else is rejected outright as an invalid token format.
mcp scope, its account_id
matches the gateway’s account, and its audience contains that gateway’s resource
URN (urn:noorle:mcp-gateway:{uuid}). There is no cross-gateway fallback.
An API key is admitted when it is valid, belongs to the gateway’s account, and
the principal holds read authority on the gateway.
Discovery
There is no JWKS to fetch: platform OAuth tokens are signed with a symmetric
HS256 key, and publishing a JWKS would mean publishing the signing secret.
Clients cannot verify these tokens locally; the gateway verifies them.
/authorize, /token, and /register are also served at the origin root as
aliases, for clients that skip metadata discovery.
A 401 from a gateway carries an RFC 9728 challenge pointing at the
protected-resource metadata:
Agent gateways
The agent gateway takes one bearer credential, in two self-identifying kinds.urn:noorle:agent:{id} in the audience, every subject in the
delegation chain must resolve to a live principal in the same account, the chain
depth must be at most 5, and the effective invoking principal must be active.
The agent card at GET /.well-known/agent-card.json is deliberately public and
unauthenticated — it is the contract that tells a caller what credential to
attach. Everything else on the host requires one.
A 401 carries an RFC 6750 challenge:
What is not supported anywhere
- No query-parameter tokens.
?access_token=and?token=are not read on any surface. - No WebSocket. Neither gateway exposes a WebSocket endpoint.
- No session cookies on the management API or either gateway.
- No client-credentials or refresh grant on
api.noorle.com. Only the device-code grant.
Troubleshooting
403 from the management API
403 from the management API
The management API returns 403 for credential failures as well as
permission failures — a missing header, an invalid token, an expired
token, and an unauthorized caller all produce 403. Read the
message field
to tell them apart.'Invalid token format' from an MCP gateway
'Invalid token format' from an MCP gateway
The gateway classifies a bearer credential by prefix. It must start with
ak- (API key) or eyJ (JWT). Anything else is rejected before validation.A gateway token stopped working after you created a second gateway
A gateway token stopped working after you created a second gateway
Tokens are per-gateway. Each origin is its own issuer and checks that its own
resource URN is in the audience. Mint a token against the gateway you are
calling.
406 from an MCP gateway POST
406 from an MCP gateway POST
Streamable HTTP requires the request to accept both content types. Send
Accept: application/json, text/event-stream.