# App Quality: Target API Level Does Not Meet Requirements

**Guideline:** app-quality/target-api · **Store:** Google Play · **Severity:** medium · **Fix difficulty:** medium · **Typical turnaround:** 4-16 hours

Canonical URL: https://appstorereject.com/rejections/google/app-quality%2Ftarget-api/app-quality-target-api-level-does-not-meet-requirements

## Description

Your app targets an Android API level below Google Play's current minimum requirement. As of 2025, new apps must target at least API level 34 (Android 14), and app updates must also target API level 34 or higher. Apps targeting outdated API levels are blocked from being published or updated on Google Play.

## Common variations

- Legacy app not updated in years with outdated targetSdkVersion in build.gradle
- Dependencies on deprecated APIs that were removed or restricted in newer Android versions
- Third-party SDK that hasn't been updated and pins to an older target API level
- Gradle misconfiguration where targetSdkVersion is set in multiple places with conflicting values

## Example rejection email

```
Your app update has been rejected

Your app currently targets API level 31 (Android 12). Starting August 31, 2024, app updates must target at least API level 34 (Android 14).

Action required: Update your app's targetSdkVersion to 34 or higher in your build.gradle file, address any behavior changes introduced in API levels 32-34, and re-submit your update.
```

## Resolution steps

## How to Fix Target API Level Violations

1. **Update build.gradle** — Set `targetSdkVersion` to the required level (currently 34):
   ```gradle
   android {
       defaultConfig {
           targetSdkVersion 34
       }
   }
   ```
   Also update `compileSdkVersion` to match or exceed the target.

2. **Review behavior changes** — Each API level introduces behavior changes. Check the official migration guides:
   - API 32: Bluetooth permissions changes
   - API 33: POST_NOTIFICATIONS permission, granular media permissions
   - API 34: Foreground service types required, restrictions on implicit intents

3. **Update third-party SDKs** — Check all dependencies for API level compatibility. Update to latest versions. If an SDK doesn't support the target API level, find an alternative or contact the maintainer.

4. **Handle new permissions** — API 33+ requires POST_NOTIFICATIONS runtime permission. API 34 requires declaring foreground service types in the manifest:
   ```xml
   <service android:name=".MyService"
       android:foregroundServiceType="location|camera" />
   ```

5. **Test on target API emulator** — Create an emulator with the target API level. Test all features, especially background work, notifications, file access, and location.

6. **Check for deprecated API usage** — Use Android Lint (`./gradlew lint`) to find deprecated API calls. Replace them with recommended alternatives.

7. **Verify Gradle consistency** — Ensure `targetSdkVersion` isn't overridden in product flavors or build types. Check both `build.gradle` and `build.gradle.kts` if migrating.

## Before / after examples

**Before:** build.gradle has targetSdkVersion 31 with compileSdkVersion 31, uses deprecated JobIntentService, and relies on an old AdMob SDK version that doesn't support API 34
**After:** build.gradle updated to targetSdkVersion 34, compileSdkVersion 34, JobIntentService replaced with WorkManager, AdMob SDK updated to latest version, POST_NOTIFICATIONS permission added with runtime request
**Why it works:** Updating targetSdkVersion is not just changing a number — you must handle all behavior changes, update dependencies, and test thoroughly on the target API level

## Common questions

**How long does this typically take to fix?**

Typical turnaround is 4-16 hours (difficulty: medium). After resubmission, most re-reviews complete within 24-48 hours.

## Community solutions (1)

### Solution (+0, worked: 0)

---
*Machine-readable source: https://api.appstorereject.com/api/rejections/detail?slug=app-quality-target-api-level-does-not-meet-requirements*