Skip to content
runlot

Deployment access control

Covers 5 API operations in the access category.

MethodPathDescription
GET/v1/orgs/{orgSlug}/projects/{projectName}/accessDeployment access policy (runlot access)
PUT/v1/orgs/{orgSlug}/projects/{projectName}/accessChanges the policy (runlot access set)
POST/v1/orgs/{orgSlug}/projects/{projectName}/access/bypassIssues a bypass key for automation (runlot access bypass --new)
DELETE/v1/orgs/{orgSlug}/projects/{projectName}/access/bypassRevoke a bypass key (runlot access bypass --revoke)
POST/v1/access/authorizeOne-time code to reach a protected deployment

GET /v1/orgs/{orgSlug}/projects/{projectName}/access

Who can reach this deployment. A project that has never set a policy is public, not 404 — most projects are in that state.

The password is never returned on any surface, and a bypass secret is shown only once, when it is created.

Requires viewer or higher.

operationId getAccess

Status codeDescriptionResponse body
200PolicyAccessPolicy
403——
404——
503no_core — the service is temporarily unavailable.Error

PUT /v1/orgs/{orgSlug}/projects/{projectName}/access

public leaves the deployment open to anyone, org requires member or higher in the org the project belongs to, and password uses one shared password for the whole project. app admits only requests that carry a valid env.auth session for this project; a browser without one is sent to the app's sign-in page and anything else gets 401 sign_in_required. It requires login to be on for the project.

If you don't send a password, the existing one stays. Send a new value to replace it.

Requires admin or higher. Recorded in the audit log as access.set (the password itself is not included).

operationId setAccess

Request body: application/json · object

Status codeDescriptionResponse body
200The policy that changedAccessPolicy
400——
403——
404——
409login_required — mode app needs login turned on for this project (runlot auth on) first.Error
503no_core — the service is temporarily unavailable.Error

POST /v1/orgs/{orgSlug}/projects/{projectName}/access/bypass

Use this key to reach a protected deployment from CI or other automation. Send it in the Runlot-Access-Bypass: <secret> request header.

The value appears only in this response. You cannot view it again, and calling this again immediately invalidates the old value — this is how you revoke a leaked secret.

Requires admin or higher. The audit event access.bypass.new does not record the key value.

operationId newAccessBypass

Status codeDescriptionResponse body
200Bypass key (shown only once)AccessBypass
403——
404——
503no_core — the service is temporarily unavailable.Error

DELETE /v1/orgs/{orgSlug}/projects/{projectName}/access/bypass

Returns 204 even if there is no bypass key. The access policy itself does not change — the bypass key is managed separately from the policy. Requires admin or higher. Recorded in the audit log as access.bypass.revoke.

operationId revokeAccessBypass

Status codeDescriptionResponse body
204Revoked—
403——
404——
503no_core — the service is temporarily unavailable.Error

POST /v1/access/authorize

Part of the login round trip for a protected deployment. When a visitor is sent back to the dashboard's /access/authorize screen, that screen calls this with their session and then follows the returned redirect, which sets the access cookie on the deployment's own origin.

to must be a hostname runlot knows. If it isn't, this returns 404. next accepts a path only — //evil.example is read as an absolute address and is rejected.

Someone outside the org gets 403, and signing in again returns the same result.

Requires viewer or higher.

operationId authorizeAccess

Request body: application/json · object

Status codeDescriptionResponse body
200Callback URLAccessAuthorize
400——
403——
404——
503no_core — the service is temporarily unavailable.Error

On this page