Build a signed Android APK of a published phone app revision.
POST/ai-builder-api/projects/:projectId/app-config/apk-builds
Idempotent per Idempotency-Key. For a project whose current revision carries generated screens, the build is instead identified by the revision and the generated sources it carries (sha256(locationId:projectId:revision:sourcesSha)): repeating the request for the same revision and sources returns the same build whatever the key, and a failed one is queued again. Such a build is made from the React Native kernel commit the screens were generated against, and must be requested for the current revision. Generated screens reach members only through a new APK; they are never delivered over the air. At most one build may be active per project; sibling projects in the same location may build in parallel. Deleting a project while its build is still queued or building fails that build. A project compiles one signed APK for now: after a successful build the binary is final. A project without generated screens keeps reaching installed apps by publishing a revision; a project with generated screens cannot build another APK yet. Failed builds do not consume the allowance.
Request
A key you choose for this build. Retrying with the same key returns the same build.
Possible values: non-empty and <= 200 characters
The API version.
v3The app's id.
Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$
- application/json
- Body
- Example (auto)
Bodyrequired
The published revision to build. An app with generated screens builds its current revision.
Possible values: >= 1
{
"revision": 4
}
APK build queued or the existing idempotent build returned.
- application/json
- Schema
- Example (auto)
Schema
The build's id.
Possible values: Value must match regular expression ^apk_[a-f0-9]{32}$
The app's id.
Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$
The revision the APK is built from.
Possible values: >= 1
The app's name on the device.
Possible values: non-empty and <= 120 characters
Where the build is. Read it again until finished or failed.
queuedbuildingfinishedfailedShort-lived signed GCS URL for the archived APK. Expo artifact URLs are never exposed.
Possible values: Value must match regular expression ^https://
Creator-facing summary of why the build failed, safe to render as-is. Raw EAS, npm, or Gradle console output is never returned here; it stays in the build worker log.
When the build was requested.
When the build last changed state.
When the build finished or failed.
{
"id": "apk_3f1c0b9e2d4a6f8e0c1b3d5f7a9e2c4b",
"projectId": "prj_a7ca4adc-be67-40ff-ae79-4f5acf56ac67",
"revision": 4,
"appName": "Run Club",
"status": "building",
"artifactUrl": "https://storage.googleapis.com/apk-artifacts/prj_a7ca4adc/apk_3f1c0b9e.apk?X-Goog-Signature=abc",
"error": "The Android build failed. Try again, or contact support if it keeps failing.",
"createdAt": "2026-10-23T11:30:00.000Z",
"updatedAt": "2026-10-23T11:34:00.000Z",
"completedAt": "2026-10-23T11:42:00.000Z"
}