API reference

Serverless App Services

Create, read, update, transfer and delete Serverless App Services.
GET/v1/orgs/:orgId/projects

Lists the organization's Serverless App Services.

Auth
A person's token or an API key, as Authorization: Bearer.
Allowed
deployments:read; domains:read
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • include"summary"

Errors

  • 404Organization not found
  • 404Not found
  • 404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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
  }[]
}
POST/v1/orgs/:orgId/projects

Creates 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–64 characters. Trimmed.

  • slugstringrequired

    Matches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$.

  • repoIdstring
  • framework"nextjs" | "static" | "node"

    Default "nextjs".

  • rootDirectorystring

    Default ".". 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"
  }'
Send it from this page with your session or a key.

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"
  }
}
GET/v1/orgs/:orgId/projects/:projectId

A 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.
Allowed
domains:read
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Errors

  • 404Serverless App Service not found
  • 404Organization not found
  • 404Not found
  • 404Commit not found
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/projects/{projectId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

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")[]
}
PATCH/v1/orgs/:orgId/projects/:projectId

Updates 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Request body

  • namestring

    1–64 characters. Trimmed.

  • slugstring

    Matches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$.

  • framework"nextjs" | "static" | "node"
  • repoIdstringor null
  • productionBranchstring

    1–255 characters. Trimmed.

  • rootDirectorystring

    Up to 256 characters. Trimmed.

  • buildCommandany JSONrequired
  • installCommandany JSONrequired
  • outputDirectoryany JSONrequired
  • locationstring

    At least 1 character.

  • functionMemoryMbintegeror null

    128–10240.

  • functionTimeoutSecondsintegeror null

    1–60.

  • productionHoldfalse
  • protectionany
  • protectionGroupIdsstring[]or null

    Up 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 found
  • 404Organization not found
  • 409A 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": {}
  }'
Send it from this page with your session or a key.

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"
  }
}
GET/v1/orgs/:orgId/projects/:projectId/crons

The 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless 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"
Send it from this page with your session or a key.

Response 200

{
  paused: boolean
  productionDeploymentId?: string
  crons: {
    lastRun?: {
      startedAt: number
      status?: number
      ok: boolean
      durationMs?: number
      error?: string
      deploymentId?: string
    }
    path: string
    schedule: string
  }[]
}
PUT/v1/orgs/:orgId/projects/:projectId/crons

Pauses 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Request body

  • pausedbooleanrequired

Errors

  • 404Serverless App Service not found
  • 502Couldn'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
  }'
Send it from this page with your session or a key.

Response 200

{
  paused: boolean
}
GET/v1/orgs/:orgId/projects/:projectId/protection/groups

The 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless 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"
Send it from this page with your session or a key.

Response 200

{
  groups: {
    teamId: string
    name: string
  }[]
}
POST/v1/orgs/:orgId/projects/:projectId/protection/bypass

Creates (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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Errors

  • 404Serverless App Service not found
  • 502Saved, 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"
Send it from this page with your session or a key.

Response 201

{
  secret: string
}
DELETE/v1/orgs/:orgId/projects/:projectId/protection/bypass

Revokes 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Errors

  • 404Serverless App Service not found
  • 502Saved, 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"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/orgs/:orgId/projects/:projectId/transfer

Moves 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Request body

  • orgIdstringrequired

    At least 1 character.

Errors

  • 400The Serverless App Service is already in this organization.
  • 404Serverless App Service not found
  • 404Organization not found
  • 409Unlink 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>"
  }'
Send it from this page with your session or a key.

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
  }
}
DELETE/v1/orgs/:orgId/projects/:projectId

Deletes 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.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • projectId

    Serverless App Service id (prj_…).

Errors

  • 404Serverless App Service not found
  • 404Organization not found
  • 409Wait 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"
Send it from this page with your session or a key.

Response 204 with no body