Or try one:
Why AdMob says it can't find your file
AdMob doesn't look on whatever site you think of as yours. It reads the developer website from the store listing, takes that exact host, and asks for /app-ads.txt at its root. Most “not found” messages we've seen come down to one of these:
- The listing names a different site. One of our apps listed its own subdomain as the website, and that subdomain had no file, while the main domain had a perfect one. The checker starts from the listing for this reason.
- www and bare aren't the same host. If the listing says
www.example.comand the file only lives onexample.com, that's a miss. A redirect between the two usually works, but serving the file on both is safer. - The site answers every address with its home page. Single-page sites and some hosts do this, so
/app-ads.txt“exists” but is HTML. - The line has the app id, not the publisher id. AdMob app ids look like
ca-app-pub-…~…. The file wantsgoogle.com, pub-and the 16 digits, thenDIRECT, f08c47fec0942fa0. - It's just early. Right after you link a store listing, AdMob says it couldn't verify. The crawler takes a day or more to come round, and AdMob gives it up to a week. If this checker passes, wait before changing anything.
What gets checked
The format is the IAB Tech Lab's app-ads.txt spec. Each record has three or four comma-separated fields: the ad system's domain, your account id with it, DIRECT or RESELLER, and an optional certification id. The checker flags lines with the wrong number of fields, a URL where the domain should be, or a misspelt DIRECT. It also catches curly quotes or invisible characters pasted from a document, a known network's certification id that doesn't match, repeated lines, and variables the spec doesn't define.
It also reports how the file was served: missing, redirected, sent as HTML, sent as something other than text/plain, or saved with a byte order mark. It doesn't check sellers.json, because Google's is many megabytes.
Privacy
An App Store link is looked up with Apple's public lookup API from your browser. A Play listing and the app-ads.txt file are fetched by our server, because browsers can't read another site's files. It only ever asks for the public Play page and https:// plus the host plus /app-ads.txt, and keeps the answer for ten minutes so repeat checks don't hit the site again. Your publisher id is checked in your browser and never sent. We keep no log of what was checked.
Catch it before release
A broken app-ads.txt is usually the last symptom of an ad setup problem that started in the app: a sample ad unit id left in, a sibling app's ids copied into a fork, or a consent form that never shows. Our App Compliance skill for Claude Code checks those in the source before you build. It works with Flutter, React Native and Expo apps.
The store listing checker is the other free tool here.