Management API
Organizations, projects, members, API keys, and credits (OIDC-authenticated).
The management API is the human plane: organizations, membership, invitations, projects, API keys, and credits.
Note: these routes authenticate with your dashboard login token (an OIDC bearer JWT), not an
rlp_project API key. In the examples below,$OIDC_TOKENis that JWT. See Authentication and Organizations.
Roles: an org owner manages the org itself, membership, and invitations; a member manages projects, keys, and project resources but not the org. Every user gets an undeletable personal organization that takes no invitations.
GET /me
The authenticated user.
Organizations
POST /orgs
Create an organization; the caller becomes its owner. Body: { "name": string } (required, non-empty).
GET /orgs
Organizations the caller belongs to: { "organizations": [ { "id", "name", "personal", "role" } ] }.
GET /orgs/:id
One org: { "id", "name", "personal", "role" }. 404 for non-members.
PATCH /orgs/:id
Rename (owner only). Body { "name": string } → { "id", "name" }. 403 for non-owners.
DELETE /orgs/:id
Delete (owner only) → { "deleted": "<id>" }.
403— not an owner.409— the personal organization cannot be deleted.
Members
GET /orgs/:id/members
{ "members": [ { "user_id", "email", "name", "role" } ] }. Any member may read.
DELETE /orgs/:id/members/:user_id
Remove a member (owner only) → { "removed": "<user_id>" }.
403— not an owner.404— not a member.409— cannot remove the last owner.
Invitations
POST /orgs/:id/invitations
Invite by email (owner only). Body: { "email": string, "role": "owner" | "member" } (role defaults to "member"). Re-inviting the same email refreshes the pending invitation (valid 14 days).
400— role notowner/member.403— not an owner.409— personal orgs cannot have members.
GET /orgs/:id/invitations
Pending invitations for the org (owner only): { "invitations": [ { "id", "email", "role" } ] }.
GET /invitations
Pending, unexpired invitations addressed to the caller's email: { "invitations": [ { "id", "org_id", "org_name", "role" } ] }.
POST /invitations/:id/accept
Accept an invitation → { "org_id", "role" }.
403— the invitation is addressed to a different email.404— unknown, already accepted, or expired.
Projects
POST /orgs/:id/projects
Create a project in the org. Body: { "name": string } → { "id", "org_id", "name" }. 409 on a duplicate name.
GET /orgs/:id/projects
{ "projects": [ { "id", "name" } ] }.
DELETE /projects/:id
Delete a project → { "deleted": "<id>" }. 404 for projects outside the caller's orgs.
API keys
POST /projects/:id/api-keys
Mint a workload API key for a project. Body (optional): { "name": string } — defaults to "default"; minting another "default" key revokes the previous one. The plaintext token is returned once and never stored.
GET /projects/:id/api-keys
Live keys for a project; ?include_revoked=true includes revoked ones.
DELETE /api-keys/:id
Revoke a key (idempotent) → { "revoked": "<id>" }. 404 when the key's project is outside the caller's orgs.
Credits
GET /orgs/:id/credits
Balance, effective overdraft limit, and recent ledger entries. Any member may read. ?limit= caps ledger entries (default 50, max 500). See Spending.
Project resources (management mirror)
The workload-plane secrets, registries, and object stores are also reachable with the OIDC token, scoped by project id in the path. Semantics, bodies, and responses match the workload endpoints; any org member may manage them.
| Mirror route | Workload equivalent |
|---|---|
GET /projects/:id/secrets · PUT /projects/:id/secrets (body includes name) | GET /secrets |
GET/PUT/DELETE /projects/:id/secrets/:name | /secrets/:name |
GET /projects/:id/registries · PUT /projects/:id/registries (body includes host) | GET/PUT /registries |
GET/PUT/DELETE /projects/:id/registries/:host | /registries/:host |
GET/POST /projects/:id/object-stores | /object-stores |
GET/DELETE /projects/:id/object-stores/:name | /object-stores/:id_or_name |
Errors (all management routes)
401— missing/invalid OIDC token.403— owner-only action attempted by a member, or accepting someone else's invitation.404— org/project/key outside the caller's memberships.409— duplicate names, personal-org restrictions, last-owner removal.