Check whether an app can be published now, and which build would go live.
GET/ai-builder-api/projects/:projectId/publishability
Computed by the same resolver as promote-to-production. Without
sourceRunId: publishable iff some ready run of this project (caller's
location, main lineage) has a sealed build; the newest one goes live
with the newest config-only revision made on its lineage. With
sourceRunId (the reviewed preview): publishes what that preview shows —
its own sealed build, or for a ready run that built nothing, the sealed
build it descends from with config-only edits on that lineage; a run
that failed or has not finished is reviewed_preview_not_publishable. Send the returned
sourceRunId on promote-to-production. Tenant scope comes from the
session only.
Request
The API version.
v3The project.
Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$
Run whose preview the creator is reviewing; bounds what may go live.
Possible values: Value must match regular expression ^run_[A-Za-z0-9_-]+$
Publishability answer.
- application/json
- Schema
- Example (auto)
- publishable
- neverBuilt
Schema
Whether a publish now would succeed.
Run id to send as sourceRunId on promote-to-production. Present when publishable.
Run that sealed the build that would go live. Present when publishable.
When that sealed build was made. Present when publishable.
Experience revision that would go live, when one applies.
Possible values: >= 1
Why nothing is publishable. Present when not publishable.
no_sealed_buildmobile_uses_apk_lanefinalizingsource_run_not_foundreviewed_preview_not_publishable{
"publishable": true,
"sourceRunId": "run_7b2c9e41",
"workspaceRunId": "run_7b2c9e41",
"workspaceCreatedAt": "2026-10-23T09:41:12.000Z",
"experienceRevision": 5,
"reason": "no_sealed_build"
}
{
"publishable": true,
"sourceRunId": "run_01J9CFG",
"workspaceRunId": "run_01J9BLD",
"workspaceCreatedAt": "2026-10-01T12:00:00.000Z",
"experienceRevision": 5
}
{
"publishable": false,
"reason": "no_sealed_build"
}