API reference

Serverless App Services

Create, read, update, transfer and delete Serverless App Services.

A Serverless App Service links a repository to builds and deployments.

GET /v1/orgs/:orgId/projects

Lists the organization's Serverless App Services.

Auth: user access token or platform agent key · Scope: projects:read · Allowed: deployments:read; domains:read

Path parameterDescription
:orgIdOrganization id (org_…).
Query parameterTypeRequiredNotes
include"summary"No

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"
    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
      server?: "node"
      buildLogGroup?: string
      builtOrgId?: string
      buildDurationMs?: number
      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?: "hit" | "partial" | "miss" | "off"
        nextCache?: "hit" | "partial" | "miss" | "off"
        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
      server?: "node"
      buildLogGroup?: string
      builtOrgId?: string
      buildDurationMs?: number
      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?: "hit" | "partial" | "miss" | "off"
        nextCache?: "hit" | "partial" | "miss" | "off"
        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"
    edgeOnly?: boolean
    functionMemoryMb?: number
    functionTimeoutSeconds?: number
    protectionBypass: boolean
  }[]
}

Errors

StatusMessage
404Organization not found
404Not found
404Commit not found

POST /v1/orgs/:orgId/projects

Creates a Serverless App Service. Without location, the registry's default location is used.

Auth: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredDefaultNotes
namestringYes1–64 characters; trimmed
slugstringYesmatches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$
repoIdstringNo
framework"nextjs" | "static" | "node"No"nextjs"
rootDirectorystringNo"."up to 256 characters; trimmed
locationstringNo

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"
    edgeOnly?: boolean
    functionMemoryMb?: number
    functionTimeoutSeconds?: number
    protectionBypass: boolean
  }
  deployment: null | {
    deploymentId: string
    host: string
    target: "preview" | "production"
  }
}

Errors

StatusMessage
400Repository not found in this organization.
400Unknown location: …
409A Serverless App Service with this slug exists.

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: user access token or platform agent key · Scope: projects:read · Allowed: domains:read

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

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"
    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
    server?: "node"
    buildLogGroup?: string
    builtOrgId?: string
    buildDurationMs?: number
    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?: "hit" | "partial" | "miss" | "off"
      nextCache?: "hit" | "partial" | "miss" | "off"
      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
    server?: "node"
    buildLogGroup?: string
    builtOrgId?: string
    buildDurationMs?: number
    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?: "hit" | "partial" | "miss" | "off"
      nextCache?: "hit" | "partial" | "miss" | "off"
      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")[]
}

Errors

StatusMessage
404Serverless App Service not found
404Organization not found
404Not found
404Commit not found

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: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Request body

FieldTypeRequiredNotes
namestringNo1–64 characters; trimmed
slugstringNomatches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$
framework"nextjs" | "static" | "node"No
repoIdstringNocan be null
productionBranchstringNo1–255 characters; trimmed
rootDirectorystringNoup to 256 characters; trimmed
buildCommandany JSONYes
installCommandany JSONYes
outputDirectoryany JSONYes
locationstringNoat least 1 character
functionMemoryMbintegerNo128–10240; can be null
functionTimeoutSecondsintegerNo1–60; can be null
productionHoldfalseNo
protection"standard" | "off"No
edgeOnlybooleanNo

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"
    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"
    edgeOnly?: boolean
    functionMemoryMb?: number
    functionTimeoutSeconds?: number
    protectionBypass: boolean
  }
  deployment: null | {
    deploymentId: string
    host: string
    target: "preview" | "production"
  }
}

Errors

StatusMessage
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.

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: user access token or platform agent key · Scope: deployments:read

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Response 200

{
  paused: boolean
  productionDeploymentId?: string
  crons: {
    lastRun?: {
      startedAt: number
      status?: number
      ok: boolean
      durationMs?: number
      error?: string
      deploymentId?: string
    }
    path: string
    schedule: string
  }[]
}

Errors

StatusMessage
404Serverless App Service not found

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: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Request body

FieldTypeRequiredNotes
pausedbooleanYes

Response 200

{
  paused: boolean
}

Errors

StatusMessage
404Serverless App Service not found
502Couldn't update the schedules. Try again.

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: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Response 201

{
  secret: string
}

Errors

StatusMessage
404Serverless App Service not found
502Saved, but existing deployment URLs weren't all updated. Save again to retry.

DELETE /v1/orgs/:orgId/projects/:projectId/protection/bypass

Revokes the protection bypass secret: requests carrying it get the sign-in from then on.

Auth: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Response 204 with no body.

Errors

StatusMessage
404Serverless App Service not found
502Saved, but existing deployment URLs weren't all updated. Save again to retry.

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: user access token or platform agent key · Scope: org:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Request body

FieldTypeRequiredNotes
orgIdstringYesat least 1 character

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"
    edgeOnly?: boolean
    functionMemoryMb?: number
    functionTimeoutSeconds?: number
    protectionBypass: boolean
  }
  org: {
    orgId: string
    slug: string
  }
}

Errors

StatusMessage
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.

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: user access token or platform agent key · Scope: projects:write

Path parameterDescription
:orgIdOrganization id (org_…).
:projectIdServerless App Service id (prj_…).

Response 204 with no body.

Errors

StatusMessage
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.