Skip to content

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.

View as Markdown Open the plain-text version of this page.

Base URL:

text
https://api.provon.dev/v1

Authentication#

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:

bash
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):

bash
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:

bash
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.

bash
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 of requests, tokens, or cost_usd.
  • mode — one of rate_limit or budget.
  • limitValue — positive number.
  • windowPolicy — one of minute, hour, day, week, month, quarter, year, custom, or lifetime. When windowPolicy is custom, customWindowSeconds is 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 to true.

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:

json
{
  "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)