Apple App Privacy Labels Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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?
| Field | Type | Description |
|---|---|---|
appId | string | Numeric Apple app identifier |
appName | string | App name displayed by Apple |
developerName | string or null | Developer named in the privacy disclosure |
country | string | Requested two-letter storefront |
privacyPolicyUrl | string or null | Developer privacy-policy link |
privacyLabelStatus | string | available or not-provided |
privacyGroups | array | Normalized disclosure groups |
rawPrivacyText | string or null | Full extracted disclosure text |
sourceUrl | string | Canonical Apple App Store URL |
scrapedAt | string | ISO 8601 collection timestamp |
Each privacy group contains:
label: Apple’s display labelslug: stable machine-readable keydescription: Apple’s group explanationpurposes: purpose and data-type pairsdataTypes: deduplicated group-level data types
How to scrape Apple App privacy labels
- Open the Actor input page.
- Add one or more App Store URLs or numeric app IDs.
- Choose the storefront country.
- Keep concurrency low for reliable portfolio runs.
- Click Start.
- Open the dataset when the run finishes.
- 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 label | Stable slug |
|---|---|
| Data Used to Track You | data-used-to-track-you |
| Data Linked to You | data-linked-to-you |
| Data Not Linked to You | data-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
rawPrivacyTextfor 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 ApifyClientimport osclient = 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().itemsprint(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.
Related scrapers
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.