API

API reference

Query the same ranking the site shows. Create a key on your account. The reference below describes every endpoint that key can call.

Authentication

Send the key on every request:

Authorization: Bearer pb_live_...

A key belongs to the account that created it. Only a hash is stored, so a lost key cannot be shown again: revoke it and create another. A browser session cookie also works, for a call made while you are signed in. The daily limit applies to keys, not to clicks in the browser.

Plans and limits

Pro includes apps, rankings and developer lookup. Business adds the changes feed. Limits are requests per key per UTC day.

PlanRequests / dayEndpoints
Pro 1,000 /apps, /developers, /rankings, /developer/{id}
Business 20,000 Everything in Pro, plus /changes

CSV download stays on the ranking page. It is not an API call, and it has its own monthly row cap, shown on pricing.

Errors

StatusWhen
401No key, or a key that does not match.
402The plan does not include this endpoint. Pro calling /changes is a 402.
404No developer with that artist_id.
422A parameter is the wrong shape. On /apps, page must be 1–10,000 and per_page 1–200.
429That key has used its requests for the UTC day.

An unknown filter value is dropped and the request still succeeds. A type that is not one of Apple's categories is ignored, the same way an empty field on the ranking form is ignored.

Apps

GET /api/v1/apps is the filtered ranking. Pro and Business. The parameters are the same ones as the ranking page.

curl -H "Authorization: Bearer pb_live_..." \
  "https://privacybench.online/api/v1/apps?category=finance&country=us&ratings=100000&stars=4"

The body is page, per_page, total and results. Default page size is 50, and 200 is the most one page returns. Sort defaults to score descending. category is the genre slug from a ranking URL such as /board/category/finance.

ParameterWhat it matches
categoryGenre slug.
countryStorefront the app has charted in, such as us or de.
qText in the app name or the developer name.
gradeScore letter. Repeat the parameter, or send a comma-separated list. Letters: A, B, C, D, F.
trackingyes (Tracks users), no (No tracking), none (Declares no data collected).
typeOne of Apple's 16 data categories. Listed under allowed values.
detailA fine-grained type, such as Device ID. Listed under allowed values.
purposeWhy the developer says the data is used. Listed under allowed values.
grouptracking (To track you), linked (Linked to you), not_linked (Not linked to you). Applied only together with type, purpose or detail.
pricefree (Free), paid (Paid).
ratingsMinimum number of ratings: 1000, 10000, 100000, 1000000.
starsMinimum average rating: 3, 4, 4.5.
ageApp Store age rating: 4+, 9+, 12+, 13+, 16+, 17+, 18+.
updated30 (Last 30 days), 90 (Last 90 days), 365 (Last year), stale (Over a year ago).
parentParent company, spelled as on the ranking filter.
gap1 keeps apps that mention background location without a Location declaration.
sortscore (Score), name (App), size (Size), tracking (Tracking types), linked (Linked types), types (Total types), seller (Developer), popularity (Rating count). Anything else sorts by score.
orderdesc (default) or asc.
pageStarts at 1.
per_page1–200. Default 50.

Allowed values

Data categories for type:

Contact Info, Health & Fitness, Financial Info, Location, Sensitive Info, Contacts, User Content, Browsing History, Search History, Identifiers, Purchases, Usage Data, Diagnostics, Other Data, Surroundings, Body.

Fine types for detail:

Device ID, User ID, Email Address, Precise Location, Coarse Location.

Purposes:

Third-Party Advertising, Developer's Advertising or Marketing, Analytics, Product Personalization, App Functionality, Other Purposes.

Rankings

GET /api/v1/rankings is the shorter list: country, genre (also accepted as genre_slug), q, sort, order, page and per_page. A per_page above 200 is read as 200. For purpose, rating, tracking and the other filters, use /apps. The result shape is the same.

Developers

GET /api/v1/developers is one row per developer. Pro and Business. It takes the same parameters as /apps. A developer is included when at least one scored app matches. On a filtered request, apps and ranked count only those apps. With no filters, apps is the whole portfolio and ranked is how many of them have a score.

Sort is apps (default), score (average), name or tracking. Each result has artist_id, seller, apps, ranked, avg_score, tracking_apps, has_contact and parent_company when one has been recorded. The same list is on the developers page.

Two more parameters sit on the developer row. min_apps is a minimum for the apps count on that row: 2, 5, 10, 25, 50, 100. With other filters on, that count is the matching apps; otherwise it is the whole portfolio. contact is yes or no. yes means an email, phone or address is already stored from the EU trader block. That block is collected by a separate pass, so no also covers developers the pass has not reached yet.

One developer

GET /api/v1/developer/{artist_id} looks up one App Store developer id. Pro and Business. Unknown ids are 404.

summary has apps, ranked, avg_score and seller. apps is a page of that developer's apps: track_id, name, genre, genre_slug, artwork_url, score, tracking_types, linked_types, total_types, file_size_bytes. page and per_page work as on rankings, with the same cap of 200.

Changes

GET /api/v1/changes is Business only. Each result is one app whose declared categories differ between its two latest labeled snapshots: track_id, name, genre, genre_slug, captured_at, old_score, new_score, and added / removed. Each added or removed item is {"group", "data_type"}, where data_type is a category such as Location, not a fine type.

Without track_id, the feed covers changes in the last 60 days. limit defaults to 100 and stops at 500. With track_id, the comparison is that app's two latest labeled snapshots, however old the previous one is.

Fields on an app

Each object in /apps and /rankings results is one ranked app. Times are ISO 8601.

FieldMeaning
track_idApple's numeric app id.
name, seller, bundle_idListing name, developer, bundle id.
genre, genre_slugCategory name, and the slug category filters on.
scorePrivacy score, 0–100. Higher means more declared collection. See the methodology.
tracking_types, linked_types, not_linked_types, total_typesHow many distinct data categories sit in each group.
purpose_countHow many distinct purposes the label names.
average_rating, rating_countApp Store rating. Rating count is a reach signal, not a download estimate.
version, file_size_bytes, captured_atThe snapshot this row was scored from.
countriesStorefront codes where the app has appeared on a chart.
overall_rank, category_rankRank by score, overall and inside the genre. 1 is the highest score.
artwork_urlApp icon.

Labels are what developers declare. They are not a measurement of what an app does. Questions about a response: [email protected].