Skip to content

gplay customapps create

Create a private app distributed to one organisation through managed Google Play, uploading the AAB/APK with the custom app's metadata in a single call. This is the one Google Play Developer API path that creates an app record (public apps can only be created in the Play Console).

The app is created on the Developer account (the account axis, not a package): resolve the account through the gplay cascade (later wins) — the active Account's developer-id, .gplay/config.local.json, GPLAY_DEVELOPER_ID, then --developer-id; an unresolved id fails with exit 10.

Pass --title, --default-language (BCP 47, e.g. en-US), and the artifact path. Restrict the app to specific organizations with a repeatable --organization <organizationId> (omit to default to the organization linked to the account).

Creating a custom app is IRREVERSIBLE — the API exposes no delete (and no read), so the app permanently occupies the account. It therefore requires --confirm (missing → exit 3); CI=true never auto-confirms. Rehearse first with --dry-run (validates inputs and the artifact with zero HTTP). The account must be enrolled in managed Google Play and the service account must hold the account-level CAN_CREATE_MANAGED_PLAY_APPS capability; a 403 names both.

--output json passes the created CustomApp through verbatim (including the output-only packageName). GPLAY_READONLY refuses the live write (exit 4).

[experimental] — the surface may still evolve (ADR-0010).

gplay customapps create <app.aab|app.apk> [flags]
FlagDescription
--confirmauthorize the irreversible app creation
--default-language stringdefault listing language in BCP 47 (e.g. en-US) (required)
--developer-id stringPlay Console Developer account id (overrides the active Account's, env, and project-local)
--dry-runvalidate inputs and the artifact without any HTTP call (reports the --confirm requirement)
--organization stringArrayrestrict to this organization id (repeatable; omit to default to the account's organization)
--output stringoutput format: table, json, or markdown (default: auto — table on TTY, json in pipes/CI)
--title stringthe custom app's display title (required)
FlagDescription
--account stringname of a stored Account to use (overrides env and active Account)
--retry intretry transient failures (transport errors, 5xx, 429) up to N times with exponential backoff (default: 0, no retry)
--service-account stringpath to a service-account JSON, or inline JSON content (overrides --account, env, and active Account)
--timeout durationper-request API timeout, e.g. 30s or 2m (default: 60s for control-plane calls, none for uploads)
-v, --verboselog flow steps to stderr (info level)