Skip to main content
Client App BuilderVersion: v3

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.

Authorizations

Authorizationstringheaderrequired

Bearer authentication header of the form Bearer <token>, where <token> is your access token.

Scope:clientportal-ai.write
Auth methods:OAuthPrivate Integration
Token type:Sub-Account Token

Request​

Headers

Idempotency-Keystringrequired

A key you choose for this build. Retrying with the same key returns the same build.

Possible values: non-empty and <= 200 characters

Example:apk-prj_a7ca4adc-4
Versionstringrequired

The API version.

Available optionsv3
Example:v3

Path Parameters

projectIdstringrequired

The app's id.

Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$

Example:prj_a7ca4adc-be67-40ff-ae79-4f5acf56ac67

Body

revisionintegerrequired

The published revision to build. An app with generated screens builds its current revision.

Possible values: >= 1

Example:4

Response

APK build queued or the existing idempotent build returned.

idstringrequired

The build's id.

Possible values: Value must match regular expression ^apk_[a-f0-9]{32}$

Example:apk_3f1c0b9e2d4a6f8e0c1b3d5f7a9e2c4b
projectIdstringrequired

The app's id.

Possible values: Value must match regular expression ^prj_[A-Za-z0-9_-]+$

Example:prj_a7ca4adc-be67-40ff-ae79-4f5acf56ac67
revisionintegerrequired

The revision the APK is built from.

Possible values: >= 1

Example:4
appNamestringrequired

The app's name on the device.

Possible values: non-empty and <= 120 characters

Example:Run Club
statusstringrequired

Where the build is. Read it again until finished or failed.

Available optionsqueuedbuildingfinishedfailed
Example:building
artifactUrlstring<uri>

Short-lived signed GCS URL for the archived APK. Expo artifact URLs are never exposed.

Possible values: Value must match regular expression ^https://

Example:https://storage.googleapis.com/apk-artifacts/prj_a7ca4adc/apk_3f1c0b9e.apk?X-Goog-Signature=abc
errorstring

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.

Example:The Android build failed. Try again, or contact support if it keeps failing.
createdAtstring<date-time>required

When the build was requested.

Example:2026-10-23T11:30:00.000Z
updatedAtstring<date-time>required

When the build last changed state.

Example:2026-10-23T11:34:00.000Z
completedAtstring<date-time>

When the build finished or failed.

Example:2026-10-23T11:42:00.000Z