Helm7

CLI reference

All 65 commands. This page renders the same command table the CLI parses with, and each entry names the API operation it calls, so it cannot describe a flag the parser would reject or an operation the platform no longer has.

Install and authenticate

git clone https://github.com/maxbeech/helm7 && cd helm7 && npm install
# Until it is published, the CLI runs from the workspace:
npm run cli -- whoami
# Either the environment:
export HELM7_API_KEY=hlm_sk_...
# Or a config file, which also holds a default Product:
cat ~/.helm7/config.json
{ "apiKey": "hlm_sk_...", "productId": "prd_7k2m9x4qw1nv8bz3ct6d" }
helm7 whoami

The environment wins over the file, so HELM7_API_KEY=other helm7 deploy means what it looks like it means. HELM7_BASE_URL points the CLI at a different Helm7 deployment, which is what you want when you are running your own. HELM7_PRODUCT, or productId in the file, supplies the default for --product so you stop typing it.

No account? helm7 cloud init gives you an ephemeral workspace and a key with no email and no card.

Flags every command takes

Global

--json
Print the raw JSON response instead of formatted output.
--colour, --color
Force colour on or off. Defaults to on only when stdout is a terminal.
--api-key <key>
Override HELM7_API_KEY for this call.
--base-url <url>
Point at a different Helm7 deployment.
--help, -h
Show help for this command.

On every command that changes something

--dry-run
Print the plan and change nothing: what would change, what it costs, and what cannot be undone.
--confirm
Required by destructive operations. Without it they only plan.
--idempotency-key <key>
Replaying the same key returns the original result instead of acting twice.

The plan is the point of --dry-run. It prints what would change, what it would cost per month and what could not be undone, and it changes nothing. Destructive commands print the same plan and refuse when --confirm is missing, so a habit of planning first never meets a surprise.

Every command

All helm7 commands
CommandOperationDoes what
helm7 whoamiwhoamiShow the organisation, member, scopes and budget this key speaks with.
helm7 initproduct_createCreate a Product, the unit everything else belongs to.
helm7 deploydeployBuild the current commit and swap traffic to it once it is healthy.
helm7 queuebuild_queue_getWhere your builds are in the build queue, and how many are ahead of them.
helm7 queue firstbuild_queue_reorderRun one of your waiting builds before your others. It cannot pass another workspace.
helm7 queue orderbuild_queue_reorderPut your waiting builds in an exact order. Builds you leave out follow, as they were.
helm7 settingsorganization_getWorkspace settings: plan, spend cap, where deploys build, and what happens to helm7.app addresses.
helm7 settings setorganization_updateRename the workspace, set its spend cap, change where deploys build by default, or whether services keep their helm7.app address.
helm7 db createdatabase_createProvision Postgres and set DATABASE_URL on the environment.
helm7 auth enableauth_enableTurn on managed auth. Supabase-compatible, so an existing app moves by changing its URL and key.
helm7 auth statusauth_getShow managed auth: health, URL, settings and how many users it holds.
helm7 auth updateauth_updateChange how auth behaves: redirect URLs, sign-up, providers, password length, token lifetimes.
helm7 auth importauth_users_importImport users, with their password hashes, from a JSON file. Idempotent on user id.
helm7 domain adddomain_attachAttach a custom domain and issue its certificate.
helm7 logsservice_logsRecent stdout and stderr for a service. Redaction is best effort, not a guarantee.
helm7 rollbackdeployment_rollbackMove traffic back to an earlier deployment. Does NOT revert database migrations.
helm7 env setsecret_setSet an environment variable. Values are never readable again, by design.
helm7 product inspectproduct_getThe whole resource graph for one Product.
helm7 usageusage_getSpend to date, the month-end projection, and the budget remaining.
helm7 product listproduct_listEvery Product in the workspace.
helm7 product renameproduct_updateRename a Product. Its addresses and ids stay the same.
helm7 product deleteproduct_deleteDelete a Product and everything in it: services, databases, storage and domains. It cannot be undone.
helm7 product connectproduct_connect_repoDeploy a Product from a repository on every push to its production branch.
helm7 reposgithub_repo_listRepositories the Helm7 GitHub App can see, or the link to install it when it is not installed yet.
helm7 environment listenvironment_listThe environments a Product has: production, and any preview or development.
helm7 environment createenvironment_createAdd a preview or development environment. It starts empty and does not copy production data.
helm7 environment deleteenvironment_deleteDelete a preview or development environment and everything in it. Production cannot be deleted.
helm7 service listservice_listThe services in a Product: web, worker and cron.
helm7 service createservice_createAdd a web, worker or cron service, built from a repository or run from an image.
helm7 service updateservice_updateChange a service: size, source, schedule, published ports, or pause and resume it.
helm7 service deleteservice_deleteDelete a service and its deployments. It cannot be undone.
helm7 deployment listdeployment_listDeployments for a Product, newest first.
helm7 deployment inspectdeployment_getOne deployment: its state, commit, build mode and the health checks it passed.
helm7 db inspectdatabase_getA database: size, extensions, connections and backup state.
helm7 db backupdatabase_backupTake a backup now, on top of the daily ones. Kept for 7 days.
helm7 db restoredatabase_restoreRestore from a backup or to a point in time. This replaces the current contents unless --into-new-database is given.
helm7 db querydatabase_queryRun one read-only SQL statement and print the rows. SQL is an argument, "-" for standard input, or --file.
helm7 db executedatabase_executeRun a SQL script that changes data or schema, in one transaction. --dry-run runs it and rolls it back.
helm7 bucket listbucket_listStorage buckets in a Product.
helm7 bucket createstorage_create_bucketCreate an S3-compatible storage bucket.
helm7 bucket deletebucket_deleteDelete a storage bucket and every object in it. It cannot be undone.
helm7 domain listdomain_listDomains attached to a Product, and whether their certificates are issued.
helm7 domain removedomain_removeDetach a domain. The service stops answering on it.
helm7 env listsecret_listEnvironment variable names and fingerprints. Values are never returned.
helm7 env unsetsecret_deleteRemove an environment variable. Services lose it on their next deployment.
helm7 test-accounts createtest_account_createCreate a test account an automated tester can sign in with. Passwords are write-only.
helm7 test-accounts listtest_account_listTest accounts: label, email, fingerprint, expiry and last use. Never a password.
helm7 test-accounts gettest_account_getOne test account, without its secrets.
helm7 test-accounts rotatetest_account_rotateReplace a test account password (and end its sessions). Registered accounts need --password.
helm7 test-accounts deletetest_account_deleteDelete a test account and, if Helm7 made it, its auth user.
helm7 test-accounts checkouttest_account_checkoutPrint a test account sign-in (email, password, TOTP code, session). Needs test_account:use; logged with --run-ref.
helm7 test-accounts totptest_account_totpPrint the current two-factor code for a test account. Needs test_account:use.
helm7 context enablecontext_enableGive the Product memory: its own Contextely product, with credentials set on the environment.
helm7 cost estimatecost_estimatePrice a shape per month without building it. Resources are a JSON array, inline or from a file.
helm7 billing checkoutbilling_checkout_createStart a subscription. Prints a checkout link for a person to open.
helm7 billing portalbilling_portal_createA link to manage the subscription, invoices and payment method.
helm7 key createagent_key_createMint a key for one agent, with its own scopes, spend cap and expiry. The secret is shown once.
helm7 key listagent_key_listAgent keys: name, scopes, spend against the cap, expiry and last use. Never the secret.
helm7 key revokeagent_key_revokeStop a key at once. In-flight requests using it fail, and it cannot be undone.
helm7 activityactivity_listThe audit trail: what was done, by whom, and whether it was applied, refused or failed.
helm7 member listmember_listPeople in the workspace, with their role, and invitations not yet accepted.
helm7 member inviteinvite_createMake an invitation link, shown once, valid for 7 days. Nothing is emailed.
helm7 member removemember_removeRemove a person from the workspace. Their keys stop working.
helm7 cloud initcloud_initStart an ephemeral workspace with no account, no card and no human step.
helm7 cloud claimcloud_claimKeep an ephemeral workspace by attaching it to a real account.

helm7 whoami [options]

Show the organisation, member, scopes and budget this key speaks with.

GET /v1/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

helm7 init <name> [options]

Create a Product, the unit everything else belongs to.

POST /v1/products

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

<name>required
Human-readable Product name.
--region <eu-central|eu-north>
Where the Product runs.
--repo <git-url>
Repository to inspect for a proposed shape.
--external-ref <id>
Your own id for this Product. Creating twice with it returns the first one.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 deploy [options]

Build the current commit and swap traffic to it once it is healthy.

POST /v1/products/:productId/deployments

  • 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).

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--service <svc_...>
Omit to deploy every service in the environment.
--commit <sha>
Git SHA. Defaults to the branch tip.
--build <local|remote>
Where to build. local builds here with Docker and uploads, so it never waits; remote queues on Helm7. Defaults to your workspace setting.
--dockerfile <path>
Dockerfile for a local build. Defaults to ./Dockerfile.
--context <dir>
Build context for a local build. Defaults to the current directory.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: deployment:write

helm7 queue [options]

Where your builds are in the build queue, and how many are ahead of them.

GET /v1/build-queue

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

helm7 queue first <deploymentId> [options]

Run one of your waiting builds before your others. It cannot pass another workspace.

POST /v1/build-queue/order

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

<deploymentId>required
A waiting deployment, from `helm7 queue`.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: deployment:write

helm7 queue order [options]

Put your waiting builds in an exact order. Builds you leave out follow, as they were.

POST /v1/build-queue/order

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

--ids <dep_a,dep_b>required
Deployment ids, first to run first.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: deployment:write

helm7 settings [options]

Workspace settings: plan, spend cap, where deploys build, and what happens to helm7.app addresses.

GET /v1/organization

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

helm7 settings set [options]

Rename the workspace, set its spend cap, change where deploys build by default, or whether services keep their helm7.app address.

PATCH /v1/organization

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

--name <name>
Rename the workspace.
--budget <usd|none>
Monthly spend cap in USD across the workspace. none removes it.
--build-mode <local|remote>
Where a deploy builds when you do not say. local uses this machine.
--keep-app-domain <on|off>
on keeps the helm7.app address as a staging address once a custom domain is serving.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: billing:manage

helm7 db create [options]

Provision Postgres and set DATABASE_URL on the environment.

POST /v1/products/:productId/databases

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--name <name>
Database name. Defaults to primary.
--extension <a,b>
Extensions to enable. pgcrypto and uuid-ossp are always on.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: database:write

helm7 auth enable [options]

Turn on managed auth. Supabase-compatible, so an existing app moves by changing its URL and key.

POST /v1/products/:productId/auth

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--provider <email,github>
Providers to enable. Defaults to email.
--site-url <url>
Where auth redirects land.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 auth status [options]

Show managed auth: health, URL, settings and how many users it holds.

GET /v1/products/:productId/auth

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

scopes: product:read

helm7 auth update [options]

Change how auth behaves: redirect URLs, sign-up, providers, password length, token lifetimes.

PATCH /v1/products/:productId/auth

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--site-url <url>
Where auth redirects land by default.
--redirect-url <url,url>
Every other URL an app may redirect to. Replaces the list.
--autoconfirm
Sign people in without confirming their email.
--disable-signup
Refuse new sign-ups.
--anonymous-signins
Let anyone create an anonymous user (signInAnonymously). Needs CAPTCHA and rate limiting in your app.
--password-min-length <6-72>
Minimum password length.
--jwt-expiry <seconds>
How long an access token lasts.
--google-client-id <id>
Turns Google sign-in on with this client id.
--google-client-secret <secret>
Write-only. Stored as a secret.
--github-client-id <id>
Turns GitHub sign-in on with this client id.
--github-client-secret <secret>
Write-only. Stored as a secret.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 auth import [options]

Import users, with their password hashes, from a JSON file. Idempotent on user id.

POST /v1/products/:productId/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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--file <users.json>required
A JSON array of users (up to 200), named like the auth.users columns.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: database:write

helm7 domain add <hostname> [options]

Attach a custom domain and issue its certificate.

POST /v1/products/:productId/domains

  • 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).

<hostname>required
Fully qualified, e.g. app.example.com. A bare domain (example.com) gets an A record and redirects to www unless --serve is given.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--service <svc_...>
Defaults to the only web service, when there is one.
--serve
Bare domains only: answer on the bare domain itself instead of redirecting to www.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: domain:write

helm7 logs [options]

Recent stdout and stderr for a service. Redaction is best effort, not a guarantee.

GET /v1/products/:productId/services/:serviceId/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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--service <svc_...>required
Service to read.
--since <iso-8601>
Only lines after this timestamp.
--limit <n>
Maximum lines to return.

scopes: deployment:read

helm7 rollback <deploymentId> [options]

Move traffic back to an earlier deployment. Does NOT revert database migrations.

POST /v1/products/:productId/deployments/:deploymentId/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.

<deploymentId>required
Deployment to roll back to.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: deployment:write

helm7 env set <KEY=VALUE> [options]

Set an environment variable. Values are never readable again, by design.

POST /v1/products/:productId/secrets

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

<KEY=VALUE>required
The variable and its value.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: secret:write

helm7 product inspect <productId> [options]

The whole resource graph for one Product.

GET /v1/products/:productId

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.

<productId>required
Product to inspect.

scopes: product:read

helm7 usage [options]

Spend to date, the month-end projection, and the budget remaining.

GET /v1/usage

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.

--product <prd_...>
Narrow to one Product.

scopes: billing:read

helm7 product list [options]

Every Product in the workspace.

GET /v1/products

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.

--cursor <cursor>
next_cursor from the previous page.
--limit <n>
Maximum rows to return.

scopes: product:read

helm7 product rename <productId> <name> [options]

Rename a Product. Its addresses and ids stay the same.

PATCH /v1/products/:productId

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

<productId>required
Product to rename.
<name>required
The new name, up to 64 characters.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 product delete <productId> [options]

Delete a Product and everything in it: services, databases, storage and domains. It cannot be undone.

DELETE /v1/products/:productId

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

<productId>required
Product to delete.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:delete

helm7 product connect [options]

Deploy a Product from a repository on every push to its production branch.

POST /v1/products/:productId/github

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--installation <id>required
Installation id, from `helm7 repos`.
--repo-id <id>required
Repository id, from `helm7 repos`.
--branch <branch>
Production branch. Defaults to main.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 repos [options]

Repositories the Helm7 GitHub App can see, or the link to install it when it is not installed yet.

GET /v1/github/repositories

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

helm7 environment list [options]

The environments a Product has: production, and any preview or development.

GET /v1/products/:productId/environments

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

scopes: product:read

helm7 environment create <name> [options]

Add a preview or development environment. It starts empty and does not copy production data.

POST /v1/products/:productId/environments

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

<name>required
preview or development.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 environment delete <name> [options]

Delete a preview or development environment and everything in it. Production cannot be deleted.

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

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

<name>required
preview or development.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:delete

helm7 service list [options]

The services in a Product: web, worker and cron.

GET /v1/products/:productId/services

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

scopes: product:read

helm7 service create <name> [options]

Add a web, worker or cron service, built from a repository or run from an image.

POST /v1/products/:productId/services

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

<name>required
Service name.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--kind <web|worker|cron>required
What the service does.
--repo <git-url>
Git URL to build from. Required unless --image is given.
--branch <branch>
Branch to build. Defaults to main.
--root-directory <dir>
Subdirectory to build from, for monorepos.
--build-only-on-changes
With --root-directory: skip a push build when the push changed nothing under it.
--image <ref>
Container image to run instead of building.
--schedule <cron>
Cron expression. Required for a cron service.
--path </api/cron/x>
Cron only: call this path on one of your web services instead of running a container.
--method <GET|POST>
Cron with --path only. Defaults to GET.
--target <web-service>
Cron with --path only: which web service to call. Defaults to the only one, or the one called web.
--instance <size>
shared-0.25, shared-0.5, standard-1 or standard-2. Shared sizes sleep when idle; standard sizes stay running.
--public-port <465:2465,587:2587>
Raw TCP to publish: public port (465 or 587), then the port the process listens on.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write, deployment:write

helm7 service update <serviceId> [options]

Change a service: size, source, schedule, published ports, or pause and resume it.

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

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

<serviceId>required
Service to change, from `helm7 service list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--instance <size>
shared-0.25, shared-0.5, standard-1 or standard-2. Takes effect at once on a running service.
--branch <branch>
Branch to build, from the next deploy.
--root-directory <dir>
Subdirectory to build from, from the next deploy.
--clear-root-directory
Build from the repository root again.
--build-only-on-changes
Skip a push build when the push changed nothing under the root directory. --no-build-only-on-changes builds on every push again.
--image <ref>
Container image to run.
--clear-image
Stop using an image and build from the repository.
--schedule <cron>
New schedule, for a cron service.
--path </api/cron/x>
For a cron that calls a web service: the path to call.
--method <GET|POST>
For a cron that calls a web service: the HTTP method.
--target <web-service>
For a cron that calls a web service: which one.
--public-port <465:2465,587:2587>
Replace the published raw TCP ports.
--paused
Stop the service and keep its configuration. --no-paused starts it again.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write, deployment:write

helm7 service delete <serviceId> [options]

Delete a service and its deployments. It cannot be undone.

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

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

<serviceId>required
Service to delete.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:delete

helm7 deployment list [options]

Deployments for a Product, newest first.

GET /v1/products/:productId/deployments

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--cursor <cursor>
next_cursor from the previous page.
--limit <n>
Maximum rows to return.

scopes: deployment:read

helm7 deployment inspect <deploymentId> [options]

One deployment: its state, commit, build mode and the health checks it passed.

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

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.

<deploymentId>required
Deployment to read.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

scopes: deployment:read

helm7 db inspect <databaseId> [options]

A database: size, extensions, connections and backup state.

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

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.

<databaseId>required
Database to read, from `helm7 product inspect`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

scopes: database:read

helm7 db backup <databaseId> [options]

Take a backup now, on top of the daily ones. Kept for 7 days.

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

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

<databaseId>required
Database to back up.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: database:write

helm7 db restore <databaseId> [options]

Restore from a backup or to a point in time. This replaces the current contents unless --into-new-database is given.

POST /v1/products/:productId/databases/:databaseId/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.

<databaseId>required
Database to restore.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--backup <backup id>
Backup to restore from. Give this or --at.
--at <iso-8601>
Point in time inside the retention window. Give this or --backup.
--into-new-database
Restore alongside the current database instead of over it. Safer when you are unsure.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: database:write

helm7 db query <databaseId> [sql] [options]

Run one read-only SQL statement and print the rows. SQL is an argument, "-" for standard input, or --file.

POST /v1/products/:productId/databases/:databaseId/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.

<databaseId>required
Database to query.
<sql>
One SELECT, WITH, VALUES or TABLE statement, or "-" to read it from standard input.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--file <path>
Read the SQL from a file instead.
--limit <1-1000>
Most rows to return. Defaults to 100.

scopes: database:read

helm7 db execute <databaseId> [sql] [options]

Run a SQL script that changes data or schema, in one transaction. --dry-run runs it and rolls it back.

POST /v1/products/:productId/databases/:databaseId/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.

<databaseId>required
Database to change.
<sql>
One or more statements, or "-" to read them from standard input.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--file <path>
Read the SQL from a file instead.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: database:write

helm7 bucket list [options]

Storage buckets in a Product.

GET /v1/products/:productId/storage/buckets

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

scopes: product:read

helm7 bucket create <name> [options]

Create an S3-compatible storage bucket.

POST /v1/products/:productId/storage/buckets

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

<name>required
Bucket name.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--public
Let anyone read the objects in it.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:write

helm7 bucket delete <bucketId> [options]

Delete a storage bucket and every object in it. It cannot be undone.

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

  • Needs confirm: true
  • Dry-runnable

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

<bucketId>required
Bucket to delete, from `helm7 bucket list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: product:delete

helm7 domain list [options]

Domains attached to a Product, and whether their certificates are issued.

GET /v1/products/:productId/domains

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

scopes: domain:read

helm7 domain remove <domainId> [options]

Detach a domain. The service stops answering on it.

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

  • Needs confirm: true
  • Dry-runnable

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

<domainId>required
Domain to remove, from `helm7 domain list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: domain:write

helm7 env list [options]

Environment variable names and fingerprints. Values are never returned.

GET /v1/products/:productId/secrets

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

scopes: secret:read

helm7 env unset <KEY> [options]

Remove an environment variable. Services lose it on their next deployment.

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

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

<KEY>required
Variable name.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: secret:write

helm7 test-accounts create [options]

Create a test account an automated tester can sign in with. Passwords are write-only.

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

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.
--label <name>required
Lower case letters, digits and hyphens. Unique in the environment.
--mode <provision|external|register>required
provision creates the user in managed auth with a generated password. external does it in the Product's own auth service (--auth-provider). register records an account made elsewhere.
--auth-provider <supabase>
external only: which auth service holds the Product's users.
--role <role>
What it is for: member, admin, free-tier.
--email <address>
register: required. provision: optional, must carry +helm7test.
--password <password>
register only. Write-only.
--totp-secret <base32>
Seed for two-factor sign-in. Write-only.
--notes <text>
A note for people. Never put a secret in it.
--expires-in <90m|24h|7d>
Make the account temporary. Its user and secrets are removed after this long.
--expires-at <iso time>
Make the account temporary until this time. Not with --expires-in.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: test_account:write

helm7 test-accounts list [options]

Test accounts: label, email, fingerprint, expiry and last use. Never a password.

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

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.

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--env <production|preview|development>
Environment within the Product. Defaults to production.

scopes: test_account:read

helm7 test-accounts get <accountId> [options]

One test account, without its secrets.

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

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.

<accountId>required
From `helm7 test-accounts list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

scopes: test_account:read

helm7 test-accounts rotate <accountId> [options]

Replace a test account password (and end its sessions). Registered accounts need --password.

POST /v1/products/:productId/test-accounts/:accountId/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.

<accountId>required
From `helm7 test-accounts list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--password <password>
register only: the new password you set in the product. Write-only.
--totp-secret <base32>
Replace the stored TOTP seed. Write-only.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: test_account:write

helm7 test-accounts delete <accountId> [options]

Delete a test account and, if Helm7 made it, its auth user.

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

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

<accountId>required
From `helm7 test-accounts list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: test_account:write

helm7 test-accounts checkout <accountId> [options]

Print a test account sign-in (email, password, TOTP code, session). Needs test_account:use; logged with --run-ref.

POST /v1/products/:productId/test-accounts/:accountId/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.

<accountId>required
From `helm7 test-accounts list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--run-ref <run id>required
What is using the account. Written to the activity log.
--ttl <60-3600>
Lease in seconds. Default 900. Sessions Helm7 minted end with it.
--include-password
Also print the password of a provisioned account. Off by default: the session is usually enough.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: test_account:use

helm7 test-accounts totp <accountId> [options]

Print the current two-factor code for a test account. Needs test_account:use.

POST /v1/products/:productId/test-accounts/:accountId/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.

<accountId>required
From `helm7 test-accounts list`.
--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--run-ref <run id>
What is asking.

scopes: test_account:use

helm7 context enable [options]

Give the Product memory: its own Contextely product, with credentials set on the environment.

POST /v1/products/:productId/context

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

--product <prd_...>required
Product id. Defaults to HELM7_PRODUCT or productId in your config file.
--share-memory
Let other Products in the workspace read this one's memory.
--share-sources
Pool connections with the rest of the workspace.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: context:write

helm7 cost estimate [options]

Price a shape per month without building it. Resources are a JSON array, inline or from a file.

POST /v1/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.

--resources <json>
e.g. [{"type":"service","instance":"shared-0.25","always_on":false}].
--file <path>
Read the resources JSON from a file instead.
--egress-gb <gb>
Expected monthly egress in GB.

scopes: billing:read

helm7 billing checkout [options]

Start a subscription. Prints a checkout link for a person to open.

POST /v1/billing/checkout

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

--plan <builder|pro|scale>required
The plan to subscribe to.
--success-url <url>required
Where to send the person after paying.
--cancel-url <url>required
Where to send the person if they back out.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: billing:manage

helm7 billing portal [options]

A link to manage the subscription, invoices and payment method.

POST /v1/billing/portal

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

--return-url <url>required
Where to send the person back to.

scopes: billing:manage

helm7 key create <name> [options]

Mint a key for one agent, with its own scopes, spend cap and expiry. The secret is shown once.

POST /v1/agent-keys

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

<name>required
What this agent is for. Shown in the audit trail.
--scope <a,b>
Scopes to grant, narrowed to what you hold yourself.
--confine-to <prd_...>
Confine the key to one Product. Omit for the whole workspace.
--budget <usd>
Hard monthly spend cap for this key.
--expires-in-hours <hours>
The key stops working after this long.
--capability <may_deploy,may_administer,may_manage_billing>
Capabilities beyond the scopes.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: agent:manage

helm7 key list [options]

Agent keys: name, scopes, spend against the cap, expiry and last use. Never the secret.

GET /v1/agent-keys

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.

--include-revoked
Also list revoked keys.

scopes: agent:manage

helm7 key revoke <keyId> [options]

Stop a key at once. In-flight requests using it fail, and it cannot be undone.

DELETE /v1/agent-keys/:keyId

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

<keyId>required
Key to revoke, from `helm7 key list`.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: agent:manage

helm7 activity [options]

The audit trail: what was done, by whom, and whether it was applied, refused or failed.

GET /v1/activity

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.

--product <prd_...>
Narrow to one Product.
--outcome <applied|planned|refused|failed>
Only entries with this outcome.
--include-dry-runs
Include plans that were only looked at.
--cursor <cursor>
next_cursor from the previous page.
--limit <n>
Maximum rows to return.

scopes: product:read

helm7 member list [options]

People in the workspace, with their role, and invitations not yet accepted.

GET /v1/members

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

helm7 member invite [options]

Make an invitation link, shown once, valid for 7 days. Nothing is emailed.

POST /v1/invites

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

--role <admin|member|viewer>
Role the invited person gets. Defaults to member.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: member:manage

helm7 member remove <memberId> [options]

Remove a person from the workspace. Their keys stop working.

DELETE /v1/members/:memberId

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

<memberId>required
Member to remove, from `helm7 member list`.

Also takes --dry-run, --confirm and --idempotency-key.

scopes: member:manage

helm7 cloud init [options]

Start an ephemeral workspace with no account, no card and no human step.

POST /v1/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.

--label <name>
Optional name, to find it again.

scopes: none

helm7 cloud claim [options]

Keep an ephemeral workspace by attaching it to a real account.

POST /v1/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

Not everything has a command yet

The API and the MCP server cover the whole catalogue. The CLI covers the part people reach for at a terminal, and it is smaller. Storage buckets, environments, agent keys and database restores are API and MCP operations today with no command in front of them.

Everything is in the API reference, and /llms.txt is the version written for a model.