shiftlabs Start free

API reference

Every route under https://api.shiftlabs.org/v1, the role it needs, and the keys that call it.

API

Every route lives under https://api.shiftlabs.org/v1 and acts on your own workspace.

The workspace comes from the credential, never from the path or body, and another workspace's trigger or run answers 404. Send an API key as Authorization: Bearer slk_…. Bodies are JSON (16 KiB at most, except a deploy's source and a run's payload), and errors are {"error": "…"} with a 4xx or 5xx status.

A re-run starts a new run with the original payload, so it counts against your run quotas like any other run, and payloads older than 14 days answer 410. A full quota answers {"error": "quota exceeded", "limit", "max"}: with 429 for runs, and 403 for counts such as workflows, triggers, secrets, connections and API keys.

Routes
RouteMethodMinimum role
/v1/me principal, workspace, limitsGETviewer
/v1/workspace {"name"}, 1 to 64 characters; auditedPATCHadmin
/v1/usage runs and egress in the last 24 h, counts, limitsGETviewer
/v1/workflowsGETviewer
/v1/workflows/:workflow body: the sourcePUTdeveloper
/v1/workflows/:workflow revokes its triggers, drops its vars and connection links; runs stayDELETEdeveloper
/v1/workflows/:workflow/versionsGETviewer
/v1/workflows/:workflow/versions/:hash/source {hash, language, source}GETdeveloper
/v1/workflows/:workflow/runs body: the payload, read like a webhook's, 256 KiB at mostPOSTdeveloper
/v1/workflows/:workflow/rollback {"hash"}: new runs use that versionPOSTdeveloper
/v1/deploys · /v1/deploys/:id deploys that waited on Python packages; ?status=building|live|failedGETviewer
/v1/workflows/:workflow/connections {"connections": [...]}GET · PUTviewer · developer
/v1/workflows/:workflow/vars/:NAME {"value"}PUT · DELETEdeveloper
/v1/triggers {"workflow", "signing"?: {"scheme", "secret"?}}GET · POSTviewer · developer
/v1/triggers/:id/rotatePOSTdeveloper
/v1/triggers/:id {"signing": {"scheme", "secret"?} | null}; the URL staysPATCHdeveloper
/v1/triggers/:idDELETEdeveloper
/v1/runs?status=&workflow=&limit=&before= newest first, cursor in nextBeforeGETviewer
/v1/runs/:id · /logs?limit= · /timeline · /egressGETviewer
/v1/runs/:id/rerun same workflow and version, new runPOSTdeveloper
/v1/runs/:id/payload the delivered body; 410 after 14 daysGETdeveloper
/v1/secrets metadata, never valuesGETviewer
/v1/secrets/:NAME {"value", "hosts"?, "readable"?, "hmac"?}PUT · DELETEadmin
/v1/secrets/:NAME {"hosts"?, "readable"?, "hmac"?}; the value and its version stayPATCHadmin
/v1/connectionsGETviewer
/v1/connections/:name {"hosts", "template"}PUT · DELETEadmin
/v1/varsGETviewer
/v1/vars/:NAME {"value"}PUT · DELETEdeveloper
/v1/audit?limit=GETadmin
/v1/metrics/runs?hours= · /v1/metrics/egress?hours=GETviewer
/v1/api-keys {"name", "role", "expiresInDays"?}GET · POSTadmin
/v1/api-keys/:idDELETEadmin
/v1/membersGETadmin
/v1/members/invitations {"email", "role"}POSTadmin
/v1/members/:membershipId {"role"}PATCH · DELETEadmin

Roles

Roles rank viewer < developer < admin, and each role can do everything the roles below it can. They apply the same way to API keys and to members signed in to the dashboard.

Members · ridgeline-ops

3
MemberRole
dana@ridgeline.exampleadmin
li@ridgeline.exampledeveloper
sam@ridgeline.exampleviewer

The last active admin cannot be demoted or removed.

A caller below a route's minimum gets 403 {"error": "forbidden", "required": "<role>"}. The last active admin cannot be demoted or removed (409). A suspended workspace can still read and revoke triggers, API keys and members; every other write gets 403 {"error": "tenant suspended"}.

API keys

A key is shown once, when an admin creates it. We store its SHA-256, never the key.

Key created · deploy-bot

developer

slk_7Qh2mZ0vYp4cN8xW1sR6tL3kJ9bF5dG0aE2uI7oP4yT

Id
key_3f9a0c7e21b4d856
Prefix
slk_7Qh2mZ0v
Expires
2027-01-18, in 90 days

Copy it now. It will not be shown again.