API reference
Deployments
/ v1/ protection/ tokenA two-minute sign-in link to a protected host for the signed-in person: a deployment's own URL, or the production host or a custom domain of a project that protects everything. They need deployments:read in its organization and, when the project limits it to groups, to be in one of them or an owner or admin. People only, not keys.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Allowed
deployments:read
Request body
hoststringrequired1–253 characters. Trimmed.
nextstringUp to 2,048 characters.
Errors
403Only people can open protected deployments.403You don't have access to this deployment. Ask an owner of its organization to invite you.403Only members of the groups this Serverless App Service names can open it. Ask an owner or admin of its organization.404Deployment not found.
curl -X POST 'https://api.cactive.com.au/v1/protection/token' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"host": "example"
}'Response 200
{
url: string
}/ v1/ orgs/ :orgId/ projects/ :projectId/ uploadsA presigned PUT URL (15 minutes) for one source archive of size bytes (gzipped tar, at most 250 MB). Send the archive with exactly the returned headers, then start a deployment with the uploadId.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
sizeintegerrequired1–262144000.
Errors
404Serverless App Service not found
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/uploads' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"size": 1
}'Response 201
{
uploadId: string
url: string
headers: {
"content-type": string
"content-length": string
}
expiresIn: number
}/ v1/ orgs/ :orgId/ projects/ :projectId/ uploads/ planPlans an upload from the working tree's index (files: path → "<mode> <blob id>", at most 50,000). skip: a ready deployment of the same files and build inputs (none with force); else base and need: an earlier full upload to send only the changed files on top of; else neither (upload it whole). Writes nothing.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
target"production" | "preview"requiredfilesobjectrequiredValues: string.
forcebooleanDefault
false.
Errors
400The file list can't be used (over 50,000 files, or odd paths): upload the whole tree.404Serverless App Service not found
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/uploads/plan' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"target": "production",
"files": {}
}'Response 200
{
tree: string
skip: {
deploymentId: string
host?: string
}
}
| {
tree: string
}
| {
tree: string
base: {
uploadId: string
}
need: string[]
}/ v1/ orgs/ :orgId/ projects/ :projectId/ deploymentsStarts a deployment of the Serverless App Service. git: a commit of the linked repository on branch, with target (default: production for the production branch, else preview); a commit that already has a building or ready deployment for that target returns it (200) unless force. upload: the archive uploaded with uploadId, built as target.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
source"git" | "upload"requiredbranchstring1–255 characters. Trimmed.
commitShastringMatches
^[0-9a-f]{40}$.uploadIdstringMatches
^up_[A-Za-z0-9_-]{16,64}$.target"production" | "preview"forcebooleanDefault
false.manifestobjectValues: any JSON.
filesobjectValues: string.
basestringMatches
^up_[A-Za-z0-9_-]{16,64}$.skipstring1–64 characters.
metaobjectmeta.branchstringUp to 255 characters.
meta.commitstringMatches
^[0-9a-f]{7,40}$.meta.dirtybooleanmeta.machinestringUp to 64 characters.
Errors
400A git deployment needs branch and commitSha.400An upload deployment needs a target.400The file list can't be used (over 50,000 files, or odd paths).400A skip needs the file list.400An upload deployment needs uploadId and target.400A delta needs the file list.404Serverless App Service not found404Not found404Commit not found409Link a repository to this Serverless App Service first.409Something changed since the plan: upload the files.409The upload wasn't found. Upload the archive first.409The base upload is gone or isn't a full upload: upload the whole tree.413The archive is larger than 250 MB.502Couldn't start the build. Try again.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/deployments' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"source": "git"
}'Response 200
{
deployment: {
deploymentId: string
host?: string
target: "preview" | "production"
}
existing: true
}Response 201
{
deployment: {
deploymentId: string
host: string
target: "preview" | "production"
}
existing: false
}
| {
deployment: {
deploymentId: string
host?: string
target: "preview" | "production"
}
existing: false
skipped: true
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ build-logBuild output after cursor (from the first step on), with the deployment's status. Poll with the returned cursor until done: the deployment has finished and no output is left.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- logs:read
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Query parameters
cursorstringUp to 2,048 characters.
Errors
404Deployment not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/build-log' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
lines: []
cursor: null | string
status: "error" | "queued" | "building" | "deploying" | "ready" | "canceled" | "expired" | "skipped"
error: null | string
done: boolean
}
| {
status: "error" | "queued" | "building" | "deploying" | "ready" | "canceled" | "expired" | "skipped"
error: null | string
done: boolean
lines: {
t: number
m: string
}[]
cursor: string
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ runtime-logs/ tailServer function log events from since (epoch ms, at most an hour back; default the last minute) to now, oldest first, with event ids. q filters case-insensitively. Poll again from next, re-reading a few seconds (late events) and skipping ids already seen.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- logs:read
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Query parameters
sinceinteger≥ 0. Coerced from a string.
qstringUp to 200 characters. Trimmed.
Errors
404Deployment not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/runtime-logs/tail' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
available: false
lines: []
next: number
more: false
}
| {
lines: {
id: string
t: number
level: "error" | "platform" | "warn" | "info" | "debug"
requestId?: string
message: string
truncated?: boolean
}[]
next: number
more: boolean
available: true
}/ v1/ orgs/ :orgId/ deploymentsLists deployments across Serverless App Services, newest first. Pass the returned cursor to get the next page.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:read
Path parameters
orgIdOrganization id (
org_…).
Query parameters
projectIdstringAt least 1 character.
target"production" | "preview"status"queued" | "building" | "deploying" | "ready" | "error" | "canceled" | "expired" | "skipped"branchstring1–255 characters.
cursorstringAt least 1 character.
limitintegerDefault
50. 1–100. Coerced from a string.
Errors
404Serverless App Service not found404Not found404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
deployments: {
region?: string
error?: string
status?: "error" | "queued" | "building" | "deploying" | "ready" | "canceled" | "expired" | "skipped"
createdAt?: number
updatedAt?: number
orgId: string
createdBy?: string
projectId: string
reason?: string
location: string
edgeOnly?: boolean
deploymentId: string
target: "preview" | "production"
branch?: string
commitSha?: string
commitMessage?: string
commitAuthor?: string
host?: string
buildId?: string
cacheBuildId?: string
edgeGen?: string
server?: "node"
buildLogGroup?: string
builtOrgId?: string
buildDurationMs?: number
deployClaimedAt?: number
deployClaimedBy?: string
readyAt?: number
envTarget?: "preview" | "production"
memoryMb?: number
timeoutSeconds?: number
crons?: string
envHash?: string
previousDeploymentId?: string
source?: "git" | "upload"
sourceArchive?: string
sourceBase?: string
sourceTree?: string
sourceManifest?: string
buildMetrics?: {
restoreMs?: number
installMs?: number
buildMs?: number
uploadMs?: number
saveMs?: number
depsCache?: "off" | "hit" | "partial" | "miss"
nextCache?: "off" | "hit" | "partial" | "miss"
packageManager?: string
installDir?: string
}
}[]
cursor: null | string
}/ v1/ orgs/ :orgId/ deployments/ :deploymentIdA deployment and a summary of its Serverless App Service.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:read
- Allowed
domains:read
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Errors
404Deployment not found404Serverless App Service not found404Not found404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
deployment?: {
region?: string
error?: string
status?: "error" | "queued" | "building" | "deploying" | "ready" | "canceled" | "expired" | "skipped"
createdAt?: number
updatedAt?: number
orgId: string
createdBy?: string
projectId: string
reason?: string
location: string
edgeOnly?: boolean
deploymentId: string
target: "preview" | "production"
branch?: string
commitSha?: string
commitMessage?: string
commitAuthor?: string
host?: string
buildId?: string
cacheBuildId?: string
edgeGen?: string
server?: "node"
buildLogGroup?: string
builtOrgId?: string
buildDurationMs?: number
deployClaimedAt?: number
deployClaimedBy?: string
readyAt?: number
envTarget?: "preview" | "production"
memoryMb?: number
timeoutSeconds?: number
crons?: string
envHash?: string
previousDeploymentId?: string
source?: "git" | "upload"
sourceArchive?: string
sourceBase?: string
sourceTree?: string
sourceManifest?: string
buildMetrics?: {
restoreMs?: number
installMs?: number
buildMs?: number
uploadMs?: number
saveMs?: number
depsCache?: "off" | "hit" | "partial" | "miss"
nextCache?: "off" | "hit" | "partial" | "miss"
packageManager?: string
installDir?: string
}
}
project: {
projectId: string
name: string
slug: string
productionDeploymentId?: string
repoId?: string
framework?: "static" | "nextjs" | "node"
location: string
rootDirectory?: string
}
productionHost?: string
domains?: {
hostname: string
status?: "error" | "active" | "pending" | "verifying"
redirectTo?: string
}[]
function: null | {
region: string
name: string
memoryMb: number
timeoutSeconds: number
architecture: "arm64"
runtime: "nodejs22.x"
}
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ logsBuild output, starting at the first build step.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- logs:read
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Errors
404Deployment not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/logs' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
lines: {
t?: number
m: string
}[]
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ runtime-logsServer function logs, newest first, at most 500 per page. range (1h, 6h, 24h, 7d; default 1h) bounds how far back; pass the returned older as before for the next page; after returns only newer events (live tail). q filters messages case-insensitively. available is false for deployments without a server function.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- logs:read
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Query parameters
qstringUp to 200 characters. Trimmed.
rangeanybeforeinteger> 0. Coerced from a string.
afterinteger> 0. Coerced from a string.
Errors
404Deployment not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/runtime-logs' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
available: false
lines: []
}
| {
older?: number
lines: {
id?: string
t: number
level: "error" | "platform" | "warn" | "info" | "debug"
requestId?: string
message: string
truncated?: boolean
}[]
from: number
to: number
limited: boolean
available: true
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ redeployBuilds the deployment's commit again as a new deployment with the same target.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:write
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Errors
404Deployment not found404Serverless App Service not found409This deployment is still in progress.409This upload has expired. Deploy again from your terminal.409This deployment has no commit to build.409Link a repository to this Serverless App Service first.502Couldn't start the build. Try again.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/redeploy' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
deployment: {
deploymentId: string
host: string
target: "preview" | "production"
}
}/ v1/ orgs/ :orgId/ deployments/ :deploymentId/ promoteMakes a ready deployment production without rebuilding: promotes a preview, or rolls back to an earlier production deployment. A promoted preview's function switches to production's variables unless the body is { "env": "preview" }. A rollback holds production there: new production builds don't go live until a deployment is promoted.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:write
Path parameters
orgIdOrganization id (
org_…).deploymentIdDeployment id (
dpl_…).
Errors
400Invalid request.404Deployment not found404Serverless App Service not found409This deployment has expired. Redeploy it instead.409Only ready deployments can be promoted.409This is already the production deployment.409This deployment's server function was removed. Redeploy it instead.502Couldn't apply the production environment variables. Production wasn't changed; try again.502Couldn't update production routing. Try again.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/deployments/{deploymentId}/promote' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
deployment: {
region?: string
error?: string
status?: "error" | "queued" | "building" | "deploying" | "ready" | "canceled" | "expired" | "skipped"
createdAt?: number
updatedAt?: number
orgId: string
createdBy?: string
projectId: string
reason?: string
location: string
edgeOnly?: boolean
deploymentId: string
target: "preview" | "production"
branch?: string
commitSha?: string
commitMessage?: string
commitAuthor?: string
host?: string
buildId?: string
cacheBuildId?: string
edgeGen?: string
server?: "node"
buildLogGroup?: string
builtOrgId?: string
buildDurationMs?: number
deployClaimedAt?: number
deployClaimedBy?: string
readyAt?: number
envTarget?: "preview" | "production"
memoryMb?: number
timeoutSeconds?: number
crons?: string
envHash?: string
previousDeploymentId?: string
source?: "git" | "upload"
sourceArchive?: string
sourceBase?: string
sourceTree?: string
sourceManifest?: string
buildMetrics?: {
restoreMs?: number
installMs?: number
buildMs?: number
uploadMs?: number
saveMs?: number
depsCache?: "off" | "hit" | "partial" | "miss"
nextCache?: "off" | "hit" | "partial" | "miss"
packageManager?: string
installDir?: string
}
}
productionHost: string
productionHold: boolean
}