Uploading App Privacy Details
Introduction
Apple announced that as of December 8, 2020, the App Store would start displaying detailed information about an app's privacy practices. App Store Connect will ask developers a series of questions on how privacy is respected over an array of categories. A category then allows for a selection of multiple purposes. After the purposes are selected, there are then questions on how the data is selected.
An example would be:
- Contact Info - Name
- Purposes:
- Product Personalization
- App Functionality
- Data Protections
- Data linked to user
- Data used to track user
- Purposes:
- Financial Info - Credit Card
- Purposes:
- App Functionality
- Data Protections
- Data not linked to user
- Purposes:

Uploading App Privacy Details with fastlane
fastlane has the ability to upload your app's app privacy details with the upload_app_privacy_details_to_app_store action. This action has two steps. The first is answering an interactive questionnaire (similar to what App Store Connect dashboard offers) and saving the answers to a JSON config file. The second is the upload of the app privacy answers to App Store Connect.
The action outputs a JSON config file to fastlane/app_privacy_details.json (by default) which will save your configuration. This JSON file is output so the answers can be saved in source control, reviewed by you or team members, and used for other apps. The JSON file can then be used again by this action (with the json_path option) to skip the interactive questions.
These two steps can be done together or separate.
Option 1: Answer and Upload Together
By default, upload_app_privacy_details_to_app_store will prompt you with questions and then upload them directly to App Store Connect. The action will also output a JSON config file to fastlane/app_privacy_details.json.
In CLI...
fastlane run upload_app_privacy_details_to_app_store \
username:"your@email.com" \
team_name:"Your Team" \
app_identifier:"com.your.bundle"
or in Fastfile...
upload_app_privacy_details_to_app_store(
username: "your@email.com",
team_name: "Your Team",
app_identifier: "com.your.bundle"
)
or in Fastfile.swift...
uploadAppPrivacyDetailsToAppStore(username: "your@email.com",
appIdentifier: "com.your.bundle",
teamName: "Your Team")
Option 2: Answer and Upload Separate
If you do not want to upload the app privacy details to App Store Connect right away, skip_upload:true can be passed to the action. This will prompt you with the interactive questions and save the JSON configuration file but that is it.
After reviewing the file, the same action can be used again with the json_path option to bypass the questions (since the answers are in the JSON file) and upload them right away to App Store Connect.
Step 1: Answering Questions
In CLI...
fastlane run upload_app_privacy_details_to_app_store \
username:"your@email.com" \
team_name:"Your Team" \
app_identifier:"com.your.bundle" \
skip_upload:true
or in Fastfile...
upload_app_privacy_details_to_app_store(
username: "your@email.com",
team_name: "Your Team",
app_identifier: "com.your.bundle",
skip_upload: true
)
or in Fastfile.swift...
uploadAppPrivacyDetailsToAppStore(username: "your@email.com",
appIdentifier: "com.your.bundle",
teamName: "Your Team",
skipUpload: true)

Step 2: Uploading
In CLI...
fastlane run upload_app_privacy_details_to_app_store \
username:"your@email.com" \
team_name:"Your Team" \
app_identifier:"com.your.bundle" \
json_path:"fastlane/app_privacy_details.json"
or in Fastfile...
upload_app_privacy_details_to_app_store(
username: "your@email.com",
team_name: "Your Team",
app_identifier: "com.your.bundle",
json_path: "fastlane/app_privacy_details.json"
)
or in Fastfile.swift...
uploadAppPrivacyDetailsToAppStore(username: "your@email.com",
appIdentifier: "com.your.bundle",
teamName: "Your Team",
jsonPath: "fastlane/app_privacy_details.json")

Requirements
This action requires an Apple ID with owner or admin permissions on the Apple Development team. The APIs this action uses are also not available on the official App Store Connect API so the App Store Connect API Key cannot be used at this time.
Example JSON configuration file
Below are two examples of the app_privacy_details.json file that upload_app_privacy_details_to_app_store action will create.
Not collecting data
This is what will be output if your app does not collect any data.
[
{
"data_protections": [
"DATA_NOT_COLLECTED"
]
}
]
Collecting data
This is what will be output that matches the example at the top of this page.
[
{
"category": "PAYMENT_INFORMATION",
"purposes": [
"APP_FUNCTIONALITY"
],
"data_protections": [
"DATA_NOT_LINKED_TO_YOU"
]
},
{
"category": "NAME",
"purposes": [
"PRODUCT_PERSONALIZATION",
"APP_FUNCTIONALITY"
],
"data_protections": [
"DATA_LINKED_TO_YOU",
"DATA_USED_TO_TRACK_YOU"
]
}
]
Data Values
These are the values you will see in your JSON configuration file. You won't need to ever manually enter these values in your JSON configuration file (as this is what the interactive questionnaire will output for you).
Categories
PAYMENT_INFORMATIONCREDIT_AND_FRAUDOTHER_FINANCIAL_INFOPRECISE_LOCATIONSENSITIVE_INFOPHYSICAL_ADDRESSEMAIL_ADDRESSNAMEPHONE_NUMBEROTHER_CONTACT_INFOCONTACTSEMAILS_OR_TEXT_MESSAGESPHOTOS_OR_VIDEOSAUDIOGAMEPLAY_CONTENTCUSTOMER_SUPPORTOTHER_USER_CONTENTBROWSING_HISTORYSEARCH_HISTORYUSER_IDDEVICE_IDPURCHASE_HISTORYPRODUCT_INTERACTIONADVERTISING_DATAOTHER_USAGE_DATACRASH_DATAPERFORMANCE_DATAOTHER_DIAGNOSTIC_DATAOTHER_DATAHEALTHFITNESSCOARSE_LOCATION
Purposes
THIRD_PARTY_ADVERTISINGDEVELOPERS_ADVERTISINGANALYTICSPRODUCT_PERSONALIZATIONAPP_FUNCTIONALITYOTHER_PURPOSES
Data Protections
- Uses
DATA_LINKED_TO_YOUorDATA_NOT_LINKED_TO_YOU - Optionally uses
DATA_USED_TO_TRACK_YOU