Management APIs
Management and Deployment API documentation for api.spice.ai
The Spice.ai Management API (also known as the control-plane API) provides programmatic access to manage Spice.ai Cloud resources—projects, deployments, secrets, API keys, and organization members.
Base URL
https://api.spice.aiAPI Version
All API endpoints are versioned under /v1:
https://api.spice.ai/v1Projects and apps
What the API and portal now call a project was previously called an app. The resource is unchanged — only the name is different.
Both path prefixes reach the same handlers:
/v1/projects
Canonical
{ "projects": [...] }
/v1/apps
Legacy, still served
{ "apps": [...] }
Two details matter when migrating:
The list envelope differs.
GET /v1/projectsreturns results under aprojectskey, whileGET /v1/appskeeps its originalappskey. A client switching to the canonical path must read the new key. All other response shapes and field names are identical, including theidandnamefields on each resource.OAuth scope names are unchanged. The scopes are still
apps:read,apps:write, andapps:delete, because they are embedded in already-issued tokens. They grant access to projects under either path.
The Spice CLI, Terraform provider, and SDKs continue to call the legacy paths and are unaffected.
Authentication
The Management API supports three authentication methods:
1. Personal Access Tokens (PATs)
PATs are long-lived, user-scoped tokens. Recommended for:
CLI tools and automation scripts
Personal integrations
Creating a PAT:
Sign in to Spice.ai Cloud Portal
Navigate to Profile → Personal Access Tokens
Click Create Token
Select an organization and configure scopes
Copy the token (it won't be shown again)
Using a PAT:
Learn more: Personal Access Tokens
2. OAuth 2.0 Client Credentials
OAuth client credentials are organization-scoped tokens. Ideal for:
CI/CD pipelines
Service-to-service authentication
Multi-tenant applications
Third-party integrations
Step 1 — Exchange client credentials for an access token:
The response contains an access_token:
Step 2 — Use the access token in subsequent requests:
3. User Session Tokens (CLI)
The Spice CLI stores a credential for the Management API with spice login. On a terminal it asks which one to use:
Login with a web browser signs in through the browser and stores the resulting user session token, which carries the user's identity. Paste an access token stores a personal access token instead.
The prompt appears only when the CLI is attached to a terminal. Scripts and CI pipelines name the method as a subcommand, which also lets them supply the credential without being prompted for it:
spice login subscription
User session token
--device prints the URL and a one-time code to enter on another device instead of opening a browser, for SSH and headless shells
spice login token
Personal access token
--token, or the SPICE_CLOUD_PAT environment variable
spice login api
OAuth client credentials
--client-id and --client-secret, or SPICE_CLOUD_CLIENT_ID and SPICE_CLOUD_CLIENT_SECRET
Run with no terminal and no subcommand, spice login reports that the login type must be chosen explicitly rather than waiting on a prompt that cannot be answered.
Organization context
Every Management API request acts on exactly one organization. By default that is the organization the credential was minted against. Send the X-Org-Name header with an organization handle to act on a different one.
Personal access token or CLI session
Any organization the token owner belongs to
OAuth client credentials
Only the organization the client was issued to
A user credential carries a user identity, so the API authorizes the request against that user's membership. A machine credential carries no user identity and stays pinned to one organization: a header naming a different organization is refused rather than ignored.
Handles are matched case-insensitively and may contain letters, numbers, dots, hyphens, and underscores.
Discovering organizations
GET /v1/orgs lists the organizations the caller belongs to, with the caller's role in each. Use it to choose a value for X-Org-Name.
nameis the organization handle — the valueX-Org-Nameaccepts, and the one used in<org>/<project>addressing.roleis the caller's highest-privilege role in that organization:owner,admin,member, orviewer.A caller who belongs to no organization receives
200with an emptyorgsarray, never a404.An OAuth client credential lists only the organization it was issued to, with the role
owner.Requires the
apps:readscope.
Refused requests
A refusal returns a machine-readable code alongside error, because each one has a different remedy:
org_forbidden
403
The named organization does not exist or is not visible to the caller
Verify the handle; if it is correct, ask an organization owner for an invitation
forbidden
403
The caller is a member but lacks the role the action needs
Ask an owner or admin for a higher role
insufficient_scope
403
The credential was not granted the required scope
Reissue the credential with the scope
org_assertion_mismatch
403
A machine credential named an organization other than its own
Use a credential issued for that organization
invalid_org_assertion
400
The header value is not a valid organization handle
Correct the handle
Two details are easy to miss:
A blank
X-Org-Nameis an error, not an omission. It returnsinvalid_org_assertion, because a client that sent the header believes it named an organization.An organization that does not exist and one the caller cannot see both return
org_forbidden. The header cannot be used to test whether an organization exists.
OAuth Scopes
Access to API resources is controlled through scopes. PATs and OAuth clients must be granted appropriate scopes:
*
Full access to all resources (not recommended for production)
apps:read
Read project information
apps:write
Create and update projects
apps:delete
Delete projects
deployments:read
View deployment status and history
deployments:write
Create new deployments
secrets:read
List and view secrets (values are masked)
secrets:write
Create, update, and delete secrets
config:read
Read project configuration
config:write
Update project configuration
members:read
View organization members
members:write
Add and update organization members
members:delete
Remove organization members
Scope hierarchy:
A write scope automatically includes its corresponding read scope (e.g.
apps:writeimpliesapps:read).The wildcard scope (
*) grants all permissions.The
apps:*scope names are unchanged by the projects rename, and apply to projects.
Rate Limiting
Requests are rate-limited per project. These limits are a high-level failsafe; actual throughput depends on the size of your deployed Spice instance or cluster.
Per-Project Request Rate Limits
Community
100
Developer
1,000
Pro Teams
10,000
Enterprise
100,000
Concurrent Query Limits
These limits apply to SQL queries executed against your Spice runtime, not to management API calls.
Developer
16
90 seconds
Pro Teams
64
5 minutes
Enterprise
1,024
30 minutes
Error Responses
The API uses standard HTTP status codes:
200 OK
Request succeeded
201 Created
Resource created successfully
202 Accepted
Request accepted (async operation)
204 No Content
Request succeeded with no response body
400 Bad Request
Invalid request body or parameters
401 Unauthorized
Missing or invalid authentication
403 Forbidden
Insufficient scope or permissions
404 Not Found
Resource not found
409 Conflict
Resource already exists or conflict
429 Too Many Requests
Rate limit exceeded
500 Internal Server Error
Server error
Error Response Format:
Authorization failures also carry a machine-readable code, so a client can tell the refusals apart instead of guessing:
See Refused requests for the codes and their remedies.
Pagination
List endpoints support cursor-based pagination with the following query parameters:
limit
integer
20
Maximum number of items to return (max: 100)
offset
integer
0
Number of items to skip
OpenAPI Specification
The API publishes its own OpenAPI specification, which describes every endpoint and the headers it accepts:
The same document is also served at https://api.spice.ai/v1/docs and https://api.spice.ai/v1/docs/openapi.json.
SDK Support
Official SDKs are available for popular languages:
Endpoints
Health - API health check
Regions - List available deployment regions
Projects - Manage Spice projects
Deployments - Deploy and manage project deployments
Secrets - Manage project secrets
API Keys - Manage project API keys
Members - Manage organization members
Organizations - List the organizations the caller belongs to
Metrics - Scrape per-project runtime metrics
Container Images - List available runtime versions
Terraform Provider
Manage Spice.ai resources as infrastructure-as-code with the Spice.ai Terraform Provider. See the Terraform Provider page for resources, data sources, import instructions, and complete examples.
Examples
List all projects
Results are returned under a projects key. The legacy GET /v1/apps path returns the same records under an apps key.
Create a new project
Organizations with a dedicated cluster can pass cluster_name in place of region to create the project on their dedicated infrastructure.
Create a deployment
Add a secret
Support
Have questions or running into issues?
Last updated
Was this helpful?