Apple App Privacy Labels Scraper avatar

Apple App Privacy Labels Scraper

Pricing

Pay per event

Go to Apify Store
Apple App Privacy Labels Scraper

Apple App Privacy Labels Scraper

🍎 Normalize Apple App Store privacy disclosures for compliance audits, vendor-risk reviews, and recurring app portfolio monitoring.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Extract and normalize Apple App Store privacy disclosures for compliance audits, vendor-risk reviews, app intelligence, and recurring portfolio monitoring.

Give the Actor public App Store URLs or numeric app IDs. It returns one stable snapshot per app and storefront, including Apple’s three privacy groups, purposes, data types, developer privacy-policy link, raw disclosure text, and collection timestamp.

What does Apple App Privacy Labels Scraper do?

Apple publishes standardized “privacy nutrition labels” on app product pages.

This Actor converts those labels into analysis-ready JSON.

It extracts:

  • App ID and app name
  • Developer name
  • Apple storefront country
  • Developer privacy-policy URL
  • Privacy-label availability status
  • Data Used to Track You
  • Data Linked to You
  • Data Not Linked to You
  • Purposes within each group
  • Data types within each purpose
  • Raw disclosure text
  • Canonical source URL
  • Scrape timestamp

Who is it for?

Mobile privacy and compliance teams

Audit first-party and third-party mobile apps without copying disclosures manually.

Vendor-risk analysts

Capture evidence for supplier reviews and compare disclosures across recurring assessments.

App-market intelligence teams

Monitor competitors’ declared data practices alongside rankings, releases, and pricing.

ASO and mobile agencies

Review a client portfolio across multiple Apple storefronts.

Researchers and journalists

Create structured datasets about declared tracking and data collection practices.

Why use this Actor?

  • Normalized output: stable group slugs simplify filtering and diffs.
  • Auditability: raw label text is retained with source and timestamp.
  • Batch support: process URLs and app IDs in one run.
  • Storefront control: select a two-letter country storefront.
  • Clear absence semantics: missing disclosures are not confused with request failures.
  • HTTP-first operation: no browser is required for ordinary public pages.

What data can you extract?

FieldTypeDescription
appIdstringNumeric Apple app identifier
appNamestringApp name displayed by Apple
developerNamestring or nullDeveloper named in the privacy disclosure
countrystringRequested two-letter storefront
privacyPolicyUrlstring or nullDeveloper privacy-policy link
privacyLabelStatusstringavailable or not-provided
privacyGroupsarrayNormalized disclosure groups
rawPrivacyTextstring or nullFull extracted disclosure text
sourceUrlstringCanonical Apple App Store URL
scrapedAtstringISO 8601 collection timestamp

Each privacy group contains:

  • label: Apple’s display label
  • slug: stable machine-readable key
  • description: Apple’s group explanation
  • purposes: purpose and data-type pairs
  • dataTypes: deduplicated group-level data types

How to scrape Apple App privacy labels

  1. Open the Actor input page.
  2. Add one or more App Store URLs or numeric app IDs.
  3. Choose the storefront country.
  4. Keep concurrency low for reliable portfolio runs.
  5. Click Start.
  6. Open the dataset when the run finishes.
  7. Export JSON, CSV, Excel, XML, or another supported format.

Input

App Store URLs

Use public product URLs such as:

https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580

The Actor extracts the numeric ID and rebuilds the URL for the selected storefront.

App IDs

You can provide IDs directly:

["324684580", "310633997", "874139669"]

Storefront country

Use a two-letter code such as us, gb, de, fr, or jp.

Privacy disclosures can vary by app and storefront.

Maximum concurrency

The accepted range is 1–3.

The default of 3 balances throughput, request reliability, and memory safety.

Input example

{
"appIds": [
"324684580",
"310633997",
"874139669"
],
"country": "us",
"maxConcurrency": 3
}

URLs and IDs can be combined in the same run.

Duplicate app IDs are requested only once.

Output example

{
"appId": "324684580",
"appName": "Spotify: Music and Podcasts",
"developerName": "Spotify",
"country": "us",
"privacyPolicyUrl": "http://www.spotify.com/legal/privacy-policy/",
"privacyLabelStatus": "available",
"privacyGroups": [
{
"label": "Data Used to Track You",
"slug": "data-used-to-track-you",
"description": "The following data may be used to track you...",
"purposes": [],
"dataTypes": ["Identifiers", "Usage Data"]
}
],
"rawPrivacyText": "App Privacy ...",
"sourceUrl": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580",
"scrapedAt": "2026-07-12T05:00:00.000Z"
}

Actual groups and data types depend on Apple’s current disclosure.

Privacy group normalization

The Actor recognizes three Apple labels:

Display labelStable slug
Data Used to Track Youdata-used-to-track-you
Data Linked to Youdata-linked-to-you
Data Not Linked to Youdata-not-linked-to-you

Both display labels and slugs are retained.

This makes exported data readable to people and stable for software.

Monitoring disclosure changes

Schedule the Actor daily, weekly, or monthly.

Store each run’s dataset or send it to your data warehouse.

Use appId, country, and group slug as stable comparison keys.

Typical changes to monitor include:

  • A new tracking group appears
  • A data type moves between linked and unlinked groups
  • A purpose is added or removed
  • The privacy-policy URL changes
  • A label changes from absent to available

How much does it cost to scrape Apple privacy labels?

The Actor uses pay-per-event pricing.

A small start event covers run initialization.

A result event is charged for each successfully stored app snapshot.

Failed URLs do not produce dataset records.

Exact tier prices are displayed on the Actor page before you start a run.

Larger subscription tiers receive lower per-result pricing.

Tips for reliable portfolio audits

  • Prefer numeric app IDs when app names may change.
  • Run separate jobs for storefronts you need to compare.
  • Keep concurrency at the default of 3 for large recurring jobs.
  • Preserve rawPrivacyText for evidence and troubleshooting.
  • Compare normalized slugs rather than display copy.
  • Treat Apple labels as developer declarations, not independently verified facts.

Error handling

Malformed URLs and IDs are rejected before requests begin.

HTTP failures are logged with their normalized source URL.

A valid fetched page with no privacy groups emits:

{"privacyLabelStatus":"not-provided"}

A failed request does not emit that status.

This distinction prevents false “no disclosure” findings.

Integrations

Google Sheets

Export CSV or connect through Make to maintain a review register.

Slack and email alerts

Compare the newest dataset with a prior snapshot and alert on changed groups.

Data warehouses

Load JSON into BigQuery, Snowflake, PostgreSQL, or another warehouse.

Webhooks

Use an Apify webhook to start downstream risk-scoring workflows after each run.

Zapier and Make

Trigger periodic audits and route changed disclosures to compliance owners.

API usage with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/apple-app-privacy-labels-scraper').call({
appIds: ['324684580', '310633997'],
country: 'us',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Apify API with Python

from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/apple-app-privacy-labels-scraper').call(run_input={
'appIds': ['324684580', '310633997'],
'country': 'us',
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Apify API with cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~apple-app-privacy-labels-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"appIds":["324684580"],"country":"us"}'

Poll the returned run ID or use a synchronous API endpoint when appropriate.

Use with MCP and AI agents

Connect the Actor through Apify’s MCP server. In Claude Code, run:

$claude mcp add --transport http apify https://mcp.apify.com/?tools=automation-lab/apple-app-privacy-labels-scraper

For Claude Desktop, Cursor, or VS Code, add this HTTP server to the client's MCP JSON configuration:

{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=automation-lab/apple-app-privacy-labels-scraper"
}
}
}

Restart the client after saving the configuration, then use actor-specific prompts such as:

Claude Code prompt:

Extract US App Store privacy labels for these app IDs and summarize every data type used for tracking.

Claude Desktop prompt:

Compare the linked-data disclosures for this vendor portfolio and flag apps with changed privacy-policy URLs.

Agent workflows can consume the stable JSON without parsing Apple’s page markup.

Scheduling

Use Apify schedules to run recurring portfolio snapshots.

Recommended cadence depends on risk:

  • Weekly for high-risk vendors
  • Monthly for ordinary supplier reviews
  • Quarterly for low-change internal portfolios
  • On demand before procurement or release approval

Name datasets or export snapshots with the run date for easy comparisons.

Export formats

Apify datasets support:

  • JSON
  • JSONL
  • CSV
  • Excel
  • XML
  • RSS

Nested privacy groups are richest in JSON and JSONL.

Flatten group data downstream when a spreadsheet workflow requires it.

Legality

The Actor accesses public App Store product pages.

Privacy labels are declarations supplied by app developers and displayed by Apple.

Apple states that this information has not necessarily been verified by Apple.

Use results as an input to review, not as proof of technical app behavior.

Follow applicable laws, contractual requirements, and Apple’s terms.

Do not use the Actor to collect personal data or bypass access controls.

Limitations

  • Apple can change page markup.
  • Disclosures may differ between storefronts.
  • Some apps may not provide a privacy label.
  • The Actor does not inspect application binaries or network traffic.
  • It reports declared practices, not observed runtime behavior.
  • Removed or unavailable apps can return HTTP errors.

FAQ

Can I use only an app ID?

Yes. Provide the numeric ID in appIds and select a storefront country.

Can I submit full URLs?

Yes. Add public product URLs to startUrls.

Can I mix URLs and IDs?

Yes. The Actor normalizes and deduplicates both lists.

Does it scrape reviews or rankings?

No. It specializes in App Privacy disclosures.

Why is privacyLabelStatus set to not-provided?

The page was fetched successfully but no recognized privacy groups were present.

Why did an app produce no record?

Check the run log for an invalid ID, unavailable storefront page, timeout, or HTTP error.

Why are there fewer than three groups?

Apple displays only groups relevant to the developer’s current declaration.

Are the declarations verified?

No. Apple notes that developer-supplied privacy information has not necessarily been verified.

Which export format should I use?

Use JSON or JSONL to preserve nested purposes and data-type arrays.

How do I compare two runs?

Join records by appId and country, then compare each privacy group by slug.

Combine this Actor with other automation-lab App Store actors when you also need general metadata, rankings, reviews, charts, or keyword intelligence.

Keep privacy-label snapshots separate from volatile review and ranking datasets so compliance diffs remain easy to audit.

Support

If a public App Store page contains a visible privacy label that was not extracted, open an issue from the Actor page.

Include:

  • The App Store URL
  • Storefront country
  • Run ID
  • Expected privacy group
  • Any relevant log message

This information helps reproduce markup and storefront differences quickly.