Helm7

REST API reference

All 66 endpoints. This page renders the operation catalogue directly: the same definitions that build the router, the MCP tool list, the OpenAPI document and llms.txt. Nothing here is transcribed, so nothing here can go stale while the API moves on.

The parts that never change

Base URL
https://www.helm7.com
Authentication
Authorization: Bearer hlm_sk_.... A key resolves to a member and can never exceed what that member can do. Call whoami first and you will know your ceiling.
OpenAPI
https://www.helm7.com/v1/openapi.json
Pagination
List endpoints take cursor and limit, and return next_cursor, which is null on the last page.

A first call

curl -s https://www.helm7.com/v1/whoami \
-H "Authorization: Bearer $HELM7_API_KEY"
Every failure has this shape
{
  "error": {
    "code": "confirmation_required",
    "message": "This would destroy the primary database.",
    "remedy": "Re-send with confirm: true, or restore into a new database instead.",
    "request_id": "req_8ac31f2e"
  }
}

Codes are stable. Branch on code, never on message. A remedy is present whenever one exists.

Plans, confirmation and idempotency

36

endpoints take dry_run

Returns the changes, the monthly cost band, the largest driver by name and anything irreversible. Applies nothing, costs nothing.

11

endpoints need confirm

Without it they return the same plan a dry run would and refuse with confirmation_required. A caller that always plans first never meets a surprise.

1

field prevents double-spending

idempotency_key. Replaying it returns the original result instead of acting twice. Send one on anything that creates a resource or spends money.

Scopes

Reads and writes live in separate namespaces on purpose. A role that synthesises a wildcard for reads cannot, then, accidentally hand someone a write wildcard the day writes ship. Granting read access can never grant the ability to spend money or drop a database.

Read

  • product:read
  • deployment:read
  • database:read
  • domain:read
  • secret:read
  • test_account:read
  • billing:read
  • context:read

Write

  • product:write
  • product:delete
  • deployment:write
  • database:write
  • database:delete
  • domain:write
  • secret:write
  • test_account:write
  • test_account:use
  • billing:manage
  • context:write
  • agent:manage
  • member:manage

Every endpoint

All Helm7 REST endpoints
OperationMethodPathDoes what
whoamiGET/v1/whoamiIdentify the calling credential
product_listGET/v1/productsList Products
product_createPOST/v1/productsCreate a Product
product_getGET/v1/products/:productIdInspect a Product
product_updatePATCH/v1/products/:productIdRename a Product
product_deleteDELETE/v1/products/:productIdDelete a Product and everything in it
environment_listGET/v1/products/:productId/environmentsList environments
environment_createPOST/v1/products/:productId/environmentsCreate an environment
environment_deleteDELETE/v1/products/:productId/environments/:environmentDelete an environment and everything in it
service_createPOST/v1/products/:productId/servicesCreate a service
service_logsGET/v1/products/:productId/services/:serviceId/logsRead runtime logs
service_listGET/v1/products/:productId/servicesList services
service_updatePATCH/v1/products/:productId/services/:serviceIdChange how a service runs
service_deleteDELETE/v1/products/:productId/services/:serviceIdDelete a service
deployPOST/v1/products/:productId/deploymentsBuild and deploy
deployment_getGET/v1/products/:productId/deployments/:deploymentIdInspect a deployment
deployment_listGET/v1/products/:productId/deploymentsList deployments
deployment_rollbackPOST/v1/products/:productId/deployments/:deploymentId/rollbackRoll back to a previous deployment
build_queue_getGET/v1/build-queueWhere your builds are in the queue
build_queue_reorderPOST/v1/build-queue/orderReorder your waiting builds
deployment_image_uploadPOST/v1/products/:productId/deployments/:deploymentId/imageUpload a locally built image
deployment_image_finishPOST/v1/products/:productId/deployments/:deploymentId/image/finishDeploy a locally built image
database_createPOST/v1/products/:productId/databasesProvision Postgres
database_getGET/v1/products/:productId/databases/:databaseIdInspect a database
database_backupPOST/v1/products/:productId/databases/:databaseId/backupsTake a backup now
database_restorePOST/v1/products/:productId/databases/:databaseId/restoreRestore to a point in time
database_queryPOST/v1/products/:productId/databases/:databaseId/queryRead rows with SQL
database_executePOST/v1/products/:productId/databases/:databaseId/executeChange data or schema with SQL
auth_enablePOST/v1/products/:productId/authEnable managed auth
auth_getGET/v1/products/:productId/authInspect managed auth
auth_updatePATCH/v1/products/:productId/authConfigure managed auth
auth_users_importPOST/v1/products/:productId/auth/users/importImport users into managed auth
storage_create_bucketPOST/v1/products/:productId/storage/bucketsCreate a storage bucket
bucket_listGET/v1/products/:productId/storage/bucketsList storage buckets
bucket_deleteDELETE/v1/products/:productId/storage/buckets/:bucketIdDelete a storage bucket and every object in it
domain_attachPOST/v1/products/:productId/domainsAttach a custom domain
domain_listGET/v1/products/:productId/domainsList domains
domain_removeDELETE/v1/products/:productId/domains/:domainIdRemove a domain
secret_setPOST/v1/products/:productId/secretsSet an environment variable
secret_listGET/v1/products/:productId/secretsList secret names
secret_deleteDELETE/v1/products/:productId/secrets/:keyRemove an environment variable
test_account_createPOST/v1/products/:productId/test-accountsCreate a test account
test_account_listGET/v1/products/:productId/test-accountsList test accounts
test_account_getGET/v1/products/:productId/test-accounts/:accountIdInspect a test account
test_account_rotatePOST/v1/products/:productId/test-accounts/:accountId/rotateRotate a test account password
test_account_deleteDELETE/v1/products/:productId/test-accounts/:accountIdDelete a test account
test_account_checkoutPOST/v1/products/:productId/test-accounts/:accountId/checkoutCheck out a test account to sign in with
test_account_totpPOST/v1/products/:productId/test-accounts/:accountId/totpGet the current two-factor code
context_enablePOST/v1/products/:productId/contextGive the Product memory
usage_getGET/v1/usageCurrent usage and spend
cost_estimatePOST/v1/cost/estimatePrice a hypothetical shape
billing_checkout_createPOST/v1/billing/checkoutStart a Stripe Checkout session
billing_portal_createPOST/v1/billing/portalOpen the billing portal
agent_key_createPOST/v1/agent-keysMint a scoped agent credential
agent_key_revokeDELETE/v1/agent-keys/:keyIdRevoke an agent credential
agent_key_listGET/v1/agent-keysList keys
github_repo_listGET/v1/github/repositoriesList repositories Helm7 can deploy from GitHub
product_connect_repoPOST/v1/products/:productId/githubDeploy a Product from a GitHub repository on every push
organization_getGET/v1/organizationRead the workspace
organization_updatePATCH/v1/organizationChange workspace settings
activity_listGET/v1/activityWhat has been done, and by whom
member_listGET/v1/membersList the people in the workspace
invite_createPOST/v1/invitesInvite someone by link
member_removeDELETE/v1/members/:memberIdRemove someone from the workspace, or cancel an invitation
cloud_initPOST/v1/cloud/initStart an ephemeral workspace with no account
cloud_claimPOST/v1/cloud/claimKeep an ephemeral workspace

Identity

Who a credential speaks as, and what it is allowed to do.


GET

/v1/whoami

whoami

Returns the organisation, the member this key speaks as, its scopes, its capability flags, and, for an agent key, its budget and expiry. Call this first: a key resolves to a member and cannot exceed what that member can do, so this tells you your real ceiling before you plan anything.

Scopes
product:read
Returns
The calling identity and its limits.

Products

The unit. One Product is one application and everything it needs.


GET

/v1/products

product_list

Every Product in the organisation this key belongs to, newest first. Returns a summary per Product (id, name, region, environments and health), not the full graph; call product_get for that. A key confined to a single Product sees only that one.

Inputs for product_list
FieldInTypeNotes
cursorquerystringOpaque cursor from a previous response. Omit for the first page.
limitqueryintegerMaximum items to return.default 25
Scopes
product:read
Returns
A JSON object.
POST

/v1/products

product_create

  • Dry-runnable

A Product is the unit everything else hangs from: environments, services, databases, auth, storage, domains, secrets and context. Creating one provisions nothing billable on its own: it is the empty graph. Pass external_ref to make this idempotent against your own identifiers.

Inputs for product_create
FieldInTypeNotes
namerequiredbodystringHuman-readable. Shown in the dashboard and used to derive the default subdomain.
regionbodyeu-central | eu-northWhere the Product runs. eu-central is Falkenstein, eu-north is Helsinki. Additional regions are not yet offered; do not assume a US region exists.default "eu-central"
external_refbodystringYour own stable id for this Product. Creating twice with the same value returns the existing Product rather than a second one.
repobodystringOptional git URL. When given, Helm7 inspects it and proposes a service and resource shape you can apply.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId

product_get

The whole resource graph for one Product: environments, services, databases, domains, secrets (names only, never values), context linkage and current health. This is the single call to make before reasoning about a Product.

Inputs for product_get
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
Scopes
product:read
Returns
The Product and its full resource graph.
PATCH

/v1/products/:productId

product_update

  • Dry-runnable

Changes the name a Product is shown under: the dashboard, the sender name on its auth emails and the activity trail. Addresses do not change. Its helm7.app hostnames, image names and ids stay exactly as they were, so nothing already deployed or pointed at it moves. A Contextely product created by context_enable keeps the name it was given then.

Inputs for product_update
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
namerequiredbodystringThe new name. Up to 64 characters.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/products/:productId

product_delete

  • Needs confirm: true
  • Dry-runnable

Destroys every environment, service, database, bucket and domain binding under the Product. Databases are backed up first and the backup is retained for 7 days, but the running resources are gone. Requires confirm: true; without it you get the plan and nothing happens.

Inputs for product_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:delete
Returns
What would happen, what it would cost, and what could not be undone.

Environments

Production, preview and development inside a Product.


GET

/v1/products/:productId/environments

environment_list

Environments in a Product, each with a summary of the services, databases and domains bound to it. Every Product has production; preview and development exist only if created. Use this to find an environment name before calling anything scoped to one.

Inputs for environment_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
Scopes
product:read
Returns
A JSON object.
POST

/v1/products/:productId/environments

environment_create

  • Dry-runnable
  • Changes your bill

Adds preview or development alongside production. A new environment starts empty; it does not copy production data. Use database_branch for that, when you want a copy.

Inputs for environment_create
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
namerequiredbodyproduction | preview | developmentEnvironment within a Product. Every Product has production; preview and development are optional.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/products/:productId/environments/:environment

environment_delete

  • Needs confirm: true
  • Dry-runnable

Stops every service in a preview or development environment and removes its databases, buckets, domains and variables. Production cannot be deleted this way; delete the Product instead. Requires confirm: true.

Inputs for environment_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentrequiredpathstringpreview, development or a pull request preview (pr-<number>). Production is refused.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:delete
Returns
What would happen, what it would cost, and what could not be undone.

Services

Web, worker and cron processes.


POST

/v1/products/:productId/services

service_create

  • Dry-runnable
  • Changes your bill
  • Needs may_deploy

Adds a web, worker or cron service. Helm7 detects the framework from the repo and picks a build; you only need to override when detection is wrong. A service has no execution time limit, so long jobs do not need splitting.

Inputs for service_create
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
namerequiredbodystring
kindrequiredbodyweb | worker | cronweb receives HTTP traffic and can hold a domain. worker runs continuously with no ingress. cron runs on a schedule and exits.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
repobodystringGit URL. Required unless image is given.
branchbodystringdefault "main"
root_directorybodystringSubdirectory to build from, for monorepos.
build_only_on_changesbodybooleanWith root_directory: skip a push-triggered build when the push changed nothing under it. See service_update.default false
imagebodystringContainer image reference, as an alternative to building from a repo.
schedulebodystringCron expression. Required when kind is cron, ignored otherwise.
public_portsbodyobject[]Web or worker. Raw TCP to publish, alongside any HTTP a web service serves, on the platform's public address, for protocols the HTTP ingress cannot carry, such as SMTP submission. Only ports 465 and 587 are offered. The process listens on container_port (1024 or above) and clients connect to port. A deploy of a service with public ports stops the old run first, because a host port has one owner, so expect a few seconds of refused connections.
pathbodystringCron only. A path on one of your web services, such as /api/cron/digest. The cron then calls it on the schedule instead of running a container: no repo or image, nothing to build. The call is made from inside that service, so it does not cross the public internet or time out at 100 seconds, and it carries Authorization: Bearer $CRON_SECRET (created for the environment if it has none).
methodbodyGET | POSTCron with a path only.default "GET"
targetbodystringCron with a path only. The name of the web service to call. Defaults to the only web service, or the one called web.
instancebodyshared-0.25 | shared-0.5 | standard-1 | standard-2vCPU allocation. shared tiers sleep when idle and wake on request in a few seconds; standard tiers stay running.default "shared-0.25"
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write, deployment:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/services/:serviceId/logs

service_logs

Recent stdout and stderr for a service. Secrets are redacted on a best-effort basis before the logs leave the platform; treat redaction as a safety net, not a guarantee.

Inputs for service_logs
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
serviceIdrequiredpathstring
sincequerystring
limitqueryintegerMaximum items to return.default 25
Scopes
deployment:read
Returns
A JSON object.
GET

/v1/products/:productId/services

service_list

Every service in a Product with its kind, instance size, whether it sleeps, its status, the deployment it is running and the address it answers on. Filter by environment. Use this to find a service id before reading its logs or changing it.

Inputs for service_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
Scopes
product:read
Returns
A JSON object.
PATCH

/v1/products/:productId/services/:serviceId

service_update

  • Dry-runnable
  • Changes your bill

Changes the instance size, the branch or directory it builds from, whether pushes that miss that directory skip the build, the image, the schedule of a cron service, or pauses it. Size and pause take effect at once on a running service; source changes take effect on the next deploy. Returns a costed plan, because a bigger instance costs more.

Inputs for service_update
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
serviceIdrequiredpathstringService identifier, e.g. svc_...
instancebodyshared-0.25 | shared-0.5 | standard-1 | standard-2
branchbodystring
root_directorybodystring
build_only_on_changesbodybooleanSkip a push-triggered build when the push changed nothing under root_directory. Needs a root_directory. Builds anyway when the push cannot be read, or changes a root lockfile, package.json or Dockerfile. Off by default, because a build uses the whole clone and a service that imports from outside its folder would go stale. Skips are recorded in activity_list and returned by the webhook.
imagebodystring
schedulebodystringCron expression, for cron services only.
pathbodystringFor a cron that calls a web service: the path to call.
methodbodyGET | POSTFor a cron that calls a web service: the HTTP method.
targetbodystringFor a cron that calls a web service: the name of the web service to call.
public_portsbodyobject[]Web or worker. Raw TCP to publish, alongside any HTTP a web service serves, on the platform's public address, for protocols the HTTP ingress cannot carry, such as SMTP submission. Only ports 465 and 587 are offered. The process listens on container_port (1024 or above) and clients connect to port. A deploy of a service with public ports stops the old run first, because a host port has one owner, so expect a few seconds of refused connections.
pausedbodybooleantrue stops the service and keeps its configuration; false starts it again on its last deployment.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write, deployment:write
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/products/:productId/services/:serviceId

service_delete

  • Needs confirm: true
  • Dry-runnable

Stops the service and removes it with its deployment history. Domains pointing at it are detached. Databases and variables in the environment are not touched. Requires confirm: true.

Inputs for service_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
serviceIdrequiredpathstringService identifier, e.g. svc_...
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:delete
Returns
What would happen, what it would cost, and what could not be undone.

Deployments

Building, shipping and going back.


POST

/v1/products/:productId/deployments

deploy

  • Dry-runnable
  • Changes your bill
  • Needs may_deploy

Builds the current commit and swaps traffic to it once health checks pass. The previous deployment is kept and can be restored with deployment_rollback. Returns immediately with a deployment id; poll deployment_get for progress. Through MCP a build from a repository is built on your own machine by default, so it never waits in Helm7's build queue: nothing builds until you run the `local_build.command` in the response (the CLI builds, uploads and starts it) in a shell with Docker and the repository. If you have no shell or Docker, call deploy again with `build: "remote"`, which replaces it and builds on Helm7 (use build_queue_get to see how long the queue is).

Inputs for deploy
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
service_idbodystringOmit to deploy every service in the environment.
commitbodystringGit SHA. Defaults to the branch tip.
buildbodylocal | remoteWhere the image is built. `remote` waits its turn in Helm7's build queue. `local` is built on your own machine and uploaded, so it never waits: the response names the image to build and deployment_image_upload takes it (the CLI does all of this). Omit it to use the default: local through MCP, otherwise the workspace setting (which falls back to remote when the caller cannot build locally).
can_build_locallybodybooleanSet by clients that have Docker and the source to hand (the CLI does). With `build` omitted, the workspace default of local only applies when this is true.default false
waitbodybooleanWait for the build and the swap to finish before returning. Off by default: a build can take minutes, and deployment_get follows it as it runs.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
deployment:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/deployments/:deploymentId

deployment_get

Status, timing, commit, build logs and, when a deployment failed, the specific reason, extracted rather than left for you to find in the log tail.

Inputs for deployment_get
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
deploymentIdrequiredpathstring
build_log_afterqueryintegerReturn only build log lines after this sequence number. Pass back the last seq you saw to follow a build as it runs.
Scopes
deployment:read
Returns
The deployment, its status and its failure reason where one exists.
GET

/v1/products/:productId/deployments

deployment_list

Deployment history for a Product, newest first, with status, commit and timing for each. History is immutable and nothing is pruned, so this is the reliable way to find the last deployment that was healthy before rolling back to it.

Inputs for deployment_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
cursorquerystringOpaque cursor from a previous response. Omit for the first page.
limitqueryintegerMaximum items to return.default 25
Scopes
deployment:read
Returns
A JSON object.
POST

/v1/products/:productId/deployments/:deploymentId/rollback

deployment_rollback

  • Dry-runnable
  • Needs may_deploy

Moves traffic back to an earlier deployment. The image already exists, so this is a traffic swap and takes seconds. It does not revert database migrations. If the newer deployment migrated the schema, roll that back yourself first.

Inputs for deployment_rollback
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
deploymentIdrequiredpathstring
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
deployment:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/build-queue

build_queue_get

Your workspace's builds that are running or waiting for a build slot, in the order they will run, with each one's place in the whole queue and how many builds start before it. Builds from other workspaces are counted but never named. Higher plans start ahead of lower ones, by a head start that is reported as head_start_minutes. typical_build_seconds is the median of your recent builds, or null until you have some. A deploy that builds on your own machine never appears here.

Scopes
deployment:read
Returns
Your running and waiting builds with their positions, and the size of the queue.
POST

/v1/build-queue/order

build_queue_reorder

  • Dry-runnable
  • Needs may_deploy

Puts your own waiting builds in a new order. The ids you list run first, in that order; your other waiting builds follow in the order they already had. It only rearranges the places your workspace already holds in the queue, so it can never put a build ahead of another workspace's, and your earliest place stays your earliest place. A build that has started cannot be moved: it is reported as not waiting. Returns the queue as it stands afterwards.

Inputs for build_queue_reorder
FieldInTypeNotes
deployment_idsrequiredbodystring[]Deployment ids from build_queue_get, in the order you want them to run. Naming one id runs that build first.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
deployment:write
Returns
What would happen, what it would cost, and what could not be undone.
POST

/v1/products/:productId/deployments/:deploymentId/image

deployment_image_upload

  • Needs may_deploy

Adds one chunk of a `docker save` archive to a deployment that was started with a local build. Chunks go in order: `offset` must equal what has been received so far, which makes a retry after a dropped connection safe, and the response says how many bytes are held. Finish with deployment_image_finish. The CLI does this for you.

Inputs for deployment_image_upload
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
deploymentIdrequiredpathstring
offsetrequiredbodyintegerBytes already uploaded. Start at 0.
datarequiredbodystringThis chunk, base64-encoded. Keep each chunk to the chunk_bytes the deploy returned.
Scopes
deployment:write
Returns
How many bytes of the image are held.
POST

/v1/products/:productId/deployments/:deploymentId/image/finish

deployment_image_finish

  • Needs may_deploy

Checks the uploaded archive against the size and sha256 you give, loads it onto the region and starts the deployment from it. It goes live the same way a remote build does: traffic moves once the new run is healthy. Poll deployment_get for progress.

Inputs for deployment_image_finish
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
deploymentIdrequiredpathstring
sizerequiredbodyintegerTotal bytes uploaded.
sha256requiredbodystringHex sha256 of the whole archive, so a damaged upload is refused rather than run.
commitbodystringThe git SHA the image was built from, shown beside the deployment.
Scopes
deployment:write
Returns
The deployment, now starting.

Databases

Postgres, its backups and its restores.


POST

/v1/products/:productId/databases

database_create

  • Dry-runnable
  • Changes your bill

Creates a Postgres database, at the major version the region runs, with pgvector available, and sets DATABASE_URL on the environment. Connections are pooled; use the pooled URL for serverless-style workloads and the direct URL for migrations.

Inputs for database_create
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
namebodystringdefault "primary"
extensionsbodystring[]Extensions to enable, e.g. ["pgvector"]. pgcrypto and uuid-ossp are always on.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
database:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/databases/:databaseId

database_get

Size, extensions, connection counts and backup state. Connection strings are returned only to a key carrying database:read, and the password is shown only on creation.

Inputs for database_get
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
databaseIdrequiredpathstring
Scopes
database:read
Returns
The database and its current state.
POST

/v1/products/:productId/databases/:databaseId/backups

database_backup

  • Dry-runnable

Takes a backup now, on top of the daily ones paid plans get. Kept 7 days. Returns a backup id usable with database_restore.

Inputs for database_backup
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
databaseIdrequiredpathstring
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
database:write
Returns
What would happen, what it would cost, and what could not be undone.
POST

/v1/products/:productId/databases/:databaseId/restore

database_restore

  • Needs confirm: true
  • Dry-runnable

Restores from a backup id or to a timestamp. This REPLACES the current database contents: everything written after the restore point is lost. Requires confirm: true. Restore into a fresh database first if you are not certain.

Inputs for database_restore
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
databaseIdrequiredpathstring
backup_idbodystring
point_in_timebodystringAlternative to backup_id. Must fall inside the retention window.
into_new_databasebodybooleanRestore alongside rather than over the top. Strongly preferred when you are unsure.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
database:write
Returns
What would happen, what it would cost, and what could not be undone.
POST

/v1/products/:productId/databases/:databaseId/query

database_query

  • No side effects

Runs one read-only SQL statement (SELECT, WITH, VALUES or TABLE) against a Product's database and returns the rows as JSON. It runs as the Product's own database role inside a READ ONLY transaction with a 15 second timeout, so it cannot change anything and cannot see another Product's data. At most `limit` rows come back (default 100, maximum 1000); `truncated` says whether there were more. Use it to inspect schema (information_schema.columns) and data before deciding on a change, then database_execute to change it. Reads are not audited.

Inputs for database_query
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
databaseIdrequiredpathstring
sqlrequiredbodystringOne statement. A trailing semicolon is fine; a second statement is refused.
limitbodyintegerMost rows to return.default 100
Scopes
database:read
Returns
The rows, and whether the limit cut them short.
POST

/v1/products/:productId/databases/:databaseId/execute

database_execute

  • Needs confirm: true
  • Dry-runnable

Runs a SQL script (INSERT, UPDATE, DELETE, DDL, several statements) against a Product's database as the Product's own database role, in one transaction: if any statement fails nothing is kept. `dry_run: true` really runs the script and then rolls it back, so you learn whether it would succeed and, through a final SELECT or a RETURNING clause, what it would produce, without changing anything. Applying requires `confirm: true` because a bad UPDATE cannot be undone: take a database_backup first when the change is large. Row counts are not reported; end with a RETURNING clause or a SELECT count(*) when you need one. Transaction control (BEGIN, COMMIT, ROLLBACK, SAVEPOINT) is refused because the script already is one transaction. The first 500 characters of the SQL are kept in the audit trail, so keep secrets out of it; use secret_set for those.

Inputs for database_execute
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
databaseIdrequiredpathstring
sqlrequiredbodystringOne or more statements separated by semicolons. If the last returns rows (SELECT, or anything with RETURNING) they come back in `rows`.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
database:write
Returns
What would happen, what it would cost, and what could not be undone.

Auth

Managed sign-in for the application you are hosting.


POST

/v1/products/:productId/auth

auth_enable

  • Dry-runnable
  • Changes your bill

Starts a GoTrue auth service (the engine behind Supabase Auth) against the Product database, on its own hostname, and sets AUTH_URL, AUTH_ANON_KEY, AUTH_SERVICE_ROLE_KEY, AUTH_JWT_SECRET and AUTH_SITE_URL on the environment. supabase-js and @supabase/ssr work against it unchanged: pass AUTH_URL (an origin, no path) and AUTH_ANON_KEY. Sign-in email goes out through Helm7, so nothing needs configuring for it. Calling it again on an environment whose auth is recorded but not running starts the missing container and keeps every key already in use; it never rotates a key. The record only reads available once the container passes its health check.

Inputs for auth_enable
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
providersbodystring[]email, and google or github once you have set their credentials with auth_update.default ["email"]
site_urlbodystringWhere auth redirects land. Defaults to the environment primary domain.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/auth

auth_get

The state of the auth service for one environment: whether its container is healthy right now, the URL apps use, its non-secret configuration, and how many users and identities it holds. The counts are how a migration proves every user arrived. No secret, key or password hash is ever returned; secret_list shows which variables exist.

Inputs for auth_get
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
Scopes
product:read
Returns
The auth service, its URL, configuration and user counts.
PATCH

/v1/products/:productId/auth

auth_update

  • Dry-runnable

Changes how the auth service behaves: the site URL and the allow-list of redirect URLs, whether email needs confirming, whether new sign-ups are closed, whether anonymous sign-ins are allowed, which OAuth providers are on (Google and GitHub, with their client id and secret, stored as secrets and never returned), the minimum password length, how long access tokens last and how refresh tokens rotate. Only the fields you send change. The service restarts on the new settings with the old one serving until the new one is healthy. Signed-in users are not signed out. A field this operation does not have is refused by name, not ignored.

Inputs for auth_update
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
site_urlbodystringWhere auth redirects land by default, and the base for links in emails.
additional_redirect_urlsbodystring[]Every URL an app may ask auth to redirect to, beyond site_url. Patterns are allowed, e.g. https://*.example.com/**. Replaces the list.
email_autoconfirmbodybooleantrue signs people in without confirming their email. Leave it off unless the app confirms addresses itself.
disable_signupbodybooleantrue refuses new sign-ups. Existing users, and users you invite, still get in.
anonymous_sign_insbodybooleantrue lets anyone create an anonymous user with an empty POST /auth/v1/signup (supabase.auth.signInAnonymously()), which they can later upgrade to a real account with updateUser. Anyone on the internet can do this, so put CAPTCHA and rate limiting in your app; auth limits it to 30 an hour per address. Default false.
externalbodyobjectOAuth providers. Send client_secret only when it changes; it is stored as a secret and cannot be read back. The redirect URI to register with the provider is {AUTH_URL}/auth/v1/callback.
password_min_lengthbodyintegerSix is GoTrue’s floor and 72 is bcrypt’s ceiling.
jwt_expiry_secondsbodyintegerHow long an access token lasts. Default 3600.
refresh_token_rotationbodybooleanEach refresh issues a new refresh token and retires the old one. On by default, and worth keeping on.
refresh_token_reuse_interval_secondsbodyintegerHow long a just-used refresh token may be presented again, so two tabs refreshing together do not sign the user out. Default 10.
public_hostnamebodystringWhich hostname AUTH_URL names: the default one, or a custom domain attached to the auth service. Changing it changes the redirect URI OAuth providers must have registered.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
POST

/v1/products/:productId/auth/users/import

auth_users_import

  • Dry-runnable

Upserts a batch of users, with their provider identities, into the auth schema of the Product database, keeping each id, email, password hash, confirmation time, timestamps and metadata, so nobody has to reset a password. Hashes must be bcrypt ($2a$, $2b$, $2y$) or argon2 ($argon2i$, $argon2id$); scrypt and anything else is refused, naming the row. Idempotent on id: running a batch twice changes nothing the second time. Up to 200 users per call. Hashes are never logged and never returned; the response carries counts only. Compare them with auth_get to verify a migration.

Inputs for auth_users_import
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
usersrequiredbodyobject[]Field names follow the auth.users columns, so an export from a Supabase or GoTrue database maps straight across.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
database:write
Returns
What would happen, what it would cost, and what could not be undone.

Storage

S3-compatible buckets, with no egress charge.


POST

/v1/products/:productId/storage/buckets

storage_create_bucket

  • Dry-runnable
  • Changes your bill

S3-compatible object storage with no egress charge. The API is Supabase Storage compatible, so supabase-js storage calls work unchanged.

Inputs for storage_create_bucket
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
namerequiredbodystring
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
publicbodybooleanPublic buckets serve objects without a signed URL. Default is private.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/storage/buckets

bucket_list

Buckets in a Product, each with its environment, whether it is public, its size and the S3-compatible name to address it by. Objects themselves are listed through the S3 API, not here.

Inputs for bucket_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
Scopes
product:read
Returns
A JSON object.
DELETE

/v1/products/:productId/storage/buckets/:bucketId

bucket_delete

  • Needs confirm: true
  • Dry-runnable

Removes the bucket and everything stored in it. There is no recycle bin. Requires confirm: true.

Inputs for bucket_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
bucketIdrequiredpathstringBucket identifier, e.g. bkt_...
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:delete
Returns
What would happen, what it would cost, and what could not be undone.

Domains

Custom hostnames and their certificates.


POST

/v1/products/:productId/domains

domain_attach

  • Dry-runnable
  • Changes your bill

Binds a domain to a web service and issues a certificate. Returns the DNS record to create; the certificate is issued once that record resolves, usually within a minute. Until then the domain is listed as pending, which is not an error. A name under a domain (app.example.com, www.example.com) takes a CNAME. A bare domain (example.com) takes an A record to a fixed address and, by default, redirects to www.example.com, which is attached with it if it is not already; this works at any DNS provider. Pass serve: true to answer on the bare domain itself instead of redirecting, for a site whose address people know without the www, or a webhook or API that calls it (a redirect drops the body of a POST for clients that do not follow it).

Inputs for domain_attach
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
hostnamerequiredbodystringFully qualified, e.g. app.example.com or example.com.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
service_idbodystringA web service id, or the id of the auth service (aut_...) to give auth its own domain. Defaults to the environment's only web service when there is exactly one.
servebodybooleanBare domains only. Answer on the bare domain itself instead of redirecting to www. www is still attached with it.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
domain:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/domains

domain_list

Domains bound to a Product, with certificate status and the DNS record each one expects.

Inputs for domain_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
Scopes
domain:read
Returns
A JSON object.
DELETE

/v1/products/:productId/domains/:domainId

domain_remove

  • Needs confirm: true
  • Dry-runnable

Unbinds the domain and revokes its certificate. Traffic to it stops immediately. Requires confirm: true.

Inputs for domain_remove
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
domainIdrequiredpathstring
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
domain:write
Returns
What would happen, what it would cost, and what could not be undone.

Secrets

Environment variables. Write-only, by design.


POST

/v1/products/:productId/secrets

secret_set

  • Dry-runnable

Sets or replaces a variable for an environment. Values are encrypted at rest and are never returned by any read endpoint, including this one. Only names and a fingerprint come back. Services pick up the change on their next deployment.

Inputs for secret_set
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
keyrequiredbodystring
valuerequiredbodystring
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
secret:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/secrets

secret_list

Names, environments and fingerprints. Values are never returned. There is no endpoint that returns them, by design, so a leaked read key cannot exfiltrate credentials.

Inputs for secret_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
Scopes
secret:read
Returns
A JSON object.
DELETE

/v1/products/:productId/secrets/:key

secret_delete

  • Needs confirm: true
  • Dry-runnable

Removes a variable from one environment. Running services keep the value until their next deploy. The value cannot be recovered, which is why this requires confirm: true.

Inputs for secret_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
keyrequiredpathstringVariable name, e.g. STRIPE_SECRET_KEY.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
secret:write
Returns
What would happen, what it would cost, and what could not be undone.

Test accounts

Sign-ins for an automated tester, with secrets that leave only through a separately scoped, logged checkout.


POST

/v1/products/:productId/test-accounts

test_account_create

  • Dry-runnable

Makes a sign-in a tester can use to drive the product's real interface, kept per environment. mode `provision` creates the user in the environment's managed auth: Helm7 generates a strong password, stores only a hash in auth and an encrypted copy of its own, confirms the address, and tags the user (app_metadata.is_test = true, email <label>+helm7test@<domain>) so analytics and revenue views can leave it out. Needs managed auth enabled, so run auth_enable first. mode `external` does the same in the Product's own auth service instead, with auth_provider (today: supabase): Helm7 reads the project URL and admin key from the environment's stored variables (NEXT_PUBLIC_SUPABASE_URL or SUPABASE_URL, and SUPABASE_SERVICE_ROLE_KEY), uses them for that one call and never returns them, so a Product whose auth lives elsewhere needs no key handed to the caller. The user is confirmed and tagged app_metadata.is_test; rotate and delete only ever touch a tagged user. mode `register` records an account somebody created elsewhere (a product hosted outside Helm7): send its email and password, and optionally a TOTP seed. Nothing here is ever returned: the password and seed are write-only, and list and get show a fingerprint and whether a seed exists. The one way to read them is test_account_checkout. Pass expires_in (for example 24h or 7d) or expires_at to make the account temporary: once it passes, the account is disabled, its stored secrets are wiped and, for provision, its auth user is removed, within about five minutes. Leave both out for a long-lived account. Test accounts must never pay for anything real; a flow that reaches a live paywall should stop there.

Inputs for test_account_create
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
labelrequiredbodystringLower case letters, digits and hyphens. Names the account and, for provision, its email local part. Unique within the environment.
moderequiredbodyprovision | external | registerprovision creates the user in managed auth. external creates it in the Product's own auth service (see auth_provider). register records an account that already exists.
environmentbodystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
rolebodystringWhat the account is for, in your words: member, admin, free-tier, paid. Shown beside it; Helm7 does not interpret it.
auth_providerbodysupabaseexternal only: which auth service holds the Product's users.
emailbodystringregister: required. provision: leave out to use <label>+helm7test@<domain>; if given it must still carry the +helm7test tag so it is recognisable as a test user.
passwordbodystringregister: required. provision: leave out, Helm7 generates one. Write-only.
totp_secretbodystringBase32 seed of the account's authenticator app, if it has two-factor sign-in. Helm7 stores it and generates codes with test_account_totp; it does not enrol it anywhere. Write-only.
notesbodystringFree text for people, up to 500 characters. Never put a secret here.
expires_inbodystringMake the account temporary: minutes, hours or days from now, e.g. 90m, 24h, 7d. From 5 minutes to 90 days. Exclusive with expires_at.
expires_atbodystringMake the account temporary until this moment. Between 5 minutes and 90 days away. Exclusive with expires_in.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
test_account:write
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/products/:productId/test-accounts

test_account_list

The test accounts of an environment: label, role, email, mode, a fingerprint of the password, whether a TOTP seed is stored, status (active, expired), when it expires, when it was last checked out and by which run, and when it was last rotated. Never a password, a seed or a code.

Inputs for test_account_list
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
environmentquerystringEnvironment within a Product. Every Product has production; preview and development are optional. pr-<number> is the preview of an open pull request, made and removed by the GitHub integration on Pro.
Scopes
test_account:read
Returns
A JSON object.
GET

/v1/products/:productId/test-accounts/:accountId

test_account_get

One test account with the same fields as the list: label, role, email, mode, fingerprint, whether it has a TOTP seed, status, expiry, last use and last rotation. Never a password, a seed or a code. Use test_account_checkout to sign in as it.

Inputs for test_account_get
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
accountIdrequiredpathstringTest account identifier, e.g. tac_7k2m9x4qw1nv8bz3ct6d.
Scopes
test_account:read
Returns
A test account, without its secrets.
POST

/v1/products/:productId/test-accounts/:accountId/rotate

test_account_rotate

  • Dry-runnable

Replaces the password. provision: Helm7 generates a new one and changes it in managed auth too, which also signs out every session the account has. register: send the new password you have set in the product, because Helm7 cannot reach it. The stored TOTP seed is left alone unless totp_secret is sent. Nothing secret is returned; the new fingerprint is. An expired account cannot be rotated.

Inputs for test_account_rotate
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
accountIdrequiredpathstringTest account identifier, e.g. tac_7k2m9x4qw1nv8bz3ct6d.
passwordbodystringregister: required. provision: not accepted, Helm7 generates it. Write-only.
totp_secretbodystringReplace the stored TOTP seed. Write-only.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
test_account:write
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/products/:productId/test-accounts/:accountId

test_account_delete

  • Needs confirm: true
  • Dry-runnable

Removes the record and its stored secrets and, for a provision account, deletes the user from managed auth along with its sessions. Only a user tagged is_test can be removed this way, so a real customer is never at risk from a wrong id. Requires confirm: true.

Inputs for test_account_delete
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
accountIdrequiredpathstringTest account identifier, e.g. tac_7k2m9x4qw1nv8bz3ct6d.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
test_account:write
Returns
What would happen, what it would cost, and what could not be undone.
POST

/v1/products/:productId/test-accounts/:accountId/checkout

test_account_checkout

  • Dry-runnable

The one operation that returns a test account's secrets: email, password, the current TOTP code if it has a seed and, for a provision account, a real session so the caller need not sign in at all. Meant for whatever signs in to the product, an agent included. Type the values into the sign-in and do not repeat them in your reply or write them to a file. Prefer a short-lived account (expires_in on create) and a short lease. run_ref is required and is written to the activity log with who asked, so every use is traceable to a run. The result is never kept for replay. The checkout is a lease of ttl_seconds (default 900, from 60 to 3600): when it ends, the sessions Helm7 minted for the account are revoked, so a credential that leaks from a finished run stops working quickly. Refused for an expired account.

Inputs for test_account_checkout
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
accountIdrequiredpathstringTest account identifier, e.g. tac_7k2m9x4qw1nv8bz3ct6d.
run_refrequiredbodystringWhat is using the account: a run id, a job name. Up to 200 characters. Recorded in the activity log.
ttl_secondsbodyintegerHow long the lease lasts. When it ends the sessions minted for this checkout are revoked.default 900
include_passwordbodybooleanprovision accounts: also return the password. Off by default, since the session is usually enough; turn it on only for a form sign-in. register accounts and a provision account with no session always get it. The request is recorded in the activity log.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
test_account:use
Returns
Email, password, totp_code and session for the account. This response is a credential: do not log it.
POST

/v1/products/:productId/test-accounts/:accountId/totp

test_account_totp

  • No side effects

The current six-digit code for a test account that has a TOTP seed, with the seconds it stays valid. The seed never leaves Helm7, so a caller that needs a fresh code mid-flow asks again rather than holding the seed. Every call stamps the account’s last-used time, and run_ref if given, but is not written to the activity log on its own, because a flow may ask every few seconds; the checkout it follows is. Returns a code and nothing else.

Inputs for test_account_totp
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
accountIdrequiredpathstringTest account identifier, e.g. tac_7k2m9x4qw1nv8bz3ct6d.
run_refbodystringWhat is asking, up to 200 characters. Kept as the account's last user.
Scopes
test_account:use
Returns
A one-time code. Do not log it.

Context

Memory for the agents that operate a Product.


POST

/v1/products/:productId/context

context_enable

  • Dry-runnable
  • Changes your bill

Creates a Contextely product scoped to this Helm7 Product and sets its credentials on the environment, so agents operating the application can read and write its context. Memory and sources are private to this Product unless you say otherwise.

Inputs for context_enable
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
shares_memorybodybooleanWhether other Products in the organisation can read this one's memory.default false
shares_sourcesbodybooleanWhether connections are pooled with the rest of the organisation.default false
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
context:write
Returns
What would happen, what it would cost, and what could not be undone.

Billing and cost

What you are spending, and what a change would cost.


GET

/v1/usage

usage_get

This month's spend, measured hourly from what actually ran, broken down by Product and resource; the projection to month end at what is running now; what the workspace as it stands would cost over a whole month; and the budget remaining if one is set. Read this before creating anything expensive.

Inputs for usage_get
FieldInTypeNotes
productIdquerystringNarrow to one Product. Omit for the whole organisation.
Scopes
billing:read
Returns
Usage, spend to date and month-end projection.
POST

/v1/cost/estimate

cost_estimate

  • No side effects

What a given set of resources would cost per month, without creating anything. Use this to choose between shapes before you build one. Free and side-effect-free.

Inputs for cost_estimate
FieldInTypeNotes
resourcesrequiredbodyobject[]Resources to price, e.g. [{"type":"service","instance":"shared-0.25","always_on":false}].
monthly_egress_gbbodynumberdefault 0
Scopes
billing:read
Returns
The estimated monthly cost, itemised, with the largest driver named.
POST

/v1/billing/checkout

billing_checkout_create

  • Dry-runnable

A hosted Stripe Checkout URL for upgrading the organisation to a paid plan. For an organisation that has never paid, nothing changes yet: the plan updates when Stripe confirms the subscription. For one that already pays, the existing subscription changes plan in place straight away, with no Checkout page.

Inputs for billing_checkout_create
FieldInTypeNotes
planrequiredbodybuilder | pro | scaleThe plan to subscribe to.
success_urlrequiredbodystringWhere Stripe redirects the customer after a completed payment.
cancel_urlrequiredbodystringWhere Stripe redirects the customer if they back out.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
billing:manage
Returns
A Checkout URL to redirect the customer to.
POST

/v1/billing/portal

billing_portal_create

  • No side effects

A Stripe-hosted page where a person changes plan, updates the card, downloads invoices or cancels. Only for an organisation that has paid before; one that has not starts with billing_checkout_create.

Inputs for billing_portal_create
FieldInTypeNotes
return_urlrequiredbodystringWhere to send the person back to.
Scopes
billing:manage
Returns
A portal URL to redirect the person to.

Agents

Scoped credentials, and starting without an account.


POST

/v1/agent-keys

agent_key_create

  • Dry-runnable
  • Needs may_administer

Creates a key for one agent, with its own scopes, an optional spend cap and an optional expiry. The key can never exceed the scopes of the member minting it, and a key holding may_administer cannot mint another key holding may_administer, which is what makes revoking one mean something. The secret is shown once and never again.

Inputs for agent_key_create
FieldInTypeNotes
namerequiredbodystringWhat this agent is for. Shown in the audit trail.
scopesbodystring[]Intersected with your own scopes. Asking for more than you hold narrows rather than fails.
product_idbodystringConfine the key to one Product. Omit for the whole organisation. A key cannot choose its own Product at call time, by design.
budget_usdbodynumberHard monthly cap. Cost-impacting calls are refused once reached, with code budget_exceeded.
expires_in_hoursbodyintegerKey stops working after this. Prefer a short life and re-mint.
capabilitiesbodystring[]default []
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
agent:manage
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/agent-keys/:keyId

agent_key_revoke

  • Needs confirm: true
  • Dry-runnable
  • Needs may_administer

Stops the key immediately. In-flight requests using it fail. Revocation cannot be undone; mint a new key instead.

Inputs for agent_key_revoke
FieldInTypeNotes
keyIdrequiredpathstring
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
agent:manage
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/agent-keys

agent_key_list

Every key in the organisation: its name, the first characters of the secret, its scopes and capabilities, the Product it is confined to, its spend against its cap, its expiry and when it was last used. Never the secret. Revoked keys are included, marked as revoked, because the audit trail still names them.

Inputs for agent_key_list
FieldInTypeNotes
include_revokedquerybooleandefault false
Scopes
agent:manage
Returns
A JSON object.
POST

/v1/cloud/init

cloud_init

Creates a temporary organisation and a scoped key with no email, no card and no human step, so an agent can try Helm7 end to end. One Product, a small quota, and it expires. This is for experimentation, not for running anything real. Call cloud_claim to keep what you built.

Inputs for cloud_init
FieldInTypeNotes
labelbodystringOptional name to make it findable later.
Scopes
none: this endpoint is unauthenticated
Returns
The ephemeral organisation, its key, its quota and its expiry.
POST

/v1/cloud/claim

cloud_claim

Returns a single-use link a person opens to attach this ephemeral workspace to their account. The workspace keeps running while they do. Claiming keeps it; choosing Builder or Pro is what lifts the 72-hour expiry and the trial quota.

Scopes
none: this endpoint is unauthenticated
Returns
A claim URL and how long it stays valid.

Workspace

The workspace, its spend cap, its people and its audit trail.


GET

/v1/organization

organization_get

The workspace this key belongs to: its name, plan, spend cap, whether it is a trial and when it expires, and what it is committed to spend this month across every Product. Call this before planning anything large.

Scopes
billing:read
Returns
The organisation, its plan, cap and committed monthly cost.
PATCH

/v1/organization

organization_update

  • Dry-runnable
  • Needs may_administer

Changes the workspace name, its monthly spend cap, where deploys build by default, or whether services keep their helm7.app address. The spend cap is checked against every cost-impacting change, whoever or whatever makes it; set budget_usd to null to remove it. default_build_mode is where a deploy builds when the caller does not say: local on the machine running the CLI, remote in the platform's build queue. A deploy from somewhere that cannot build (the dashboard, a push to GitHub, the hosted MCP server) always builds remotely. keep_app_domain decides whether a service keeps answering on its helm7.app address once a custom domain is serving it; off by default, so the custom domain replaces it. Turn it on to keep helm7.app as a staging address.

Inputs for organization_update
FieldInTypeNotes
namebodystring
budget_usdbodynumberMonthly ceiling in USD across the whole workspace. null removes it.
default_build_modebodylocal | remoteWhere a deploy builds when the caller does not say.
keep_app_domainbodybooleantrue keeps a service on its helm7.app address after a custom domain is serving it; false (the default for new workspaces) lets the custom domain replace it.
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
billing:manage
Returns
What would happen, what it would cost, and what could not be undone.
GET

/v1/activity

activity_list

The audit trail: every change, whether it was applied, refused or failed, who made it (a person or a named key) and the plan it carried. Refusals are included, so an agent that was stopped is on the record. Newest first.

Inputs for activity_list
FieldInTypeNotes
productIdquerystringNarrow to one Product.
outcomequeryapplied | planned | refused | failed
include_dry_runsquerybooleanInclude plans that were only looked at. Off by default: an agent or a form planning as it goes would bury the changes that were made.default false
cursorquerystringOpaque cursor from a previous response. Omit for the first page.
limitqueryintegerMaximum items to return.default 25
Scopes
product:read
Returns
A JSON object.
GET

/v1/members

member_list

People with access to the workspace, with their role, and invitations that have not been accepted yet. There is no charge per person, so this is about who can do what, not what it costs.

Scopes
product:read
Returns
A JSON object.
POST

/v1/invites

invite_create

  • Dry-runnable
  • Needs may_administer

Returns a link that adds whoever opens it and signs in to the workspace, with the role given. The link is shown once, works once and expires after 7 days. Nothing is emailed; send it however you like.

Inputs for invite_create
FieldInTypeNotes
rolebodyadmin | member | viewerdefault "member"
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
member:manage
Returns
What would happen, what it would cost, and what could not be undone.
DELETE

/v1/members/:memberId

member_remove

  • Needs confirm: true
  • Dry-runnable
  • Needs may_administer

Removes a person, revoking every key they minted, or cancels an invitation that has not been used. The last owner cannot be removed. Requires confirm: true.

Inputs for member_remove
FieldInTypeNotes
memberIdrequiredpathstringA member id (mbr_...) or an invitation id (inv_...).
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
member:manage
Returns
What would happen, what it would cost, and what could not be undone.

GitHub

Connected repositories, and deploying on every push.


GET

/v1/github/repositories

github_repo_list

Repositories the workspace has given the Helm7 GitHub App access to, most recently pushed first, with their default branch and whether they are private. When the app is not installed yet, says so and returns the link a person follows to install it.

Scopes
product:read
Returns
Installations, their repositories, and an install link.
POST

/v1/products/:productId/github

product_connect_repo

  • Dry-runnable

Connects a repository the GitHub App can see to a Product. Every push to the production branch then builds and deploys, recorded as triggered by the push. Private repositories are cloned with a short-lived token that is never stored.

Inputs for product_connect_repo
FieldInTypeNotes
productIdrequiredpathstringProduct identifier, e.g. prd_7k2m9x4qw1nv8bz3ct6d.
installation_idrequiredbodystringFrom github_repo_list.
repo_idrequiredbodystringFrom github_repo_list.
production_branchbodystringdefault "main"
dry_runbodybooleanReturn the plan without applying it: the resources it would create, change or destroy, and an estimated monthly cost. Free, and has no side effects. Call this before any change you have not made before.default false
confirmbodybooleanRequired for destructive operations. Without it a destructive call returns its plan and refuses, exactly as dry_run would.default false
idempotency_keybodystringReplaying the same key returns the original result instead of acting twice. Strongly recommended for anything that creates a resource or spends money.
Scopes
product:write
Returns
What would happen, what it would cost, and what could not be undone.

The same operations, elsewhere

Everything above is also a CLI command and an MCP tool. If you are pointing a model at this, give it /llms.txt instead: same content, written to be read in one pass.