API reference
Serverless App Services
/ v1/ orgs/ :orgId/ projectsLists the organization's Serverless App Services.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:read
- Allowed
deployments:read;domains:read
Path parameters
orgIdOrganization id (
org_…).
Query parameters
include"summary"
Errors
404Organization not found404Not found404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
projects: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}[]
}
| {
projects: {
latest?: {
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
}
}
production?: {
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
repo?: {
resourceId: string
name: string
}
domains?: {
hostname: string
status?: "error" | "active" | "pending" | "verifying"
redirectTo?: string
}[]
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}[]
}/ v1/ orgs/ :orgId/ projectsCreates a Serverless App Service. Without location, the registry's default location is used.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).
Request body
namestringrequired1–64 characters. Trimmed.
slugstringrequiredMatches
^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$.repoIdstringframework"nextjs" | "static" | "node"Default
"nextjs".rootDirectorystringDefault
".". Up to 256 characters. Trimmed.locationstring
Errors
400Repository not found in this organization.400Unknown location: …409A Serverless App Service with this slug exists.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Example",
"slug": "example"
}'Response 201
{
project: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}
deployment: null | {
deploymentId: string
host: string
target: "preview" | "production"
}
}/ v1/ orgs/ :orgId/ projects/ :projectIdA Serverless App Service with its most recent deployments and, once it has a production deployment, its production hostname.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:read
- Allowed
domains:read
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found404Organization not found404Not found404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
project: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}
productionHost?: string
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
}
}[]
production?: {
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
}
}
repo?: {
resourceId: string
name: string
}
domains?: {
message?: string
status?: "error" | "active" | "pending" | "verifying"
createdAt?: number
updatedAt?: number
orgId: string
projectId: string
hostname: string
tenantId?: string
certificateArn?: string
records?: string
zone?: string
dnsProvider?: string
checkedAt?: number
redirectTo?: string
move?: boolean
acmCertificateArn?: string
}[]
functionConfig: {
memoryMb: number
timeoutSeconds: number
architecture: "arm64"
runtime: "nodejs22.x"
}
functionLimits: {
memoryMb: {
min: 128
max: 10240
}
timeoutSeconds: {
min: 1
max: 60
}
}
scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write" | "vehicles:read" | "vehicles:write" | "vehicles:control" | "vehicles:admin" | "sharing:read" | "sharing:write")[]
}/ v1/ orgs/ :orgId/ projects/ :projectIdUpdates the name, repository link, production branch, root directory, build and install commands, function memory and max duration (for new deployments; null returns to the default) or deployment protection (standard or off, applied to existing deployment URLs at once). repoId: null unlinks the repository; productionHold: false lets new production builds go live again after a rollback.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
namestring1–64 characters. Trimmed.
slugstringMatches
^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$.framework"nextjs" | "static" | "node"repoIdstringor nullproductionBranchstring1–255 characters. Trimmed.
rootDirectorystringUp to 256 characters. Trimmed.
buildCommandany JSONrequiredinstallCommandany JSONrequiredoutputDirectoryany JSONrequiredlocationstringAt least 1 character.
functionMemoryMbintegeror null128–10240.
functionTimeoutSecondsintegeror null1–60.
productionHoldfalseprotectionanyprotectionGroupIdsstring[]or nullUp to 50 items. Each 1–64 characters.
edgeOnlyboolean
Errors
400Choose groups from this organisation.400Repository not found in this organization.400Unknown location: …404Serverless App Service not found404Organization not found409A Serverless App Service with this slug exists.502Saved, but existing deployment URLs weren't all updated. Save again to retry.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"buildCommand": {},
"installCommand": {},
"outputDirectory": {}
}'Response 200
{
project: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}
}
| {
project: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
repoId?: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}
deployment: null | {
deploymentId: string
host: string
target: "preview" | "production"
}
}/ v1/ orgs/ :orgId/ projects/ :projectId/ cronsThe production deployment's cron jobs (si.json), whether they're paused, and each path's last scheduled call.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- deployments:read
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/crons' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
paused: boolean
productionDeploymentId?: string
crons: {
lastRun?: {
startedAt: number
status?: number
ok: boolean
durationMs?: number
error?: string
deploymentId?: string
}
path: string
schedule: string
}[]
}/ v1/ orgs/ :orgId/ projects/ :projectId/ cronsPauses or resumes the Serverless App Service's cron jobs. Schedules stay and are disabled, and stay disabled when a deployment, promotion or rollback replaces them, until resumed.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
pausedbooleanrequired
Errors
404Serverless App Service not found502Couldn't update the schedules. Try again.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/crons' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"paused": true
}'Response 200
{
paused: boolean
}/ v1/ orgs/ :orgId/ projects/ :projectId/ protection/ groupsThe org's groups (Tenant → Groups) that protection can be limited to, by name.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/protection/groups' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 200
{
groups: {
teamId: string
name: string
}[]
}/ v1/ orgs/ :orgId/ projects/ :projectId/ protection/ bypassCreates (or replaces) the protection bypass secret: automation sends it as the x-si-protection-bypass header or query parameter. Only its hash is stored; it's shown once.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found502Saved, but existing deployment URLs weren't all updated. Save again to retry.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/protection/bypass' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 201
{
secret: string
}/ v1/ orgs/ :orgId/ projects/ :projectId/ protection/ bypassRevokes the protection bypass secret: requests carrying it get the sign-in from then on.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found502Saved, but existing deployment URLs weren't all updated. Save again to retry.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/protection/bypass' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body
/ v1/ orgs/ :orgId/ projects/ :projectId/ transferMoves a Serverless App Service to another org the caller administers. Deployments, domains, environment variables (re-encrypted for the new org) and crons move with it; the repository stays and is disconnected, and linked storage must be unlinked first.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- org:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Request body
orgIdstringrequiredAt least 1 character.
Errors
400The Serverless App Service is already in this organization.404Serverless App Service not found404Organization not found409Unlink this Serverless App Service's databases and buckets first. They stay in this organization.409Wait for the deployment in progress to finish.409… already has a Serverless App Service with this slug. Rename it first.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}/transfer' \
-H "Authorization: Bearer $CACTIVE_TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"orgId": "<orgId>"
}'Response 200
{
project: {
name: string
createdAt?: number
updatedAt?: number
orgId: string
slug: string
createdBy: string
projectId: string
productionBranch?: string
framework?: "static" | "nextjs" | "node"
rootDirectory?: string
buildCommand?: string
installCommand?: string
outputDirectory?: string
location: string
productionDeploymentId?: string
productionHold?: boolean
cronsPaused?: boolean
protection?: "standard" | "all"
protectionGroupIds?: string[]
edgeOnly?: boolean
functionMemoryMb?: number
functionTimeoutSeconds?: number
protectionBypass: boolean
}
org: {
orgId: string
slug: string
}
}/ v1/ orgs/ :orgId/ projects/ :projectIdDeletes a project: its domains (routes and certificates), crons, server functions, routes, deployment records and environment variables. Linked storage is unlinked, not deleted, and the repository is kept.
- Auth
- A person's token or an API key, as Authorization: Bearer.
- Scope
- projects:write
Path parameters
orgIdOrganization id (
org_…).projectIdServerless App Service id (
prj_…).
Errors
404Serverless App Service not found404Organization not found409Wait for the deployment in progress to finish.502Couldn't remove all of the Serverless App Service's resources. Try again.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}' \
-H "Authorization: Bearer $CACTIVE_TOKEN"Response 204 with no body