Endpoints
Every surface each party exposes, who may call it, and what it answers.
Grouped by the party that operates them. Authorization column says who may call.
The owner's authorization server
Public
| Endpoint | Auth | Answers |
|---|---|---|
GET /.well-known/uma4agents-configuration |
none | Issuer, endpoints, jwks_uri, accepted claim formats |
GET /jwks |
none | Signing keys for RPTs, receipts and PATs |
GET /terms |
none | The owner's terms roster |
GET /terms/{template_id} |
none | A proffered terms document, every version dereferenceable |
GET /terms/{template_id} serves three representations at one URI: JSON by
default, plain-language HTML on Accept: text/html, and JSON-LD with ODRL
permissions and prohibitions on ?format=jsonld.
Token endpoint
| Grant type | Caller | Answers |
|---|---|---|
urn:ietf:params:oauth:grant-type:uma-ticket |
the agent | The four-beat loop |
client_credentials, scope=uma_protection |
an owner-authorized resource server | A PAT |
The PAT is an ordinary access token this authority issues: signed, expiring, carrying the owner as subject and the resource server as authorized party. The owner can revoke a resource server, which kills issuance and verification at once.
Protection API
Resource servers only, PAT-authorized. FedAuthz shape.
| Endpoint | Answers |
|---|---|
POST /perm |
Registers attempted permissions, returns a ticket. Rejects unregistered resources (invalid_resource_id) and excess scopes (invalid_scope) |
POST /introspect |
RPT introspection with the permissions array. Never consumes; an inactive answer carries a reason |
POST /consume |
Burns a single-use RPT. The atomic last step of enforcement |
POST /audit/access |
The enforcement point reports an allowed call, grounding the ledger's "touched" column |
There is no /rreg on this line. Registration is declarative — the authority
reads what the resource server publishes. Classic push registration remains
conformant and is preserved on the legacy/rreg-baseline branch.
Owner API
Takes a credential that is hers. Two are defined and a deployment may accept both: an OIDC access token validated against her realm's published keys, or an RFC 9421 signature from a key she enrolled. No static owner credential exists either way. See put the authority on her device.
| Endpoint | Answers |
|---|---|
GET /owner/pending |
Requests in awaiting-owner state |
POST /owner/pending/{family}/decision |
Approve or deny |
GET /owner/policies |
Tier policy |
POST /owner/policies |
Add a tier of her own, over resources that are registered and not already governed |
PUT /owner/policies/{tier_id} |
Edit a tier's terms, its ask-me flag, or its rules |
DELETE /owner/policies/{tier_id} |
Remove a tier. Its resources become ungoverned, and ungoverned is denied |
GET /owner/policy-vocabulary |
The conditions a rule may use, and which of them may relax one |
GET /owner/resources |
Registered resources joined with tiers |
GET /owner/resource-servers |
Resource servers holding her protection access |
POST /owner/resource-servers/{id}/revoke |
Cut a resource server off from the Protection API |
GET /owner/connections |
Standing agent relationships |
POST /owner/connections/{handle}/revoke |
Revoke a connection and its live RPTs |
GET /owner/operators |
The operators behind those connections, and whether any are blocked |
POST /owner/operators/block |
Shut out every agent one operator runs, revoking what is connected in the same step |
POST /owner/operators/unblock |
Restores the right to negotiate, not the access that was withdrawn |
GET /owner/ledger |
The activity ledger |
GET /owner/events |
Server-sent event stream for portal notification |
Health
| Endpoint | Purpose |
|---|---|
GET /health |
Local liveness. Deliberately independent of the registry pull |
GET /health/registry |
Has the pull landed. For waits and dashboards — never a readiness probe |
The asymmetry is the point: the pull dereferences this server's own public hostname, which routes back to it. Gating readiness on the pull deadlocks.
The resource server's enforcement point
| Endpoint | Auth | Answers |
|---|---|---|
GET /.well-known/oauth-protected-resource[/mcp] |
none | RFC 9728 metadata, OAuth+DPoP binding |
GET /.well-known/aauth-resource.json |
none | The same structural facts, AAuth binding |
GET /jwks |
none | The resource's signing keys |
GET /owner-resources |
RFC 9421-signed query by the owner's authority | Owner-bound resource instances |
/check{path} |
the gateway | The external authorization decision |
The public documents are structural only. Which instances sit behind the resource — whose positions, whose vault — is served only to a querier that proves possession of the owner's authority's signing key. Publishing that at an unauthenticated URI would be a privacy leak.
RFC 9728 members
Standard: resource, authorization_servers, scopes_supported, jwks_uri,
signed_metadata.
Extension members: tool_surfaces (tool names and scopes, structural only) and
owner_resources_endpoint (the protected instance layer, advertised by both
public documents).
signed_metadata carries the same claims as a JWT under the resource's key, so
a relayed copy stays attributable.
AAuth binding document
access_mode (four-party for this topology) and r3_vocabularies, an
operation list content-addressed by a digest. Both public documents point at the
same owner_resources_endpoint; only the encoding differs.
The requesting party's operator
| Endpoint | Answers |
|---|---|
| CIMD document | The firm's public client identity metadata |
| Web Bot Auth key directory | Keys for the Signature-Agent header |
Neither becomes an authorization input. The verifying key is always the RPT's
cnf, and the connection handle is unchanged by either.
Registration flow
The resource server publishes; it never registers.
- The authority fetches the public RFC 9728 document.
- It verifies
signed_metadataagainst the resource'sjwks_uri. - It queries the advertised
owner_resources_endpointwith an RFC 9421-signed request. - It materializes its registry from the response.
One fetch replaces N registration calls, and there is one registry with one
writer. Staleness is the price, and repairing it is the authority's job: an
unknown resource_id at /perm triggers a re-pull.