Skip to main content
abadge implements the WorkOS auth.md anonymous → user-claimed flow. An agent registers an unclaimed personal account on a person’s behalf and receives an abu_ personal API key immediately. The human then claims the account with a 6-digit code emailed to them, binding their verified email to the account. After the claim, the agent manages that person’s credentials through the normal items and profiles surface.
These endpoints live at the root of the API host (not under /v1) and are all unauthenticated. The issued credential is a standard personal API key (abu_): a management-surface session bound to the new account. It can never reach the agent-gated access surface — it cannot reveal or mount secret values.

Base URL

Discovery

Discovery is two-hop, per RFC 9728. A 401 from any route carries a WWW-Authenticate header pointing at the protected-resource metadata, so an agent can bootstrap from a single failed request:

The flow

1

Register anonymously

POST /agent/auth provisions an unclaimed personal account (a placeholder-email owner, an org, and a default server_managed profile) and returns an abu_ credential plus a clm_ claim token. The credential authenticates immediately but the account stays inert until it is claimed.
2

Start the claim

POST /agent/auth/claim with the human’s email. abadge emails them a 6-digit code. The agent asks the human for that code.
3

Complete the claim

POST /agent/auth/claim/complete with the code. abadge binds the human’s verified email to the account in place and upgrades the credential’s scopes.
4

Use the credential

Send Authorization: Bearer abu_.... The agent can now read and manage the person’s vault through the normal management surface.

Register

string
default:"anonymous"
Identity type. Only anonymous is supported.
string
default:"api_key"
Credential type. Only api_key is supported.
string
Opaque registration identifier.
string
Always anonymous.
string
Always api_key.
string
The abu_ personal API key. Shown once — store it now.
null
Personal API keys do not expire on their own; the owner revokes them.
string[]
Pre-claim scopes (abadge:account.read).
string
The URL to call for the claim step.
string
A clm_ token. Pass it to both claim calls. Expires after 24 hours.
string
ISO 8601 expiry of the claim token.
string[]
Scopes granted after a successful claim (abadge:account.read, abadge:account.manage).

Start the claim

string
required
The clm_ token from registration.
string
required
The human owner’s email. abadge sends a 6-digit code here.
string
The registration being claimed.
string
Identifier for this claim attempt.
string
Always initiated.
string
ISO 8601 expiry of the emailed code (10 minutes).

Complete the claim

string
required
The same clm_ token.
string
required
The 6-digit code the human received by email.
string
The claimed registration.
string
Always claimed. The credential’s scopes are upgraded in place.

Limits and lifetimes

Errors

This surface returns the standard { code, message, hint, meta } error envelope. The auth.md-specific codes are:

Revocation

There is no agent-facing revoke. The account owner revokes the agent’s credential from the dashboard; a revoked credential then returns 401.