# Google Play targets required minimum API level

- **Pattern:** `ab-000441` (`app-store-metadata-listing.platform-specific.google-target-api`)
- **Severity:** medium
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-000441
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-000441)

## Why it matters

Google Play enforces a minimum `targetSdkVersion` that advances annually. As of 2026, new app submissions require API 35 (Android 15); existing apps receiving updates require API 34. Submitting below the threshold results in an automated rejection — the Play Console shows a 'Target API level requirement not met' error before any human reviewer sees the app. This is not a lint warning; it is a hard publish block. Additionally, targeting a lower API level disables Android security features that are default-on at higher API levels: scoped storage enforcement, permission upgrade flows, and exact alarm restrictions — each of which affects real user data handling.

## Severity rationale

Medium because the automated targetSdkVersion check blocks Play Store submission entirely, but the fix is a single build.gradle line plus regression testing.

## Remediation

Update `android/app/build.gradle` to meet current requirements:

```groovy
android {
  compileSdkVersion 35
  defaultConfig {
    targetSdkVersion 35
    minSdkVersion 24
  }
}
```

For Expo, set in `app.json`:

```json
"android": { "targetSdkVersion": 35 }
```

After updating, test on an Android 15 emulator (API 35) — SDK version bumps change permission dialog flows, storage access behavior, and exact alarm scheduling. Run your existing integration tests against the new target before submitting. Document the SDK target in `SUBMISSION_NOTES.md` alongside the Google Play requirement version that drove the change, so the next engineer understands why the minimum exists.

## Detection

- **ID:** `google-target-api`
- **Severity:** `medium`
- **What to look for:** Check `android/app/build.gradle` for `targetSdkVersion` in the `defaultConfig` block. For Expo, check `app.json` for `expo.android.targetSdkVersion`. For Flutter, check `android/app/build.gradle` directly. Google Play's current requirement (as of 2026): new app submissions must target API level 35 (Android 15) or higher; existing apps receiving updates must target API level 34 or higher (this threshold advances annually). Also check `minSdkVersion` — while not a submission blocker, Google Play requires apps to support at least Android 5.0 (API 21) to reach a meaningful user base. If `targetSdkVersion` is set to a value below Google's current requirement, the submission will be rejected with a "Target API level" error. Also check `compileSdkVersion` — this should match or exceed `targetSdkVersion`. Count all instances found and enumerate each.
- **Pass criteria:** `targetSdkVersion` is 34 or higher (meets current Google Play requirements); or the project is iOS-only. At least 1 implementation must be confirmed.
- **Fail criteria:** `targetSdkVersion` is below 34 (for new submissions as of 2026, the requirement is API 35 — but 34 is the minimum for existing apps receiving updates); or `targetSdkVersion` is not set at all (defaults to a lower value).
- **Skip (N/A) when:** iOS-only project (no `android/app/build.gradle` present).
- **Detail on fail:** `"android/app/build.gradle sets targetSdkVersion 33 — Google Play requires targetSdkVersion 34 or higher for app updates as of 2024, and 35 for new submissions as of 2026"`.
- **Remediation:** Failing to meet the target API level requirement blocks Play Store submission — no human review occurs, it is an automated rejection.
  1. Update `android/app/build.gradle`:
     ```groovy
     android {
       compileSdkVersion 35
       defaultConfig {
         targetSdkVersion 35
         minSdkVersion 24  // Covers ~97% of active Android devices as of 2026
       }
     }
     ```
  2. After updating `targetSdkVersion`, test on Android 15 (API 35) — behavior changes between SDK levels may cause regressions
  3. For Expo, update `app.json`: `"android": { "targetSdkVersion": 35 }`
  4. For Flutter, update both `android/app/build.gradle` and run `flutter build appbundle` to verify

## External references

- external google-play-target-api-requirement — https://support.google.com/googleplay/android-developer/answer/11926878

Taxons: operational-readiness, regulatory-conformance

HTML version: https://auditbuffet.com/patterns/ab-000441
