Key takeaways
- ITMS-91053 means code in your app or an SDK uses a required reason API without a reason in its privacy manifest. Apple says that since May 1, 2024, apps that don't describe that use aren't accepted by App Store Connect.
- ITMS-91061 means a commonly used third-party SDK in your app, such as Flutter, shipped without a privacy manifest. Apple says that starting February 12, 2025, apps submitted for review must contain a valid manifest for a certain number of those SDKs.
- Apple's required reason APIs fall into five categories: file timestamp, system boot time, disk space, active keyboards and user defaults. Each needs one or more approved reason codes.
- Most Flutter fixes start with upgrading Flutter and running flutter pub upgrade, because many plugins added their manifests after the rules were announced. You only add your own PrivacyInfo.xcprivacy for code you wrote.
- Never paste a privacy manifest from the internet. The Flutter team says a manifest is an attestation to Apple that you use data and APIs only in the ways it describes.
Pricing an app? Try the free app cost calculator or get a range for your project in the instant quote.
If App Store Connect emailed you ITMS-91053 or ITMS-91061, a PrivacyInfo.xcprivacy file is missing or incomplete, either in your own code or in a third-party SDK. ITMS-91053 is about required reason APIs used without a declared reason. ITMS-91061 is about a commonly used SDK, such as Flutter itself, that ships without a privacy manifest. In a Flutter app the fix is usually to upgrade Flutter and your plugins first, and to add your own manifest only for native code you wrote.
The facts below come from Apple's developer documentation, Apple's SDK requirements page, the Flutter team's comments on GitHub and the plugin manifests listed in the sources. I checked each one on October 18, 2026.
Disclosure: App369 is my studio. I build and fix Android and iOS apps, mostly in Flutter, and the last section mentions what I sell. Apple doesn't pay me for anything on this page.
What the two errors mean
| Code | What the email says | What it means |
|---|---|---|
| ITMS-91053 | "Missing API declaration": your app's code references APIs that require reasons, and names categories such as NSPrivacyAccessedAPICategoryFileTimestamp or NSPrivacyAccessedAPICategoryUserDefaults | Code in your app or an SDK uses a required reason API, and no privacy manifest gives an approved reason for it |
| ITMS-91061 | "Missing privacy manifest": your app includes an SDK that was identified as a commonly used third-party SDK, for example Frameworks/Flutter.framework/Flutter | That SDK has no privacy manifest file |
The wording comes from emails quoted in Flutter issues 145269 and 163455. Your email may differ a little, so read the file name it gives. That name is your first clue.
The dates
| Date | What Apple or the email said | Source |
|---|---|---|
| May 1, 2024 | Apps that don't describe their use of required reason APIs in their privacy manifest aren't accepted by App Store Connect. Apple's upcoming requirements page says you need approved reasons, including for third-party SDK code, to upload a new or updated app | Apple, required reason API, Apple, upcoming requirements |
| November 12, 2024 | An ITMS-91061 email posted in a Flutter issue says that from this date a new privacy-impacting SDK must include a manifest | Flutter issue 156141 |
| February 12, 2025 | Apple says apps submitted for review in App Store Connect must contain a valid privacy manifest for a certain number of commonly used third-party SDKs | Apple, adding a privacy manifest |
Apple's SDK page says you must include the manifest for any listed SDK when you submit a new app that includes it, or an update that adds it. It also says signatures are required where the listed SDKs are used as binary dependencies, and that any version of a listed SDK is covered. That page didn't state a date when I read it, so I rely on the other Apple page for February 12, 2025.
The list includes Flutter, FirebaseCore, FirebaseAuth, FirebaseMessaging, path_provider, shared_preferences_ios, url_launcher, image_picker_ios, sqflite and many more. Check Apple's list for the plugins in your app.
The five required reason API categories
Apple describes these APIs as ones that could be misused to fingerprint a device or user. Each category goes in the NSPrivacyAccessedAPITypes array with one or more reason codes. These are the categories and the codes I read in Apple's documentation:
| Category key | What it covers | Reason codes from Apple |
|---|---|---|
| NSPrivacyAccessedAPICategoryFileTimestamp | File timestamps and metadata (fstat, lstat, getattrlist and similar) | DDA9.1 display to the user, C617.1 files inside the app container, 3B52.1 files the user granted access to, 0A2A.1 third-party SDK wrapper |
| NSPrivacyAccessedAPICategorySystemBootTime | System boot time, such as mach_absolute_time | 35F9.1 measure elapsed time within the app, 8FFB.1 absolute timestamps for events in the app, 3D61.1 optional bug report |
| NSPrivacyAccessedAPICategoryDiskSpace | Available disk space (statfs, volume capacity keys and similar) | 85F4.1 display to the user, E174.1 check space before writing files, 7D9E.1 optional bug report, B728.1 health research apps |
| NSPrivacyAccessedAPICategoryActiveKeyboards | List of active keyboards | 3EC4.1 custom keyboard apps, 54BD.1 customize the UI based on the active keyboard |
| NSPrivacyAccessedAPICategoryUserDefaults | UserDefaults | CA92.1 data only the app itself can access, 1C8F.1 data shared in the same App Group, C56D.1 third-party SDK wrapper, AC6B.1 managed app configuration set by MDM |
Each reason comes with limits. For example, Apple says information accessed for several of these reasons may not be sent off-device. Read the full text for your code before you pick one.
Find which SDK or plugin triggers it
- Read the email. It names the file. "Runner" means your app target, or a plugin built statically into it. A path like Frameworks/Flutter.framework/Flutter means that framework.
- Upgrade first. The Flutter team's guidance in issue 145269 (comment dated April 22, 2024) starts with
flutter pub upgrade, because many plugins added their manifests after the rules came out. - Look at what your build contains. The same guidance says to run
find build/ios/iphoneos -name "*.xcprivacy"and look at eachPrivacyInfo.xcprivacyinside the plugin bundles. Compare their declarations with the categories in your email. If all of them together don't cover the email, at least one dependency has no manifest. - Try packaging plugins as frameworks. The same guidance says adding the
use_frameworks!line from Flutter's Podfile template can change a warning from "Runner" to a named framework. Then you know which plugin to contact. Plugins that setstatic_framework = trueoverride it. - Search your own code. In
ios/Runner.xcworkspace, use Find in Workspace for the APIs listed in the flagged category, and check whether the matches are in code you wrote or in a plugin.
The Flutter team also noted a bug in App Store Connect, at least as of April 2024, that could produce a warning for static frameworks that do declare their reasons. If your plugins all have manifests and the warning still names Runner, that comment is worth reading.
Add or edit PrivacyInfo.xcprivacy in Xcode
Do this only for code in your own app, or if an SDK can't be updated. Apple's steps:
- Open
ios/Runner.xcworkspacein Xcode. - Choose File > New File.
- Scroll to the Resource section and select the App Privacy File type, then click Next.
- Check the Runner target in the Targets list and click Create.
The file is named PrivacyInfo.xcprivacy by default, and that is the required name. Apple says the file must be in the target's resources for Xcode to use it, and that for an iOS app Xcode places it at the root of the app bundle.
A minimal manifest for an app whose own code reads and writes UserDefaults for itself looks like this. It matches the structure in Flutter's own plugin manifests:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
Use this as a shape, not as an answer. The Flutter team warns that a manifest is an attestation to Apple that you use data and APIs only in the ways it describes, and that copying arbitrary text could misrepresent your app. Set NSPrivacyTracking to true and list domains only if your app tracks as Apple defines it. Fill NSPrivacyCollectedDataTypes to match what you collect.
Apple also says App Store Connect rejects submissions with invalid manifests, so use only the keys and values Apple documents.
Update Flutter, plugins and pods
- Flutter itself. Flutter's engine source has a PrivacyInfo.xcprivacy for the iOS framework. A maintainer replied to someone on Flutter 2.5.3 that the version is more than three years old and predates framework privacy manifests, so it can't be published as a new app under Apple's rules. If your ITMS-91061 names Flutter, upgrade Flutter. My advice: if the upgrade breaks the iOS build, see the iOS build-failed-after-upgrade guide and the UIScene migration guide.
- Plugins. Run
flutter pub upgrade, then check the plugins on Apple's list against their changelogs. The shared_preferences iOS plugin, for example, declares UserDefaults with reason 1C8F.1 in its own manifest. - Pods. After a plugin update, run
pod installfromios/and rebuild. My advice: deletePodsandPodfile.lockfirst if CocoaPods keeps the old versions. - A plugin with no update. Ask its maintainer to add a manifest, replace the plugin, or as a last resort, declare its usage in your own manifest. Apple's documentation says an SDK can't rely on an app's manifest to report its own use, so this is a stopgap.
Check the archive and re-upload
- In Xcode, choose Product > Archive.
- In the Organizer, Control-click the archive and choose Generate Privacy Report.
- Choose where to save it and open the report in Preview.
Apple says the report aggregates the privacy manifests from your app and the third-party SDKs it links to, and that Xcode won't generate it correctly if you define your own collected data types or purposes instead of Apple's listed values. Then upload again and wait for the processing email.
If Apple's email points at an invalid manifest inside an SDK, Apple's documentation says to choose Window > Organizer, click Archives, Control-click your archive and choose Show in Finder, then Control-click it in the Finder and choose Show Package Contents. My advice: contact the SDK's developer first rather than editing a signed framework.
Need a hand?
If App Store Connect keeps rejecting your upload with ITMS-91053 or ITMS-91061, the App Fix Ticket covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. Or send me a short description.
Frequently asked questions
- What does ITMS-91053 Missing API declaration mean?
- It means your app's code, or code in an SDK, references an API that Apple calls a required reason API, such as file timestamps or user defaults, and the privacy manifest doesn't give an approved reason for it. Apple says that starting May 1, 2024, apps that don't describe that use aren't accepted by App Store Connect.
- What does ITMS-91061 Missing privacy manifest mean?
- It means your app includes a third-party SDK from Apple's list of commonly used SDKs, and that SDK has no privacy manifest. For Flutter apps, the email I found in Flutter's issue tracker names Frameworks/Flutter.framework/Flutter. Upgrading to a Flutter version that ships a manifest is the usual fix.
- Do I need my own PrivacyInfo.xcprivacy in a Flutter app?
- Only if your own native code in ios/Runner uses required reason APIs, or an SDK without its own manifest forces you to. The Flutter team's guidance is that if every SDK in your dependency tree has its own manifest, your app's manifest should only need to describe usage directly in your app's code.
- Which reason code do I use for UserDefaults?
- Apple lists CA92.1 for reading and writing information that is only accessible to the app itself, and 1C8F.1 for apps, extensions and App Clips in the same App Group. Pick the one that matches what your code does. Don't copy a code just because another project used it.
- How do I check what my archive declares?
- In Xcode, choose Product > Archive, then Control-click the archive in the Organizer and choose Generate Privacy Report. Apple says it aggregates the privacy manifests from your app and the third-party SDKs it links to. For the file-level check, Flutter's guidance is to search the built app for .xcprivacy files.
Sources
- Apple Developer, Describing use of required reason API
- Apple Developer, NSPrivacyAccessedAPIType (categories and reason codes)
- Apple Developer, Privacy manifest files
- Apple Developer, Adding a privacy manifest to your app or third-party SDK
- Apple Developer, Describing data use in privacy manifests (privacy report)
- Apple Developer, Third-party SDK requirements
- Apple Developer, Upcoming requirements (Approved reasons for APIs, since May 1, 2024)
- Flutter on GitHub, issue 145269 (ITMS-91053 email text and the Flutter team's guidance)
- Flutter on GitHub, issue 131940 (privacy manifests in packages, and the warning about copying manifests)
- Flutter on GitHub, issue 156141 (ITMS-91061 email text, November 12, 2024)
- Flutter on GitHub, issue 163455 (ITMS-91061 email text, February 12, 2025)
- Flutter on GitHub, engine PrivacyInfo.xcprivacy for the iOS framework
- flutter/packages on GitHub, shared_preferences_foundation PrivacyInfo.xcprivacy
Related Resources
Related guides
Flutter UIScene Migration: Fix Launch Crashes on Xcode 27
Xcode 27 shipped on September 14, 2026, and Flutter's docs say Flutter iOS apps built with it that haven't adopted the UIScene lifecycle fail to launch. Which Flutter versions migrate automatically, the manual AppDelegate and Info.plist changes, and what plugins need, from Flutter's and Apple's docs checked October 18, 2026.
Read moreFlutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)
Flutter iOS build failing after upgrading Flutter, FlutterFire or Xcode? How to read the real error, then fix CocoaPods, deployment target and plugin version mismatches.
Read moreGoogle Play 16 KB Page Size: Fixing Flutter and Android Apps
Google Play requires apps targeting Android 15 and higher to support 16 KB memory page sizes on 64-bit devices, and Google says that from February 1, 2027 updates without it can't be released. How to check an APK, the AGP and NDK versions that fix it, and why Flutter 3.38 matters, from Google's and Flutter's docs checked October 18, 2026.
Read more