API reference

The Volcano REST API lets you manage projects, deploy functions and frontends, provision databases, and handle user authentication.

The Volcano REST API lets you manage projects, deploy functions and frontends, provision databases, and handle user authentication.

Base URL

https://api.volcano.dev

For local development:

http://localhost:8000

Authentication

All API requests require authentication. Include your token in the Authorization header:

curl "https://api.volcano.dev/projects" \
  -H "Authorization: Bearer $PLATFORM_TOKEN"

Different endpoints require different token types:

Token typeUse forWhere it comes from
Platform token (pk-)Managing every project in your accountvolcano login, or the dashboard
Project access token (pt-)Managing a single project from CI, a script, or an agentPOST /projects/{id}/access-tokens
Anon keyUser authentication (signup, signin, refresh)Created with the project
Auth user access tokenActing as one of your end users: their profile, invoking functions as themSignup/signin response
Service keyAdmin operations, invoking functions, bypassing RLSPOST /projects/{id}/service-keys

See Authentication for details on each token type, and Using the API for a worked example from first token to first deploy.

A machine-readable description of everything below is available at https://api.volcano.dev/openapi.yaml — see OpenAPI specification for generating a client or importing the API into a REST client.

Request format

Send JSON data in request bodies:

curl -X POST "https://api.volcano.dev/projects" \
  -H "Authorization: Bearer $PLATFORM_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-project"}'

For file uploads (function deployment), use multipart/form-data:

curl -X POST "https://api.volcano.dev/projects/$PROJECT_ID/functions" \
  -H "Authorization: Bearer $PLATFORM_TOKEN" \
  -F "name=hello" \
  -F "runtime=nodejs24.x" \
  -F "handler=handler" \
  -F "code=@function.zip"

Response format

Success responses

Single resource:

{
  "id": "proj_abc123",
  "name": "my-project",
  "status": "active",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z"
}

Paginated list:

{
  "data": [
    { "id": "proj_abc123", "name": "project-1" },
    { "id": "proj_def456", "name": "project-2" }
  ],
  "page": 1,
  "limit": 10,
  "total": 25,
  "has_more": true,
  "next": "/projects?page=2&limit=10"
}

Error responses

{
  "error": "project not found"
}

HTTP status codes

CodeDescription
200Success
201Resource created
204Success with no response body
400Bad request — invalid parameters
401Unauthorized — missing or invalid token
403Forbidden — valid token but insufficient permissions
404Not found — resource doesn't exist
409Conflict — duplicate resource or incompatible resource state
429Too many requests — rate limited
500Internal server error
503Service unavailable — a required backend is unavailable

Pagination

List endpoints support pagination with page and limit parameters:

curl "https://api.volcano.dev/projects?page=2&limit=20" \
  -H "Authorization: Bearer $PLATFORM_TOKEN"
ParameterDefaultMaximumDescription
page1—Page number (1-indexed)
limit10100Items per page

The response includes pagination metadata:

{
  "data": [...],
  "page": 2,
  "limit": 20,
  "total": 45,
  "has_more": true,
  "next": "/projects?page=3&limit=20"
}

Rate limiting

The user authentication endpoints are rate limited per project and client IP, in hourly windows you configure per project. They report the quota on every response:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 73

Over the limit they return 429:

HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1704128400

X-RateLimit-Reset is a Unix timestamp for the end of the window. /auth/signup, /auth/forgot-password, /auth/reset-password, and /auth/user/change-email send it on a 429; /auth/signin and /auth/refresh do not.

No other endpoint sends these headers. Project management endpoints are not rate limited, so a request with a valid token is never refused for its rate. Project locks and function invocation have their own limits and return 429 without these headers.

One case does return 429 without a quota header: repeatedly presenting credentials that are not recognized. Each unrecognized value has to be checked, so a client working through many of them is rationed per source. Retry with a credential that works, or check the token still exists — a valid token is answered from cache and never counts against this.

Every response says which build and region answered:

X-Volcano-Version: <version>                  # production
X-Volcano-Version: <env>-<version>            # non-production (e.g. staging-xyz)
X-Volcano-Region: us-east-1                   # the region that served the request

Volcano's internal headers are never returned.

Capabilities

Some capabilities are not available in every environment. Check which ones accept new work before offering them:

curl "https://api.volcano.dev/capabilities"
{
  "data": [
    { "id": "sandboxes", "status": "available" },
    { "id": "sandboxes.sessions", "status": "available" },
    { "id": "sandboxes.custom_templates", "status": "unavailable" },
    { "id": "issues", "status": "available" },
    { "id": "lavaflow", "status": "unavailable" },
    { "id": "lavaflow.merge", "status": "unavailable" },
    { "id": "functions.response_streaming", "status": "available" },
    { "id": "frontend_routes", "status": "available" },
    { "id": "frontends.candidates", "status": "unavailable" },
    { "id": "databases.migrations", "status": "available" }
  ]
}
IDCovers
sandboxesThe Sandbox API: presets, templates, sessions, and executions
sandboxes.sessionsStarting and resuming sessions, and one-shot executions
sandboxes.custom_templatesDeploying a custom template; its validation waits while sandboxes.sessions is unavailable
issuesThe Issues API: listing, reading, and updating grouped runtime errors
lavaflowLavaFlow, which diagnoses a project's issues, opens pull requests that fix them, and can merge them. This list says only whether it's released in the environment; a project's list says whether that project has it
lavaflow.mergeLetting LavaFlow merge its fixes: autonomy: merge and changing merge_policy; reading merges works either way
functions.response_streamingStreaming a response on a function's own URL
frontend_routesCreating and changing Frontend routes; listing, deleting, and serving existing ones work either way
frontends.candidatesCreating, deploying to, promoting and rolling back to frontend previews; listing, reading and deleting them, and rolling back to the frontend's own build, work either way
databases.migrationsStarting migration runs, recording a baseline, and turning on apply_migrations for Git deploy; reading history and runs works either way

The endpoint needs no token, and every caller in an environment gets the same answer. While a capability is unavailable, requests that start new work answer 404, or 400 for a single field or option, with code feature_unavailable:

{ "error": "sandboxes are not available", "code": "feature_unavailable" }

Reading, deleting, and terminating what already exists keep working unless the whole feature is absent from the environment. Treat a missing capability or an unknown status as unavailable, and refresh the list when a route answers feature_unavailable. A capability under another, such as sandboxes.sessions, is unavailable whenever its parent is. A 503 is a temporary outage, not an unavailable capability; retry it.

Capabilities for one project

Some capabilities are offered to some projects and not others. A project's list has the same entries, and answers those per project:

curl "https://api.volcano.dev/projects/$PROJECT_ID/capabilities" \
  -H "Authorization: Bearer $PLATFORM_TOKEN"
{
  "data": [
    { "id": "sandboxes", "status": "available" },
    { "id": "issues", "status": "available" },
    { "id": "lavaflow", "status": "available" }
  ]
}

The response is shortened here; it lists every capability.

lavaflow is available there when LavaFlow is released, offered to the project's owner, and included in the owner's plan. Where it isn't, the entry says what the project can still do:

EntryMeaning
{ "id": "lavaflow", "status": "read_only" }The project has LavaFlow settings or runs. Its LavaFlow reads answer and LavaFlow can be turned off; anything else is refused
{ "id": "lavaflow", "status": "unavailable", "code": "plan_required" }The owner's plan doesn't include LavaFlow. LavaFlow routes answer 403 with code plan_required
{ "id": "lavaflow", "status": "unavailable" }LavaFlow isn't offered to the project. LavaFlow routes answer 404 with code feature_unavailable, or 403 without a code while the owner's plan can't be read; retry those

lavaflow.merge is available when lavaflow is and LavaFlow may merge fixes in the environment. read_only appears only in a project's list, and has no code. On an unavailable entry, a code names the error code its refused requests answer with; treat an unknown code as absent. Every other entry matches GET /capabilities. Any project credential can read it, including a read-only project access token.

functions.response_streaming refuses nothing. While it is unavailable, a function's own URL sends a streamed response whole, once the function finishes. A response sent whole is limited to 6 MiB, headers included; a larger one fails the invocation.

CLI version gating

A CLI reports its version via the X-Volcano-CLI-Version request header. The API can reply with these instructions:

  • X-Volcano-CLI-Instruction: suggestion_version_upgrade, require_version_upgrade, low_credit_warning, or not_enough_credit.
  • X-Volcano-Credit-URL: the billing page address sent with a credit instruction.
  • X-Volcano-Device-Instruction: reauth.

Deprecated CLI versions are blocked with 426 Upgrade Required. Credit instructions explain the account state but do not block a request. Requests without the version header are unaffected. See CLI Version Gating.

API endpoints

Projects

MethodEndpointDescription
POST/projectsCreate a project
GET/projectsList projects
GET/projects/{id}Get a project
GET/deploymentsList deployments across every project you own
GET/projects/{id}/deploymentsList a project's function and frontend deployments; filter with resource_type and function_kind
GET/projects/{id}/deployments/summarySummarize one deployment pipeline (resource_type, optionally function_kind)
GET/projects/{id}/git-deployment-runsList the runs Git pushes started; filter with status and branch
GET/projects/{id}/git-deployment-runs/{runId}Get one Git deployment run
PATCH/projects/{id}Update project name/region policy
DELETE/projects/{id}Delete a project

See Projects for details, and Git deploy for deployment runs.

Functions

MethodEndpointDescription
POST/projects/{id}/functionsDeploy a function
GET/projects/{id}/functionsList functions
GET/projects/{id}/functions/{functionId}Get a function
PATCH/projects/{id}/functions/{functionId}Update function settings (visibility)
DELETE/projects/{id}/functions/{functionId}Delete a function
POST/functions/{functionId}/invokeInvoke a function
GET/functions/resolveResolve function name to function ID
GET/functions/runtimesList supported runtimes and their display labels
POST/projects/{id}/logs/searchSearch and filter function runtime logs
GET/projects/{id}/functions/{functionId}/deploymentsList function deployments

See Functions for details.

Durable functions

MethodEndpointDescription
POST/projects/{id}/durable-functionsDeploy a durable function
GET/projects/{id}/durable-functionsList durable functions
GET/projects/{id}/durable-functions/{functionId}Get a durable function
DELETE/projects/{id}/durable-functions/{functionId}Delete a durable function
GET/projects/{id}/durable-functions/{functionId}/deploymentsList durable function deployments
POST/durable-functions/{functionId}/executionsStart an execution with an application credential
GET/durable-functions/{functionId}/executions/{executionId}Get an execution with an application credential
POST/durable-functions/{functionId}/executions/{executionId}/stopStop an execution with an application credential
POST/projects/{id}/durable-functions/{functionId}/executionsStart an execution as the project owner
GET/projects/{id}/durable-functions/{functionId}/executionsList executions
GET/projects/{id}/durable-functions/{functionId}/executions/{executionId}Get an execution
GET/projects/{id}/durable-functions/{functionId}/executions/{executionId}/operationsList an execution's operations
POST/projects/{id}/durable-functions/{functionId}/executions/{executionId}/stopStop an execution
GET/projects/{id}/durable-functions/{functionId}/schedulersList schedules
POST/projects/{id}/durable-functions/{functionId}/schedulersCreate a schedule
GET/projects/{id}/durable-functions/{functionId}/schedulers/{schedulerId}Get a schedule
PATCH/projects/{id}/durable-functions/{functionId}/schedulers/{schedulerId}Update a schedule
DELETE/projects/{id}/durable-functions/{functionId}/schedulers/{schedulerId}Delete a schedule
GET/projects/{id}/schedulers?function_kind=durableList every durable function's schedules in the project
GET/projects/{id}/deployments?function_kind=durableList every durable function's deployments in the project
GET/projects/{id}/durable-approvalsList approvals workflows requested
GET/projects/{id}/durable-approvals/statsCount approvals by outcome, workflow, and day
GET/projects/{id}/durable-approvals/{approvalId}Get an approval
POST/projects/{id}/durable-approvals/{approvalId}/approveApprove a pending approval; a person only
POST/projects/{id}/durable-approvals/{approvalId}/denyDeny a pending approval; a person only
POST/durable-approvalsRegister an approval request; called by the SDK from inside a workflow, not by applications
POST/durable-callbacksGet a callback token; called by the SDK from inside a workflow, not by applications
POST/durable-callbacks/succeedComplete a waiting step with a result; the callback token is the only credential
POST/durable-callbacks/failFail a waiting step with an error; the callback token is the only credential
POST/durable-callbacks/heartbeatReport that the work behind a callback token is still going on

Durable functions are a separate collection: a standard function's id is 404 here, and a durable function's id is 404 under /projects/{id}/functions. See Durable functions for details, Durable approvals for the approval endpoints, and Durable callbacks for the callback endpoints.

Issues

MethodEndpointDescription
GET/projects/{id}/issuesList runtime errors grouped into issues; filter with status and resource_id
GET/projects/{id}/issues/{issueId}Get an issue
PATCH/projects/{id}/issues/{issueId}Resolve, ignore, or reopen an issue

Issues are in preview. See Issues.

LavaFlow

MethodEndpointDescription
GET/lavaflow/settingsGet a project's LavaFlow settings
PUT/lavaflow/settingsChange a project's LavaFlow settings; the owner only
GET/lavaflow/statsCount issues LavaFlow took on and pull requests it opened
GET/lavaflow/resourcesList each resource's LavaFlow activity and anomalies
GET/lavaflow/runsList LavaFlow runs; filter with status and resource_id
GET/lavaflow/runs/{run_id}Get a run with its diagnosis, diff, review, and pull request

Each endpoint names one project with project_id: a query parameter on reads, a body field on PUT. LavaFlow is in preview and needs the SUPERAGENT plan. See LavaFlow.

Notifications

MethodEndpointDescription
GET/projects/{id}/notificationsGet where a project's alerts go
PUT/projects/{id}/notificationsTurn email on or off, change the webhook, and choose when a failing scheduler alerts
POST/projects/{id}/notifications/webhook-secretRotate the webhook signing secret
POST/projects/{id}/notifications/testSend a test notification on every configured channel

See Notifications API and Notifications.

Frontends

MethodEndpointDescription
POST/projects/{id}/frontendsDeploy a frontend archive (subject to plan deployment limits)
GET/projects/{id}/frontendsList frontends
GET/projects/{id}/frontends/{frontendId}Get a frontend
POST/projects/{id}/frontends/{frontendId}/redeployRedeploy latest frontend artifact
DELETE/projects/{id}/frontends/{frontendId}Delete/deprovision a frontend
GET/projects/{id}/frontends/{frontendId}/deploymentsList frontend deployments
GET/projects/{id}/frontends/{frontendId}/function-routesList a frontend's Function routes
POST/projects/{id}/frontends/{frontendId}/function-routesRoute a frontend path to a public HTTP function
PUT/projects/{id}/frontends/{frontendId}/function-routes/{routeId}Replace a Function route
DELETE/projects/{id}/frontends/{frontendId}/function-routes/{routeId}Delete a Function route
GET/projects/{id}/frontends/{frontendId}/frontend-routesList a frontend's Frontend routes
POST/projects/{id}/frontends/{frontendId}/frontend-routesServe another frontend under a path
PUT/projects/{id}/frontends/{frontendId}/frontend-routes/{routeId}Replace a Frontend route
DELETE/projects/{id}/frontends/{frontendId}/frontend-routes/{routeId}Delete a Frontend route
POST/projects/{id}/logs/searchSearch and filter frontend runtime and deployment logs

See Frontend Endpoints for details.

Databases

MethodEndpointDescription
POST/projects/{id}/databasesCreate a database
GET/projects/{id}/databasesList databases
GET/projects/{id}/databases/{databaseName}Get a database
DELETE/projects/{id}/databases/{databaseName}Delete a database
GET/projects/{id}/databases/{databaseName}/queriesGet top query performance from pg_stat_statements
GET/databases/regionsList available regions
GET/databases/versionsList PostgreSQL versions

See Databases for details.

Project locks

MethodEndpointDescription
POST/locks/{key}/leaseAcquire a project lease
PATCH/locks/{key}/leaseRenew the owned lease
DELETE/locks/{key}/leaseRelease the owned lease

These endpoints accept service-role keys only. See Project locks.

Authentication

MethodEndpointDescription
POST/auth/signupCreate a new user
POST/auth/signinSign in a user
POST/auth/refreshRefresh access token
POST/auth/logoutSign out a user
GET/auth/userGet current user
PUT/auth/userUpdate current user
POST/auth/forgot-passwordRequest password reset
POST/auth/reset-passwordReset password with token

See Auth endpoints for details.

Service keys

MethodEndpointDescription
POST/projects/{id}/service-keysCreate a service key
GET/projects/{id}/service-keysList service keys
DELETE/projects/{id}/service-keys/{keyId}Delete a service key

Anon keys

MethodEndpointDescription
POST/projects/{id}/anon-keysCreate an anon key
GET/projects/{id}/anon-keysList anon keys
DELETE/projects/{id}/anon-keys/{keyId}Delete an anon key

Project access tokens

MethodEndpointDescription
POST/projects/{id}/access-tokensCreate a token and return its secret, once
GET/projects/{id}/access-tokensList tokens (page, limit, search, include_revoked)
GET/projects/{id}/access-tokens/{tokenId}Get one token's metadata
DELETE/projects/{id}/access-tokens/{tokenId}Revoke a token
GET/projects/{id}/access-tokens/usageDaily request counts for every token in the project
GET/projects/{id}/access-tokens/{tokenId}/usageDaily request counts for one token

Creating, listing, reading, and revoking require a platform token: a project access token cannot manage project access tokens. The usage endpoints are ordinary project reads. See Project access tokens.

MCP

MethodEndpointDescription
POST/mcpModel Context Protocol endpoint for AI agents

This endpoint takes its project from the credential, so it accepts a project access token only. See MCP server.

What's next

ReferenceDescription
Using the APICreate a token, deploy, and read logs over HTTP
AuthenticationToken types and auth headers
ProjectsProject management API
FunctionsFunction deployment and invocation
DatabasesDatabase provisioning
Auth endpointsUser authentication API
MCP serverGive an AI agent a scoped tool surface over one project
ErrorsError codes and handling
OpenAPI specificationGenerate a client from the machine-readable contract

On this page