Skip to content
/oauth/register

Dynamic Client Registration (RFC 7591)

Open registration endpoint (advertised as `registration_endpoint` in the AS metadata). An MCP client POSTs its metadata as JSON and receives a `client_id`. **Public clients only**: `token_endpoint_auth_method` is forced to `none` (no secret — authenticate with PKCE), `scope` is forced to `mcp`, `grant_types` is filtered to `authorization_code`(+`refresh_token`) and `response_types` to `code`. `redirect_uris` (required, 1-5) must each be `https` or a loopback `http://127.0.0.1[:port]` URI with no fragment (RFC 8252; `localhost` is rejected — register the 127.0.0.1 IP literal). Guarded by per-IP + global daily caps. Returns 201 `{ client_id, client_id_issued_at, redirect_uris, grant_types, response_types, token_endpoint_auth_method, scope }` — no `client_secret` (public client).

free

Parameters

NameInRequiredDefaultAllowedDescriptionExample
redirect_urisbodyrequiredJSON array (1-5) of allowed redirect URIs. Each must be `https` or loopback `http://127.0.0.1[:port]`, no fragment.http://127.0.0.1:51000/callback
client_namebodyoptionalHuman-readable client name shown on the consent page (escaped).Cursor
grant_typesbodyoptionalauthorization_code refresh_tokenJSON array; filtered to the supported set (`authorization_code` required).authorization_code
token_endpoint_auth_methodbodyoptionalnonePublic clients only — must be `none` (or omitted).none

Response schema

FieldTypeNullableDescription
client_idstringnoThe newly issued client identifier. The client passes this on every subsequent `/oauth/authorize`, `/oauth/token` and `/oauth/revoke` call. There is NO `client_secret` — this is a public client.
client_id_issued_atintegernoUnix timestamp (seconds) when the client_id was issued.
token_endpoint_auth_methodstringnoHow the client authenticates at the token endpoint. Always `none` (public client; authenticates with PKCE, no secret).
grant_typesarraynoThe grant types registered for this client, filtered to the supported set — `authorization_code` (always present) and optionally `refresh_token`.
response_typesarraynoThe response types registered. Always `['code']`.
redirect_urisarraynoThe accepted redirect URIs (as validated: 1-5 entries, each `https` or an `http://127.0.0.1[:port]` loopback with no fragment). `/oauth/authorize` accepts a `redirect_uri` only if it matches one of these.
scopestringnoThe scope granted to this client — the `mcp` superscope plus the read-scope set — as a space-delimited string.
client_namestringyesThe human-readable client name, echoed back. Present only when the request supplied `client_name`.

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl -X POST "https://api.finradar.ai/oauth/register" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "redirect_uris": "http://127.0.0.1:51000/callback",
  "client_name": "Cursor",
  "grant_types": "authorization_code",
  "token_endpoint_auth_method": "none"
}'

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).