# App Store Privacy Labels Scraper - App Tracking & Data Audit (`suerte_enero/app-store-privacy-labels-scraper`) Actor

Scrape App Store privacy labels (nutrition labels) for any iOS apps, search results or top charts: Data Used to Track You, Data Linked to You, Data Not Linked to You, privacy policy URL and a 0-100 privacy score. Alerts when labels change.

- **URL**: https://apify.com/suerte_enero/app-store-privacy-labels-scraper.md
- **Developed by:** [Eduard Kalyta](https://apify.com/suerte_enero) (community)
- **Categories:** Developer tools, Marketing, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 apps

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## App Store Privacy Labels Scraper — privacy nutrition labels, app tracking & data audit

**App Store Privacy Labels Scraper** exports Apple's **App Store privacy nutrition labels** for any iOS apps, App Store search results or whole **top charts**: **Data Used to Track You**, **Data Linked to You**, **Data Not Linked to You** or "Data Not Collected", the developer's **privacy policy URL** and a **0-100 privacy score**. Schedule it to get alerts when an app **changes its privacy labels**.

Built for **app privacy audits**, compliance teams, journalists and researchers asking **which apps track you**, and for developers benchmarking their privacy label against competitors.

### What you get for every app

- `dataUsedToTrackYou`: data types used for tracking across other companies' apps and websites (e.g. Identifiers, Usage Data).
- `dataLinkedToYou`: data types linked to your identity (Contact Info, Location, Purchases, Health & Fitness, Search History…).
- `dataNotLinkedToYou`: data collected but not linked to identity.
- `dataNotCollected`: `true` when the developer declares no data collection.
- `tracksYou`, `categoryCount`, **`privacyScore`** (100 = collects nothing; tracking weighs most, then linked data, then anonymous data).
- `privacyPolicyUrl`, developer, category, rating count, App Store URL, and how the app was found (`input`, `search:vpn`, `chart:top-free#3`).
- **Change alerts**: with *Only new or changed labels* the next runs return only apps whose labels changed, with before → after.

### Audit a whole category in one run

```json
{
  "chart": "top-free",
  "chartCategory": "Health & Fitness",
  "maxAppsPerSource": 100,
  "countries": ["us"]
}
```

Or specific apps and searches:

```json
{
  "apps": ["https://apps.apple.com/us/app/tiktok/id835599320", "https://apps.apple.com/us/app/signal-private-messenger/id874139669"],
  "searchTerms": ["period tracker", "vpn"]
}
```

### Output example

Real records (29 Oct 2026, shortened):

```json
[
  {
    "name": "Signal - Private Messenger",
    "privacyScore": 99,
    "tracksYou": false,
    "dataUsedToTrackYou": [],
    "dataLinkedToYou": [],
    "dataNotLinkedToYou": ["Contact Info"],
    "privacyPolicyUrl": "https://signal.org/legal/",
    "foundVia": "input"
  },
  {
    "name": "Flo Cycle & Period Tracker",
    "privacyScore": 28,
    "tracksYou": true,
    "dataUsedToTrackYou": ["Identifiers", "Location", "Purchases", "Usage Data"],
    "dataLinkedToYou": ["Contact Info", "Diagnostics", "Health & Fitness", "Identifiers", "Location", "Purchases", "Search History", "Sensitive Info", "Usage Data", "User Content"],
    "categoryCount": 10,
    "privacyPolicyUrl": "https://flo.health/privacy-policy",
    "foundVia": "chart:top-free#3"
  }
]
```

### Use cases

- **Privacy audits**: which of the top 100 free Health & Fitness apps track users, and with which data.
- **Compliance & procurement**: check the App Store privacy label of every app before it is approved for company devices.
- **Journalism and research**: datasets on **apps that track you**, by category and country.
- **Competitive benchmarking for developers**: compare your privacy nutrition label with competitors before an App Store review.
- **Change monitoring**: get notified when an app starts tracking or adds new data types.

### Schedule it, get alerts, use it as an API

- **Schedule**: in Apify Console open *Schedules*, pick this Actor and run it daily (or hourly). Every run is compared with the previous one automatically.
- **Slack alerts**: paste a Slack incoming webhook into *Webhook URL* and choose *Slack message*. You get a readable digest at the end of each run.
- **Zapier, Make, n8n, your backend**: choose *JSON* webhook format, or call the Actor through the [Apify API](https://docs.apify.com/api/v2) and read the dataset.
- **Google Sheets / Excel**: set *Output format* to *Flat* and export the dataset as CSV or XLSX, or connect the Google Sheets integration.
- **AI agents (MCP)**: the Actor works as a tool in Apify's MCP server; the output schema is stable and every record carries `schemaVersion`.
- **Run summary**: each run stores `RUN_SUMMARY` in the key-value store (saved, charged, requests, warnings).

### Pricing

**$1 per 1,000 apps** (one app in one country). Auditing a full top-100 chart costs $0.10.

### FAQ

**What are App Store privacy nutrition labels?** Since December 2020 Apple requires developers to declare what data their app collects and whether it is used to track users. This Actor exports those declarations.

**Is the data verified by Apple?** No — labels are self-reported by developers, as shown on the App Store.

**What does "Data Used to Track You" mean?** Data linked with data from other companies' apps, websites or data brokers for targeted advertising or measurement, or shared with data brokers.

**Do labels differ by country?** Usually not, but they can; add several countries to compare.

**How is the privacy score calculated?** 100 minus 8 points per tracking data type, 4 per data type linked to you and 1.5 per data type not linked to you; "Data Not Collected" = 100.

**Do I need an API key?** No.

### App Store toolkit

Seven Actors on one engine, same input style and output conventions, made to be scheduled together:

| Actor | What it answers |
|---|---|
| [App Store Scraper](https://apify.com/suerte_enero/app-store-iap-competitors-scraper) | Everything about an app: details, 1-5 star ratings histogram, in-app purchase prices, privacy labels, app events, competitors |
| [App Store In-App Purchases Scraper](https://apify.com/suerte_enero/app-store-in-app-purchases-scraper) | In-app purchase and subscription prices in 100 countries side by side, in USD |
| [App Store Competitor Finder](https://apify.com/suerte_enero/app-store-competitor-finder) | The full competitor set of an app, compared field by field |
| [App Store Privacy Labels Scraper](https://apify.com/suerte_enero/app-store-privacy-labels-scraper) | What apps track and collect, for apps, searches and whole top charts |
| [App Store Top Charts](https://apify.com/suerte_enero/app-store-top-charts) | Who is in top free / paid / grossing per country and category, and who moved since yesterday |
| [App Store Keyword Rank Tracker](https://apify.com/suerte_enero/app-store-keyword-rank-tracker) | Where your app ranks for each keyword, keyword difficulty, Apple search suggestions |
| [App Store Ratings Tracker](https://apify.com/suerte_enero/app-store-ratings-tracker) | How people rate your app right now: new ratings per day and their average, 1-2 star share, version impact |

**Also for Android:** [Google Play Download Count](https://apify.com/suerte_enero/google-play-download-count-app-data) (exact installs) · [Google Play In-App Purchases & Price Tracker](https://apify.com/suerte_enero/google-play-in-app-purchases-price-tracker) · [Google Play Similar Apps & Competitors](https://apify.com/suerte_enero/google-play-similar-apps-competitors) · [Google Play Data Safety Scraper](https://apify.com/suerte_enero/google-play-data-safety-scraper) · [Google Play Developer Email & Contacts](https://apify.com/suerte_enero/google-play-developer-email-leads)

### Changelog

- **1.0 (Oct 2026)** — Privacy labels for apps, searches and top charts, privacy policy URL, privacy score, label change monitoring, Slack and JSON webhooks.

# Actor input Schema

## `apps` (type: `array`):

App Store URLs, ids or bundle ids.

## `searchTerms` (type: `array`):

Audit the top apps for an App Store search, e.g. "period tracker", "vpn".

## `chart` (type: `string`):

Audit a whole top chart: top-free, top-paid, top-grossing (and iPad / new variants).

## `chartCategory` (type: `string`):

Optional category for the chart, e.g. "Health & Fitness", "Finance", "Games".

## `maxAppsPerSource` (type: `integer`):

How many apps to take from each search term or chart.

## `countries` (type: `array`):

App Store countries as 2-letter codes (labels can differ by region).

## `maxConcurrency` (type: `integer`):

App pages loaded in parallel.

## `maxItems` (type: `integer`):

Stop after saving this many records. You are charged only for saved records.

## `onlyNew` (type: `boolean`):

Next runs save only new apps and apps whose privacy labels changed (recordType "updated" with before → after).

## `includeUpdated` (type: `boolean`):

In monitoring mode, also save known records whose important fields changed (date, price, sold out, venue…). They come with recordType "updated" and a list of changes.

## `monitorId` (type: `string`):

Optional name for the monitoring feed, e.g. "sf-ai-events". Runs with the same name share memory. Leave empty to derive it from the search settings.

## `memoryDays` (type: `integer`):

Monitoring memory forgets records not seen for this many days.

## `outputFormat` (type: `string`):

"full" keeps nested objects (best for JSON / API). "flat" turns them into plain columns for Excel and Google Sheets.

## `webhookUrl` (type: `string`):

Optional. At the end of the run, POST the saved records (up to 200) to this URL: Slack incoming webhook, Zapier, Make, n8n or your own endpoint. Not sent when nothing was saved.

## `webhookFormat` (type: `string`):

"slack" sends a readable message, "json" sends the records and run summary.

## `proxyConfiguration` (type: `object`):

Not needed in most cases. If the site starts throttling, the Actor switches to Apify Proxy by itself.

## Actor input object example

```json
{
  "apps": [
    "https://apps.apple.com/us/app/tiktok/id835599320",
    "https://apps.apple.com/us/app/signal-private-messenger/id874139669"
  ],
  "chart": "",
  "maxAppsPerSource": 100,
  "countries": [
    "us"
  ],
  "maxConcurrency": 4,
  "maxItems": 1000,
  "onlyNew": false,
  "includeUpdated": true,
  "memoryDays": 90,
  "outputFormat": "full",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `allFields` (type: `string`):

No description

## `runSummary` (type: `string`):

Saved, charged, new / updated / known records, requests and warnings.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "apps": [
        "https://apps.apple.com/us/app/tiktok/id835599320",
        "https://apps.apple.com/us/app/signal-private-messenger/id874139669"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("suerte_enero/app-store-privacy-labels-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "apps": [
        "https://apps.apple.com/us/app/tiktok/id835599320",
        "https://apps.apple.com/us/app/signal-private-messenger/id874139669",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("suerte_enero/app-store-privacy-labels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "apps": [
    "https://apps.apple.com/us/app/tiktok/id835599320",
    "https://apps.apple.com/us/app/signal-private-messenger/id874139669"
  ]
}' |
apify call suerte_enero/app-store-privacy-labels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,suerte_enero/app-store-privacy-labels-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WTeKe7w9vxsBLWS0m/builds/O3lyjdvpY2biFCaWI/openapi.json
