How it works
- Apps. We take the top free and top grossing iOS charts (iOS top free + top grossing · US, GB, DE) and read each app's developer website from its store listing. That URL is what the IAB app-ads.txt spec tells buyers to use.
- app-ads.txt. We fetch
https://<developer domain>/app-ads.txtand parse every line. - sellers.json. For the 60 ad systems most often authorized, we fetch their public sellers.json and look up every seller ID that apps list.
- Checks and grade. Each app gets findings with line-level evidence and a 0–100 score.
What we check
| Severity | Check | Meaning |
|---|---|---|
| critical | No app-ads.txt | No file at the developer domain. Graded only if the store says the app shows ads. |
| critical | No developer website | The store listing has no website, so buyers can't locate app-ads.txt. |
| info | Could not be fetched | The site answered 403/429/5xx (bot protection or rate limiting). Not graded. |
| critical | Empty app-ads.txt | The file exists but contains no valid seller lines. |
| warning | Seller IDs not in sellers.json | The ad system's own sellers.json doesn't list the account, so buyers can't verify the line. |
| warning | DIRECT lines pointing to intermediaries | Marked DIRECT, but the ad system lists the account as an INTERMEDIARY. |
| info | DIRECT accounts registered to another domain | The sellers.json entry names a different company domain. |
| info | DIRECT accounts marked confidential | Buyers can't see who owns the account. |
| warning | Malformed lines | Lines crawlers can't parse (missing .com, bad relationship field, etc.). |
| info | Duplicate lines | The same line appears more than once. |
| info | No OWNERDOMAIN | app-ads.txt 1.1 recommends declaring the owning company's domain. |
Grading
Penalties scale with the share of affected lines, not the count, so a 10,000-line file isn't punished for its size. Score = 100 − penalties. A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, F below.
Rules that keep it fair:
- Apps without app-ads.txt are not graded unless the store listing says they show ads. Many top apps don't sell in-app ads at all.
- If the site blocks our crawler (403, 429, bot challenge), the app is marked "could not be fetched", never "missing".
- If an ad system's sellers.json omits more than half of the IDs referenced across all apps, we treat the file as incomplete and don't use it against apps.
- Ad systems whose sellers.json we couldn't read are not checked, so their lines are never penalized.
This is a mechanical check of public files. A finding is not an accusation of fraud: most problems are stale lines left behind by closed accounts or copy-pasted partner lists.
Monitor your app
Continuous monitoring is in early access: weekly re-checks, alerts when a partner's account disappears from sellers.json, and a cleaned app-ads.txt you can deploy. Email [email protected] with your app's store link.
Corrections
If a finding is wrong (for example, an account belongs to your company under another domain), tell us and we'll
re-check within a week.
Email [email protected].
Adding OWNERDOMAIN to your app-ads.txt also resolves most domain mismatches automatically.
For agents and developers
The full index is published as JSON at data/apps.json and data/ad-systems.json, with a summary for language models at llms.txt. An MCP server for live audits is available on request.