Guide · App Store Connect

App Store privacy labels: how to fill in App Privacy

App Store privacy labels are the App Privacy section of your product page, built from the answers you give under App Privacy in App Store Connect. You declare each data type you and your third-party SDKs collect, its purposes, and whether it's linked to the user or used for tracking, then click Publish.

The label sorts data into Data Used to Track You, Data Linked to You and Data Not Linked to You, or shows Data Not Collected. Answers are required to submit new apps and updates, cover every platform the app runs on, and can change at any time without an app update. The App Store Connect API can't read or write them, and your PrivacyInfo.xcprivacy files don't fill them in: manifests feed Xcode's privacy report, which you use as a reference while you answer by hand.

By Redjan Hysa, founder of MetaRun · Facts checked October 12, 2026

data types in 16 categories
35
purposes you can pick per data type
6
label sections, or Data Not Collected
3
required reason API categories for privacy manifests
5
App Privacy can't be read or written through the App Store Connect API
No API
answers can change without an app update
Anytime
01 · Reference

Reference tables

App Privacy data types
CategoryData typesNotes from Apple's definitions
Contact InfoName, Email Address, Phone Number, Physical Address, Other User Contact InfoHashed emails and phone numbers still count
Health & FitnessHealth, FitnessIncludes HealthKit, Clinical Health Records and Motion and Fitness API data
Financial InfoPayment Info, Credit Info, Other Financial InfoPayment details entered in a payment service you never see aren't collected
LocationPrecise Location, Coarse LocationPrecise means latitude and longitude to three or more decimal places
Sensitive InfoSensitive InfoSuch as racial or ethnic data, sexual orientation, disability, religious beliefs, biometric data
ContactsContactsThe user's address book or social graph
User ContentEmails or Text Messages, Photos or Videos, Audio Data, Gameplay Content, Customer Support, Other User ContentIn-app messages between users count as text messages
Browsing HistoryBrowsing HistoryContent viewed outside the app, such as websites
Search HistorySearch HistorySearches performed in the app
IdentifiersUser ID, Device IDDevice ID includes the advertising identifier
PurchasesPurchase HistoryPurchases or purchase tendencies
Usage DataProduct Interaction, Advertising Data, Other Usage DataLaunches, taps, scrolling, video views; ads the user has seen
DiagnosticsCrash Data, Performance Data, Other Diagnostic DataCrash logs, launch time, hang rate, energy use
SurroundingsEnvironment ScanningMesh, planes, scene classification, image detection
BodyHands, HeadHand structure and movement, head movement
Other DataOther Data TypesAnything not listed above

Apple's list from App privacy details on the App Store. Privacy manifests use the same 35 types as NSPrivacyCollectedDataType values.

The six purposes
PurposeWhat Apple means
Third-Party AdvertisingShowing third-party ads in your app, or sharing data with entities that show third-party ads
Developer's Advertising or MarketingYour own ads in the app, marketing messages to your users, or sharing data with entities that show your ads
AnalyticsEvaluating user behavior, including feature effectiveness, planning features, or measuring audience size or characteristics
Product PersonalizationCustomizing what the user sees, such as recommended products, posts or suggestions
App FunctionalityAuthentication, features, fraud prevention, security, server uptime, fewer crashes, performance, customer support
Other PurposesAnything not listed

One data type can have several purposes. Apple's example: an email used to sign in and to personalize the app is App Functionality and Product Personalization.

Required reason API categories
NSPrivacyAccessedAPITypeAPIs it covers (examples)A common approved reason
NSPrivacyAccessedAPICategoryUserDefaultsUserDefaultsCA92.1: read and write data only the app itself can access
NSPrivacyAccessedAPICategoryFileTimestampcreationDate, modificationDate, stat, getattrlistC617.1: timestamps of files in the app, app group or CloudKit container
NSPrivacyAccessedAPICategorySystemBootTimesystemUptime, mach_absolute_time()35F9.1: measure time between events in the app
NSPrivacyAccessedAPICategoryDiskSpacevolumeAvailableCapacityKey, systemFreeSize, statfsE174.1: check there's room before writing files
NSPrivacyAccessedAPICategoryActiveKeyboardsactiveInputModes3EC4.1: the app is a custom keyboard

Declare the reason that matches your use; each category has other approved reasons in Apple's NSPrivacyAccessedAPIType reference.

02 · By hand

How to fill in App Privacy in App Store Connect

You need the Account Holder, Admin or App Manager role.

  1. 01

    Open App Privacy

    In Apps, select the app, click App Privacy in the sidebar, then Get Started.

  2. 02

    Say whether you collect data

    Select "No, we do not collect data from this app" and Save if nothing is collected. Otherwise select "Yes, we collect data from this app", click Next, tick every type you or your third-party partners collect, and Save.

  3. 03

    Answer each data type

    Under Data Types, click each type and answer its questions: the purposes, whether it's linked to the user's identity, and whether it's used for tracking.

  4. 04

    Preview and publish

    Check Product Page Preview, then click Publish at the top right and confirm. On an app not yet live, the label goes live with the product page.

  5. 05

    Set the privacy policy URL

    Next to Privacy Policy, click Edit, enter the URL (plus an optional privacy choices URL) and Save. URL changes release with your next app version.

03 · Briefing

What counts as collecting data

Apple defines collecting as transmitting data off the device in a way that lets you or your third-party partners access it for longer than it takes to service the request. Data processed only on the device isn't collected. Neither is an IP address or auth token sent with a request and not kept, and you don't declare what Apple itself collects through App Analytics or In-App Purchase payments.

A few things surprise people. Data collected only for app functionality still has to be declared. A web view's traffic counts unless the user is browsing the open web. Free-text fields count as Other User Content, but if you ask for something specific, like a name, declare that type.

04 · Briefing

Data Linked to You vs Data Not Linked to You

Data is linked when it's tied to the user's identity through their account, device or other details, which is the default. To call it not linked, you strip direct identifiers like the user ID before collection, never try to link it back afterwards, and never join it with datasets that would re-identify the user. Apple adds that anything counted as personal information or personal data under privacy law is linked.

05 · Briefing

What Apple means by tracking (Data Used to Track You)

Tracking means linking data from your app about a user or device with data from other companies' apps, websites or offline properties for targeted advertising or ad measurement, or sharing it with a data broker. That includes embedding an SDK that combines your users' data with other developers' apps for advertising, even if you never use that feature. Linking data only on the device, or sharing it with a data broker solely for fraud prevention or security, isn't tracking.

If you track, you need permission through the App Tracking Transparency framework, and the advertising identifier is all zeros until the user allows it. In a privacy manifest, NSPrivacyTracking set to true requires NSPrivacyTrackingDomains; requests to those domains fail until the user grants permission.

06 · Briefing

Third-party SDK privacy: their data is your label

Apple requires your answers to cover every third-party partner whose code is in your app: analytics, ads, crash reporting, sign-in. A crash reporter that uploads logs puts Crash Data on your label.

Apple also publishes a list of commonly used SDKs, Firebase, Facebook, OneSignal, Alamofire, Flutter plug-ins and others among them, that must include a privacy manifest (and a signature when used as a binary) when you submit a new app with them or an update that adds one. Update old versions of those SDKs before you submit.

07 · Briefing

Privacy manifests (PrivacyInfo.xcprivacy) and App Store Connect

A privacy manifest is a property list named PrivacyInfo.xcprivacy that your app and each SDK bundle. It records NSPrivacyCollectedDataTypes (each type with linked, tracking and purposes), NSPrivacyTracking, NSPrivacyTrackingDomains and NSPrivacyAccessedAPITypes. To see the combined picture, archive the app (Product > Archive), Control-click the archive in the Organizer and choose Generate Privacy Report. Apple's docs say to refer to that report when you provide your privacy details.

That's the whole link between the two. App Store Connect doesn't import the manifests, and App Privacy has no endpoint in the App Store Connect API, so the questionnaire is answered by hand in the browser. MetaRun's apple_build_privacy_answers tool reads the manifests of your app and its SDKs and returns the exact answers to tick, merged so the strictest declaration wins, plus anything App Review would flag.

08 · Briefing

Required reason APIs

Some APIs can be misused to fingerprint a device, so on iOS, iPadOS, tvOS, visionOS and watchOS you must declare why you use them, in five categories (table above), and use them only for those reasons. The declaration goes in the manifest of the bundle that contains the calling code, your app's for your code and the SDK's for its own; Apple says an SDK can't rely on the app's manifest. Since May 1, 2024, App Store Connect doesn't accept apps that use these APIs without a declared reason.

09 · Briefing

When you must update your App Privacy answers

Whenever your practices change: a new or removed SDK, a feature that sends new data off the device, a new purpose such as ads. You can update answers at any time without an app update, and publishing means agreeing to update them promptly. Apple's help also says answers should reflect the version that's on the App Store, so in practice publish the change when the version that causes it goes live.

10 · Troubleshooting

Common problems and how to fix them

App privacy details missing: can't submit for review

Why: App Privacy answers are required for new apps and updates, and they must be published, not only saved. They live under App Privacy in the sidebar, outside the version page, so they're easy to miss on a first submission.

Fix: Open App Privacy, answer every data type (or choose that you don't collect data) and click Publish. It takes the Account Holder, Admin or App Manager role.

ITMS-91053: Missing API declaration

Why: The email names a file whose code uses a required reason API category, such as NSPrivacyAccessedAPICategoryUserDefaults, with no matching entry in that bundle's privacy manifest. Early emails said no action was required yet; since May 1, 2024, App Store Connect rejects such builds.

Fix: If the file is your app, add an NSPrivacyAccessedAPITypes entry with an approved reason (CA92.1 for ordinary UserDefaults use) to your PrivacyInfo.xcprivacy. If it's an SDK, update it to a version that ships its own manifest. Then upload a new build.

ITMS-91056: Invalid privacy manifest

Why: A PrivacyInfo.xcprivacy in the bundle has unknown keys or values, or isn't a well-formed property list. App Store Connect rejects submissions that contain one.

Fix: Open the file the email names, check every key and value against Apple's documentation (TN3181 lists the usual mistakes), and fix it or update the SDK it came from.

Privacy label shows data you don't collect

Why: Usually an SDK: Apple counts your third-party partners' collection as yours. Otherwise the answers predate a change, or they include data that doesn't count, such as data processed only on the device.

Fix: Compare the Xcode privacy report with the label. Remove types nothing in the shipping version collects (Data Types, Edit, then Publish), and reconfigure or replace an SDK that collects more than you want declared.

Privacy policy URL is required

Why: Every app needs a privacy policy URL in App Store Connect (tvOS apps add privacy policy text), and guideline 5.1.1(i) also wants an easy-to-find link inside the app.

Fix: Under App Privacy, click Edit next to Privacy Policy and add a public URL. Per 5.1.1(i), the policy must say what you collect, how and why, that third parties protect it equally, and how users can revoke consent or request deletion.

11 · With an AI agent

Do it from Claude Code, Codex, Cursor or Xcode with MetaRun

App Privacy is the questionnaire behind your App Store privacy label: 35 data types, six purposes, linked or not, tracking or not, for your code and every SDK you ship. Getting it wrong is a common rejection, and Apple's API can't read or write it.

A coding agent has the input App Privacy needs: your PrivacyInfo.xcprivacy and the ones inside each Swift package or pod. MetaRun maps them one to one onto App Store Connect's answers and flags what App Review rejects. The age rating and export compliance do have an API, and go through previews.

Before you start

  • Your app's PrivacyInfo.xcprivacy and each SDK's.
  • Access to App Store Connect in a browser, to enter the App Privacy answers.
  • The age rating questionnaire's facts: user content, web access, purchases.

How the agent runs it

  1. 01

    Collect the manifests

    Your agent finds your app's PrivacyInfo.xcprivacy and each SDK's: Swift packages under DerivedData's SourcePackages checkouts, CocoaPods under Pods.

  2. 02

    Build the answers

    MetaRun merges them strictest-wins and returns every data type to tick, whether it's linked to the user or used for tracking, its purposes, and how the label will read.

  3. 03

    Fix what review would reject

    Findings name the problems App Review flags: unknown keys, a data type with no purpose, tracking declared with nothing marked for tracking, missing tracking domains.

  4. 04

    Enter and publish

    Because App Privacy has no API, you enter the answers in App Store Connect; MetaRun returns the steps and a link to the right page. Age rating and compliance apply through previews.

An example session

Find every PrivacyInfo.xcprivacy in this repo and in DerivedData's SourcePackages, build our App Privacy answers, and list anything App Review would reject.

  1. apple_build_privacy_answersAnswers built from four manifests, with one finding: an SDK declares tracking without a tracking domain.
  2. apple_get_age_rating_declarationThree age rating questions were never answered.
  3. apple_preview_set_age_ratingPreview: your answers plus the three unanswered questions, listed so you can see them.
  4. Your agent asks before running apple_apply_set_age_rating. You read the preview above and approve.
  5. apple_apply_set_age_ratingApplied. Apple derives the rating from the answers.

Illustrative: your apps, versions and numbers will differ. The tool names and their order are real.

The MetaRun tools involved

ToolWhat it does
apple_build_privacy_answersreadTurns PrivacyInfo.xcprivacy files into App Privacy answers, with findings App Review rejects.
apple_get_age_rating_declarationreadThe age rating questionnaire as answered now.
apple_preview_set_age_ratingpreview + applyAnswer or change the questionnaire, and overrides.
apple_list_encryption_declarationsreadExisting export compliance declarations.
apple_preview_declare_build_encryptionpreview + applyAnswer export compliance for a build.
apple_preview_set_content_rightspreview + applyDeclare whether the app uses third-party content.
apple_list_accessibility_declarationsreadAccessibility Nutrition Labels per device family.
apple_preview_set_accessibility_declarationpreview + applyDeclare which accessibility features the app supports.

Each preview has an apply twin that only runs with the confirm token from a fresh preview, and refuses if App Store Connect changed in between.

What Apple enforces along the way

App Privacy has no API

There's no App Store Connect API endpoint for App Privacy at all. MetaRun builds the answers and the label; publishing them is done in App Store Connect.

Unanswered isn't the same as No

Apple stores an unanswered age rating question as empty, not No. An override sent on an empty questionnaire comes back as a server error, so MetaRun stages every unanswered question alongside your edits and lists them for you to see.

Korea's override needs the right category

Apple only accepts a Korea age rating override for apps in the Games or Entertainment category. The preview warns before the attempt instead of letting Apple refuse it.

Compliance declarations are permanent

An export compliance declaration can't be withdrawn once assigned to a build. Setting ITSAppUsesNonExemptEncryption in Info.plist avoids the question for future builds.

Set up your agent

Connect once, then ask in plain words. Pick your agent:

Claude Code Anthropic

Run claude mcp add --transport http --scope user metarun https://metarun.dev/api/mcp, then run /mcp in Claude Code and sign in to MetaRun in your browser.

01 · Add the server

Run it in any terminal. --scope user makes MetaRun available in every project; leave it out to limit it to the current one.

claude mcp add --transport http --scope user metarun https://metarun.dev/api/mcp

02 · Sign in

In a Claude Code session, run /mcp, choose metarun and authenticate. MetaRun opens in your browser, where you pick read-only or read and change. From a plain shell, claude mcp login metarun does the same.

/mcp

03 · Optional: add the skills too

The MetaRun plug-in bundles the same server with six mission skills (release handoff, worldwide pricing, localization, review inbox, ASO audit, store media).

claude plugin marketplace add metarun/metarun-skills
claude plugin install metarun-skills@metarun

Then ask Claude Code

  • Ask Claude Code: Find every PrivacyInfo.xcprivacy in this repo and in DerivedData's SourcePackages, build our App Privacy answers, and list anything App Review would reject.
  • Ask Claude Code: Our analytics SDK isn't declaring a tracking domain. Check its manifest and tell me what the label will say.
  • Ask Claude Code: Walk me through the age rating questionnaire for com.example.app and stage the answers.

claude -p runs one request with no interactive session. The browser sign-in can't complete inside -p, so sign in once interactively first, or configure the server with a personal access token in CI. Tools missing from --allowedTools are refused in -p mode.

Read-only check, safe to schedule

claude -p "Build the App Privacy answers from the PrivacyInfo.xcprivacy files in this repository and list every finding App Review would reject. Read only." \
  --allowedTools "mcp__metarun__apple_build_privacy_answers,mcp__metarun__apple_get_age_rating_declaration,mcp__metarun__apple_preview_set_age_rating,mcp__metarun__apple_list_encryption_declarations,mcp__metarun__apple_preview_declare_build_encryption,mcp__metarun__apple_preview_set_content_rights,mcp__metarun__apple_list_accessibility_declarations,mcp__metarun__apple_preview_set_accessibility_declaration"

Only reads and previews are on that list, so nothing can reach App Store Connect unattended. Run applies in an interactive session where Claude Code can ask you.

Full Claude Code setup guide

Codex OpenAI

Run codex mcp add metarun --url https://metarun.dev/api/mcp; Codex detects MetaRun's sign-in and opens it in your browser.

01 · Add the server

Codex sees that MetaRun offers sign-in and starts it straight away, in your browser. Pick read-only or read and change.

codex mcp add metarun --url https://metarun.dev/api/mcp

02 · Sign in again later

If the sign-in expires or you disconnected it in MetaRun's settings. --no-browser prints the link instead, for SSH sessions.

codex mcp login metarun

03 · Or edit ~/.codex/config.toml

The Codex CLI, the IDE extension and Codex in the ChatGPT desktop app read the same file, so one entry covers all three.

[mcp_servers.metarun]
url = "https://metarun.dev/api/mcp"

Then ask Codex

  • Ask Codex: Find every PrivacyInfo.xcprivacy in this repo and in DerivedData's SourcePackages, build our App Privacy answers, and list anything App Review would reject.
  • Ask Codex: Our analytics SDK isn't declaring a tracking domain. Check its manifest and tell me what the label will say.
  • Ask Codex: Walk me through the age rating questionnaire for com.example.app and stage the answers.

codex exec runs one request without an interactive session and with its approval policy set to never. MetaRun's reads and previews still run, because they're marked read-only; anything that would ask is refused.

Read-only check, safe to schedule

codex exec "Build the App Privacy answers from the PrivacyInfo.xcprivacy files in this repository and list every finding App Review would reject. Read only."

Applies are refused in codex exec by design. Don't set MetaRun's approval mode to approve just to make them pass; keep App Store changes in an interactive session.

Full Codex setup guide

Cursor Anysphere

Add https://metarun.dev/api/mcp to ~/.cursor/mcp.json (or use the install link) and sign in to MetaRun when Cursor opens your browser.

01 · Add to ~/.cursor/mcp.json (or .cursor/mcp.json for one project)

{
  "mcpServers": {
    "metarun": {
      "url": "https://metarun.dev/api/mcp"
    }
  }
}

02 · Or use the install link

Opens Cursor with the server filled in.

https://cursor.com/link/mcp/install?name=metarun&config=eyJ1cmwiOiJodHRwczovL21ldGFydW4uZGV2L2FwaS9tY3AifQ%3D%3D

03 · Sign in

When Cursor connects, MetaRun opens in your browser. Pick read-only or read and change, and you're back in the editor with the tools listed under MCP.

Then ask Cursor

  • Ask Cursor: Build App Privacy answers from @PrivacyInfo.xcprivacy and the Pods manifests.
  • Ask Cursor: Does our label say we track users? Why?
  • Ask Cursor: Set content rights to 'no third-party content'.

The Cursor CLI runs one request without the editor with agent -p. Allow only the read tools the request needs in ~/.cursor/cli-config.json (Mcp(metarun:tool_name) rules), and keep MetaRun's apply tools out of that list.

Read-only check, safe to schedule

agent -p "Build the App Privacy answers from the PrivacyInfo.xcprivacy files in this repository and list every finding App Review would reject. Read only." --output-format json

Don't run it with --force for MetaRun: that approves every tool, applies included.

Full Cursor setup guide

Xcode Apple

In Xcode 27, add the plug-in from https://github.com/metarun/metarun-skills (Settings, Intelligence, Plug-ins, Add from URL) and click Sign in next to MetaRun.

01 · Add the MetaRun plug-in

In Xcode 27, open Settings, Intelligence, Plug-ins. Choose Add Plug-in, then Add from URL, and paste:

https://github.com/metarun/metarun-skills

02 · Or with one click

Opens Xcode's plug-in sheet with the repository filled in.

xcode://agent-plugin-clone?repo=https%3A%2F%2Fgithub.com%2Fmetarun%2Fmetarun-skills

03 · Sign in

Install MetaRun from the list, then click Sign in next to it. MetaRun opens in your browser; pick read-only or read and change.

04 · Ask the coding assistant

Claude Agent, Codex and Gemini in Xcode all get MetaRun's tools and its six workflow skills.

Attach build 312 to version 2.4 and tell me what blocks submission.

Then ask Xcode

  • Ask Xcode: Read the privacy manifests in this project and its packages and give me the App Privacy answers to enter.
  • Ask Xcode: Set ITSAppUsesNonExemptEncryption correctly in Info.plist, then check build 312's compliance.
  • Ask Xcode: Declare VoiceOver and Dynamic Type support in our accessibility labels for iPhone.

Full Xcode setup guide

Claude Anthropic

In Claude, open Customize, Connectors, Add custom connector, paste https://metarun.dev/api/mcp and click Connect to sign in to MetaRun.

01 · Add a custom connector

In Claude, open Customize, then Connectors, and choose Add custom connector. Name it MetaRun and paste the server URL:

https://metarun.dev/api/mcp

02 · Connect

Click Connect. Claude opens MetaRun in your browser to sign in; pick read-only or read and change.

03 · Team and Enterprise

An Owner adds the connector once under Organization settings, Connectors. Each member then clicks Connect and signs in to their own MetaRun account.

Then ask Claude

  • Ask Claude: What do I need to declare for App Privacy if I use Firebase Analytics?
  • Ask Claude: Fill in my age rating questionnaire. It's a meditation app with no user content.
  • Ask Claude: Is export compliance answered for my latest build?

Full Claude setup guide

Apple key stays on MetaRun, encryptedPreview before every writeRecorded, revertible from history
12 · FAQ

Frequently asked questions

What does "Data Used to Track You" mean on the App Store?

The app links data about you with other companies' data for targeted ads or ad measurement, or shares it with a data broker. It needs your permission through App Tracking Transparency.

What does "Data Linked to You" mean?

The data is tied to your identity through your account, device or other details. Data Not Linked to You has had identifiers stripped before collection and is never re-linked.

Does a privacy manifest fill in App Privacy in App Store Connect?

No. The manifests feed Xcode's privacy report, which Apple tells you to use as a reference; you still answer App Privacy by hand and publish it.

Do I have to declare data collected by third-party SDKs?

Yes. Your answers must include the practices of every third-party partner whose code is in the app.

Do I need to update App Privacy for every app update?

Only when your data practices change. Answers aren't tied to a version and can be published at any time, but they must stay accurate.

Can the App Store Connect API update App Privacy answers?

No. There's no App Privacy endpoint in the App Store Connect API, so answers are entered in the browser. The privacy policy URL is an API field, though.

Can your agent fill in App Privacy for me?

It can do all the thinking: your agent reads the manifests and MetaRun produces the exact answers and the label. The last step, entering them in App Store Connect, is manual because Apple offers no API for App Privacy.

Which manifests should it read?

Your app's own PrivacyInfo.xcprivacy and every SDK's: Swift packages under DerivedData/<project>/SourcePackages/checkouts, CocoaPods under Pods. App Privacy covers everything the app links.

Can it set the age rating?

Yes. The questionnaire has an API, so your agent reads it, stages your answers through a preview, and applies on your approval.

What about export compliance?

Per build, via apple_preview_declare_build_encryption. It's permanent for that build, so the preview says so before you approve.

13 · Sources

Sources

Related guides

Guide

Submit for review

The pre-submission checklist, every review status, export compliance, rejections and expedites.

Guide

TestFlight testers

Internal vs external testers, Beta App Review, public links, and every reason testers see no builds.

Guide

App Store Connect API key

Create a team or individual key, pick the right role, find the Key ID and Issuer ID, and fix 401 and 403 errors.

Guide

Localize your listing

All 50 App Store languages with their codes, which storefronts show and search each one, and how to add, remove or switch the primary language.

All guides

Every App Store Connect guide

Releases, TestFlight, pricing, subscriptions, localization, screenshots and more.

With MetaRun: App Store Connect MCP server

MetaRun

Do this from your AI agent or MetaRun's dashboard, with a preview before every change. 14-day free trial, no card.