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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
| Query parameter | Type | Required | Notes |
|---|---|---|---|
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
| Status | Message |
|---|---|
404 | Organization not found |
404 | Not found |
404 | Commit 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
Request body
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
name | string | Yes | 1–64 characters; trimmed | |
slug | string | Yes | matches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$ | |
repoId | string | No | ||
framework | "nextjs" | "static" | "node" | No | "nextjs" | |
rootDirectory | string | No | "." | up to 256 characters; trimmed |
location | string | No |
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
| Status | Message |
|---|---|
400 | Repository not found in this organization. |
400 | Unknown location: … |
409 | A 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless 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
| Status | Message |
|---|---|
404 | Serverless App Service not found |
404 | Organization not found |
404 | Not found |
404 | Commit 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
name | string | No | 1–64 characters; trimmed |
slug | string | No | matches ^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$ |
framework | "nextjs" | "static" | "node" | No | |
repoId | string | No | can be null |
productionBranch | string | No | 1–255 characters; trimmed |
rootDirectory | string | No | up to 256 characters; trimmed |
buildCommand | any JSON | Yes | |
installCommand | any JSON | Yes | |
outputDirectory | any JSON | Yes | |
location | string | No | at least 1 character |
functionMemoryMb | integer | No | 128–10240; can be null |
functionTimeoutSeconds | integer | No | 1–60; can be null |
productionHold | false | No | |
protection | "standard" | "off" | No | |
edgeOnly | boolean | No |
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
| Status | Message |
|---|---|
400 | Repository not found in this organization. |
400 | Unknown location: … |
404 | Serverless App Service not found |
404 | Organization not found |
409 | A Serverless App Service with this slug exists. |
502 | Saved, 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless 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
| Status | Message |
|---|---|
404 | Serverless 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
paused | boolean | Yes |
Response 200
{
paused: boolean
}Errors
| Status | Message |
|---|---|
404 | Serverless App Service not found |
502 | Couldn'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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Response 201
{
secret: string
}Errors
| Status | Message |
|---|---|
404 | Serverless App Service not found |
502 | Saved, 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Response 204 with no body.
Errors
| Status | Message |
|---|---|
404 | Serverless App Service not found |
502 | Saved, 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
orgId | string | Yes | at 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
| Status | Message |
|---|---|
400 | The Serverless App Service is already in this organization. |
404 | Serverless App Service not found |
404 | Organization not found |
409 | Unlink this Serverless App Service's databases and buckets first. They stay in this organization. |
409 | Wait 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 parameter | Description |
|---|---|
:orgId | Organization id (org_…). |
:projectId | Serverless App Service id (prj_…). |
Response 204 with no body.
Errors
| Status | Message |
|---|---|
404 | Serverless App Service not found |
404 | Organization not found |
409 | Wait for the deployment in progress to finish. |
502 | Couldn't remove all of the Serverless App Service's resources. Try again. |