OAuth Applications
Status
Current implementation checkpoint for user-owned and owner-managed community developer OAuth apps.
Normal developer apps are created from /developers/apps or
POST /api/v0/developer/oauth-apps. Choose a claimed community in the
dashboard, or supply ownerCommunitySlug to the API, to create an app owned by
a community profile actively owned by the current user.
App Ownership
Current implementation:
- user-owned apps are supported
- community-owned apps are supported for active community owners
- staff/admin delegation for community-owned apps is deferred
- dynamic MCP clients are stored separately from normal developer apps
- trusted partner review is manual, not self-serve
OAuth app records include client identity, owner, redirect URIs, allowed grants, allowed scopes, status, trust tier, and lifecycle timestamps.
Omit ownerCommunitySlug when creating a user-owned app. Include
ownerCommunitySlug to create an app owned by that community. Only claimed
community profiles can own OAuth apps, and only the active singleton community
owner can create, update, rotate secrets for, or revoke the app in this first
pass.
Use PATCH /api/v0/developer/oauth-apps/:clientId to update app metadata,
redirect URIs, allowed grants, and allowed scopes. Client type is immutable;
create a replacement app when moving between public and confidential clients.
Client Types
| Client type | Current use |
|---|---|
| Public | Authorization Code with PKCE and refresh-token rotation. |
| Confidential | Authorization Code with PKCE, refresh-token rotation, Client Credentials, and hashed client-secret validation. |
Public clients must use PKCE and do not have client secrets.
Confidential clients can receive a client secret at app creation and can create
additional secrets through
POST /api/v0/developer/oauth-apps/:clientId/secrets. Secret values are
displayed once. VRDex stores only the secret prefix and hash. Confidential
clients also use PKCE for authorization-code flow and must authenticate with an
active client secret when exchanging codes or rotating refresh tokens.
Redirect URIs
Redirect URI rules:
- exact match only
- HTTPS required for production redirects
- localhost loopback redirects are allowed for local development
- redirect changes should be treated as security-sensitive app edits
Scopes
Current public platform scopes include:
public:readprofile:readprofile:writecommunity:readcommunity:writeevents:readevents:writeassets:readassets:writedeveloper:readdeveloper:writemcp:readmcp:write
Most current public-read integrations should request only public:read or
mcp:read.
Current Flows
Authorization Code with PKCE:
- Developer registers a public or confidential app and exact redirect URI.
- Client sends the user to
GET /oauth/authorize. - User approves the consent screen.
- Client exchanges the code with
POST /oauth/token. - Confidential clients authenticate with an active client secret during code exchange and refresh.
- Client rotates refresh tokens through the
refresh_tokengrant.
Client Credentials:
- Developer registers a confidential app.
- VRDex shows the client secret once.
- Server-side client calls
POST /oauth/token. - VRDex issues a short-lived resource-bound access token.
Dynamic MCP Clients
Dynamic MCP Client Registration is available at POST /oauth/register for
hosted MCP clients that cannot rely on a preconfigured VRDex client id.
Dynamic clients are not normal self-serve developer apps. They are stored in a separate table and can be reviewed or promoted later if an operator decides that is appropriate.
Client ID Metadata Documents are supported as a hosted MCP compatibility path for public clients that prefer preconfigured metadata over Dynamic Client Registration. Accepted CIMD clients are stored as dynamic MCP clients and stay public/no-secret in this checkpoint. CIMD does not change the self-serve ownership model: normal developer apps are user-owned or owned by communities the current user actively owns, while dynamic MCP clients stay separate.
Trusted Partner Review
Trusted partner access is a manual operator process.
Before raising quotas or trust tier, confirm:
- accountable owner and contact path
- intended data surfaces and traffic shape
- whether the app is user-delegated, application-owned, or both
- monitoring and abuse response path
- revocation plan
Trusted partner status should never bypass public visibility, opt-out, suppression, provenance, or object-level authorization rules.