Workspace API
The Workspace API manages organizations, projects, project API keys, members, Gateway settings, and integrations. Most routes are project-qualified because they operate on a specific project or organization.
Base URL:
https://api.provon.dev/v1Authentication#
Workspace routes accept two credential types:
- Project API key —
Authorization: Bearer <PROVON_API_KEY>. The key selects the project for public/v1/*routes. For project-qualified routes, the key must have access to the requested:projectId. - Signed-in Workbench session — AuthJS session cookie. Used for
/v1/projects/:projectId/*routes when the calling user has the required project permission.
Only the collection routes below are reachable from a project API key. Every other route in this
page is session-only: it returns 401 UNAUTHORIZED ("workspace session required") when called
with a bearer API key, because it depends on a signed-in human identity (membership role or
onboarding state).
| Operation | API key capability | Workbench permission | Reachable from API key? |
|---|---|---|---|
| List organizations | workspace:read |
n/a (user-scoped) | Yes |
| Create an organization | — (user actor only) | n/a (user-scoped) | No* |
| List projects | workspace:read |
n/a (user-scoped) | Yes |
| Create a project | workspace:write |
organization:projects:create |
Yes |
| Read/update/delete a project | — | project:read / project:update / project:delete |
No |
| Manage project members | — | project:members:write |
No |
| Manage project API keys | — | project:apiKeys:write |
No |
| Manage Gateway settings | — | project:update |
No |
| Manage integrations | — | project:update |
No |
* POST /v1/organizations rejects project API keys outright: the actor must resolve as a signed-in
user (or a user-bound access token), not a project API key. Callers that only hold a project API
key cannot provision new organizations.
Project-scoped API keys also cannot create projects inside an organization they do not already
belong to; the same assertOrganizationProjectCreateAllowed check that applies to browser users
applies to bearer callers.
Organizations#
Collection routes accept both credential types. The remaining routes are session-only.
| Method | Path | Purpose | Credential |
|---|---|---|---|
GET |
/v1/organizations |
List actor organizations | Session or API key (workspace:read) |
POST |
/v1/organizations |
Create an organization | Session only (user actor) |
GET |
/v1/organizations/:organizationId |
Read one organization | Session only |
PATCH |
/v1/organizations/:organizationId |
Update name and/or slug |
Session only |
POST |
/v1/organizations/:organizationId/invitations |
Invite a member | Session only |
DELETE |
/v1/organizations/:organizationId/invitations/:invitationId |
Revoke an invitation | Session only |
POST |
/v1/organization-invitations/:token/accept |
Accept an invitation | Session only |
PATCH |
/v1/organizations/:organizationId/members/:memberId |
Update member role | Session only |
DELETE |
/v1/organizations/:organizationId/members/:memberId |
Remove member | Session only |
Create an organization:
curl -X POST "$PROVON_API_URL/organizations" \
-H "Authorization: Bearer $PROVON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme AI"}'Invite a member (session-only; role is one of OWNER, ADMIN, MEMBER, VIEWER):
curl -X POST "$PROVON_API_URL/organizations/$ORG_ID/invitations" \
-H "Authorization: Bearer $PROVON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "colleague@example.com", "role": "MEMBER"}'Projects#
GET /v1/projects and POST /v1/projects accept both credential types. The remaining routes are
session-only.
| Method | Path | Purpose | Credential |
|---|---|---|---|
GET |
/v1/projects |
List projects (optional ?organizationId=) |
Session or API key (workspace:read) |
POST |
/v1/projects |
Create a project | Session or API key (workspace:write) |
GET |
/v1/projects/:projectId |
Read one project | Session only |
PATCH |
/v1/projects/:projectId |
Update project | Session only |
DELETE |
/v1/projects/:projectId |
Delete project | Session only |
PUT |
/v1/projects/:projectId/members/:userId |
Set member role | Session only |
DELETE |
/v1/projects/:projectId/members/:userId |
Remove member | Session only |
GET |
/v1/projects/:projectId/setup-status |
Setup status summary (masked first API key + Gateway state) | Session only |
Create a project:
curl -X POST "$PROVON_API_URL/projects" \
-H "Authorization: Bearer $PROVON_API_KEY" \
-H "Content-Type: application/json" \
-d '{"organizationId": "org_...", "name": "Production agents"}'Project API Keys#
All project API key routes are session-only. They are used by the Workbench to mint, rename, and revoke keys and to attach per-key usage policies; a project API key cannot manage itself.
| Method | Path | Purpose |
|---|---|---|
GET |
/v1/projects/:projectId/api-keys |
List project API keys |
POST |
/v1/projects/:projectId/api-keys |
Create a project API key |
PATCH |
/v1/projects/:projectId/api-keys/:keyId |
Rename a key (set name; name may be null to clear) |
DELETE |
/v1/projects/:projectId/api-keys/:keyId |
Revoke a key |
POST |
/v1/projects/:projectId/api-keys/:keyId/usage-policies |
Create a usage policy |
PATCH |
/v1/projects/:projectId/api-keys/:keyId/usage-policies/:policyId |
Update a usage policy |
DELETE |
/v1/projects/:projectId/api-keys/:keyId/usage-policies/:policyId |
Delete a usage policy |
Create a key. The response includes the full secret once; store it immediately. When
capabilities is omitted, the deployer grants the default set listed in
Authentication.
curl -X POST "$PROVON_API_URL/projects/$PROJECT_ID/api-keys" \
-H "Authorization: Bearer $PROVON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "CI ingest key",
"capabilities": ["telemetry:ingest"]
}'A usage policy body includes:
metric— one ofrequests,tokens, orcost_usd.mode— one ofrate_limitorbudget.limitValue— positive number.windowPolicy— one ofminute,hour,day,week,month,quarter,year,custom, orlifetime. WhenwindowPolicyiscustom,customWindowSecondsis required (positive integer); it is rejected for every other window policy.model— optional model name that scopes the policy to one model.enabled— optional boolean; when omitted on create the deployer defaults it totrue.
Gateway Settings#
All Gateway settings routes are session-backed. Project Gateway settings configure provider keys, model policies, auto-router, guardrails, and observability.
| Method | Path | Purpose |
|---|---|---|
GET |
/v1/projects/:projectId/gateway/settings |
Read Gateway settings |
PUT |
/v1/projects/:projectId/gateway/settings |
Replace Gateway settings |
DELETE |
/v1/projects/:projectId/gateway/settings |
Delete Gateway settings |
POST |
/v1/projects/:projectId/gateway/model-policies |
Update model policies |
POST |
/v1/projects/:projectId/gateway/auto-router |
Update auto-router config |
POST |
/v1/projects/:projectId/gateway/guardrails |
Update guardrails |
POST |
/v1/projects/:projectId/gateway/guardrails/dry-run |
Test guardrail rules without saving (body requires direction: input or output, sample, optional guardrails) |
POST |
/v1/projects/:projectId/gateway/observability |
Update observability config |
POST |
/v1/projects/:projectId/gateway/pause |
Pause Gateway for the project |
POST |
/v1/projects/:projectId/gateway/resume |
Resume Gateway for the project |
For provider key and model-binding management from service clients, see Gateway API.
Integrations#
Project integrations connect Findings to issue trackers. All routes are session-backed.
| Method | Path | Purpose |
|---|---|---|
GET |
/v1/projects/:projectId/integrations |
List configured connectors |
PUT |
/v1/projects/:projectId/integrations/:kind |
Create or update a connector (enabled, config, secret) |
PATCH |
/v1/projects/:projectId/integrations/:kind |
Toggle a connector (enabled: boolean) |
DELETE |
/v1/projects/:projectId/integrations/:kind |
Delete a connector |
GET |
/v1/projects/:projectId/integrations/:kind/authorize |
Start OAuth authorization (redirects) |
GET |
/v1/integrations/:kind/callback |
OAuth callback |
GET |
/v1/projects/:projectId/integrations/github |
GitHub connector status ({configured, connected}) |
GET |
/v1/projects/:projectId/integrations/github/repositories |
List GitHub repositories |
Supported connector kinds are github, gitlab, linear, and jira.
Account And Workspace Setup#
These routes are session-backed and are used by the Workbench during onboarding and account management.
| Method | Path | Purpose |
|---|---|---|
GET |
/v1/account |
Read current account settings |
PATCH |
/v1/account |
Update account settings |
POST |
/v1/account/session-revocations |
Revoke all other sessions |
GET |
/v1/workspace |
Read workspace summary |
GET |
/v1/workspace-initialization |
Get default onboarding organization |
PUT |
/v1/workspace-initialization |
Ensure initial workspace |
POST |
/v1/workspace/provision |
Provision first project and API key |
Errors#
Workspace errors use the common API error envelope:
{
"error": {
"code": "FORBIDDEN",
"message": "actor cannot create projects in organization",
"details": {}
}
}Common status codes:
| Status | Meaning |
|---|---|
400 |
Validation error or missing required field |
401 |
Missing or invalid credential, or session required |
403 |
Credential lacks capability or permission |
404 |
Organization, project, key, or member missing |
409 |
Conflict (duplicate slug, active invitation, anchor not in conversation) |