Google Play Developer API errors explained, with fixes (2026)
Publishing to Google Play through the API (with fastlane supply, gradle-play-publisher, EAS Submit or your own script) mostly works, until Google returns a 400 or a 403 with a message that points at the wrong problem. These are the errors we handle in OneStore's Google Play publishing, what they really mean, and the fix.
"Only releases with status draft may be created on draft app"
Meaning: the app has never been published. Until its first production release is rolled out, Play considers it a draft app, and the API only accepts releases with status draft.
Fix: open Play Console, go to the app's dashboard and complete every required task (privacy policy, content rating, target audience, data safety, ads declaration, main store listing). Then roll out the first production release by hand: Production, open the draft release, Review release, Start rollout. After that, API releases work normally.
"Only one completed release is allowed"
Meaning: a track can hold at most one active release (status completed or inProgress). Your tracks.update body contains two.
Fix: when you write a track, drop the currently active release from the body and send only the new one, plus any drafts you want to keep. Google marks the old release as superseded on commit.
Version code already used
Meaning: an earlier upload to this app already used that versionCode, even if it was never released.
Fix: bump the version code and rebuild. In Flutter it is the number after + in pubspec.yaml; in a native or React Native project, versionCode in android/app/build.gradle; with EAS, autoIncrement can handle it.
Version code shadowed by a higher one
Meaning: Play says devices "will receive APKs with higher version codes". The version code you are releasing is shadowed: another artifact in the same release, or already on the track, has a higher code, so no device would ever get yours. Play can report this as a 403 PERMISSION_DENIED, which sends people looking at permissions for nothing.
Fix: release only the newest artifact on the track, and make sure its version code is higher than everything already there.
"The APK or Android App Bundle was signed with the wrong key"
Meaning: the .aab isn't signed with the upload key Play expects for this app.
Fix: sign with the original upload keystore. If it is lost, request an upload key reset in Play Console under App integrity; Google's reset takes about two days.
"Changes cannot be sent for review automatically"
Meaning: after a rejected update, Google stops accepting automatic sends for review through the API for that app.
Fix: commit the edit with changesNotSentForReview=true, then open Play Console, Publishing overview, and send the changes for review by hand. Later API submissions work again.
"You already have changes in review"
Meaning: another set of changes is being reviewed. Committing now would cancel that review.
Fix: wait until the current review finishes (Publishing overview in Play Console), then submit.
403 PERMISSION_DENIED that isn't about permissions
Play uses 403 both for missing Play Console permissions on the service account and for other refusals, like the shadowed version code above or a policy hold. Before you grant "Admin (all permissions)", read the message body: if it mentions version codes, keys or the draft state, the fix is there, not in the permissions.
Gaps in the API itself
- Managed publishing: if it is on, approved releases wait for someone to click Publish in Play Console. The API can't read that setting, can't see the "approved, not published" state and can't publish the release. Keep managed publishing off if you publish through the API, and use draft releases when you want to hold one.
- Review state: for a long time a track's status said
completedbefore and after review. Recent API revisions exposereleaseLifecycleState(such asIN_REVIEWorNOT_APPROVED) throughtracks.releases.list; older tools still guess. - Creating the app: there is no API to create a Play app. Create it in Play Console.
Errors you can read
OneStore maps each of these Play responses to a plain explanation with the exact Play Console step to fix it, keeps Google's own message visible, and avoids most of them upstream: it sends only the new release when writing a track and caps release notes at Play's 500 characters per language.
Related: Google Play listing without fastlane supply, How to upload an .aab without Android Studio, App Store Connect errors.
FAQs
What does "Only releases with status draft may be created on draft app" mean?
The app has never been published. Complete the required tasks in the Play Console dashboard, then roll out the first production release by hand. After that, the API accepts completed and in-progress releases.
How do I fix "Only one completed release is allowed"?
Send only one active release per track. When updating a track, remove the currently active release from the request body and include only the new release and any drafts.
Can the Google Play API publish a release held by managed publishing?
No. The API can't read or toggle managed publishing and can't publish an approved release that is waiting. Turn managed publishing off, or publish from Play Console.
Can I create a Google Play app through the API?
No. Apps are created in Play Console. The API works on apps that already exist.