
app-ads.txt is a plain text file that lists every company authorized to sell ads in your mobile or CTV app. It sits at the root of the developer website named in your app store listing, and ad buyers check it before they bid, so a missing or wrong file costs demand.
The frustrating part is that the file's lines are rarely the problem. Most app-ads.txt errors trace back to the developer website in the store listing: a missing URL, a social page you can't upload to, or an old domain. This guide covers the format, where to host the file, how crawlers find it and how to fix each issue AdMob reports. It builds on our ads.txt guide for websites, which uses the same line format. If you run several ad networks in one app, our app monetization service shows how we help with demand and setup.
What is app-ads.txt and why does it matter?
app-ads.txt is the app version of ads.txt, an IAB Tech Lab standard that lets buyers confirm a seller may sell your inventory. Apps have no web domain of their own, so the file lives on the website your store listing points to.
app-ads.txt stops spoofing. Without a public list, anyone can claim to sell ads in a popular app and pass off cheap inventory under its name. With one, buyers compare the seller ID in each bid request with your list and skip the ones that don't match. The IAB spec covers apps from mobile app stores, connected TV app stores and other channels, so Roku, Fire TV and smart TV apps need it as much as Android and iOS apps do.
It also hits revenue directly. Google's AdMob help says ad sources that have adopted the standard only buy on apps with a verified file. That's why AdMob flags an app with a file problem as having revenue at risk.
app-ads.txt vs ads.txt
The two files share one line format, but they live in different places and buyers find them in different ways. The IAB app-ads.txt specification says the structure and content are the same as ads.txt for the web.
| ads.txt | app-ads.txt | |
|---|---|---|
| Inventory it covers | Websites | Mobile apps and CTV apps |
| Where it lives | The root of the site that shows the ads | The root of the developer website in the store listing |
| How a buyer finds it | From the page's domain | From the store URL in the bid request, then the listing's developer website |
| Line format | Ad system, account ID, DIRECT or RESELLER, optional TAG ID | The same |
subdomain= variable | Supported | Ignored |
| One file covers | One domain | Every app that lists the same developer website |
If you run a website and an app on the same domain, you need both files side by side. They don't replace each other.
app-ads.txt file format, with an app-ads.txt example
Each line names one ad system and one account, using the same fields as ads.txt. Lines starting with # are comments.
| Field | What it holds | Required? |
|---|---|---|
| 1. Ad system domain | The domain of the ad system, such as google.com for AdMob and Google demand | Yes |
| 2. Publisher ID | Your account ID in that ad system, such as an AdMob pub- ID | Yes |
| 3. Relationship | DIRECT if you control the account, RESELLER if you let another company sell through it | Yes |
| 4. Certification authority ID | An ID for the ad system from a certification body such as TAG | No |
Here's an example based on the one in Google's help page. The domains and IDs are placeholders, so copy your real lines from each network:
# Authorized sellers for example.com
google.com, pub-0000000000000000, DIRECT
greenadexchange.com, 12345, DIRECT, d75815a79
silverssp.com, 9675, RESELLER, 496211
Here google.com is the ad system, pub-0000000000000000 is the publisher ID and DIRECT is the relationship. One file serves every app that lists the same developer website. You add each network once, not once per app. If you're still choosing where your app's demand comes from, our ad network vs ad exchange comparison shows how each one sells your inventory.
DIRECT or RESELLER: a worked example
Say your game uses AdMob mediation with two other networks. Your AdMob account is yours, so its line is DIRECT. A network where you signed up and get paid directly is also DIRECT, with your account ID on that network.
Now say that second network also resells your impressions through an exchange it works with. That exchange sees the network's account, not yours. So the network gives you a RESELLER line with the exchange's domain and the network's ID there. Copy both kinds of line exactly as each partner sends them, and never relabel a RESELLER line as DIRECT.
Keep only reseller lines you really use, though. Buyers cut paths they don't trust, as our guide to supply path filtering explains.
Version 1.1 of the standard also lets you add OWNERDOMAIN= with your own business domain, and MANAGERDOMAIN= when one partner manages your inventory. Neither replaces a seller line.
How to create app-ads.txt and set it up, step by step
Put a developer website in the store listing, create a text file with one line per ad network, upload it to that website's root and wait for each network to crawl it. Google's AdMob setup guide gives the same order.
1. Add a developer website to the store listing
Crawlers start from the store listing, not from your app. In Google Play Console, AdMob's help points to Grow users, then Store presence, Store settings and the store listing contact details. For Apple, it points to the marketing URL field. The app must be published before AdMob can verify the file, and AdMob notes that store changes can take up to 24 hours to detect.
Say your listing points to a Facebook page or a link-in-bio page. You can't upload a file to either, so the crawler will never find one. Fix the listing first.
2. Collect a line from every network
Copy the snippet from the app-ads.txt page of your AdMob account. If you use mediation, ask each mediated network and each bidding partner for its own lines. They're in each partner's help centre or dashboard.
3. Create the app-ads.txt file
Paste the lines into a plain text file named app-ads.txt, all lowercase. Use a plain text editor, not a word processor.
4. Upload it to the root of the domain
Upload the file so it opens at the root of your domain, for example https://example.com/app-ads.txt. Open that address in a browser. You should see plain text, not a login page, your homepage or a 404. AdMob's help says it can't crawl a file built in Google Sites, so use a host where you can upload a real file.
5. Wait for verification
AdMob says crawling and verifying can take up to 24 hours. You can ask for a fresh check in AdMob, but the status still needs time to update. Don't keep editing the file while you wait.
How crawlers find the file on your developer website
Crawlers take the developer URL from your store listing, cut it down to the host name and request the file at the root of that host, trying HTTPS first. The IAB spec tells them to drop a leading www. or m. and to fall back to the parent domain only when the subdomain has no file.
AdMob's help gives an example. If your developer website is https://help.example.com/game, it checks these addresses in order:
- The root of
help.example.comover HTTPS - The root of
help.example.comover HTTP - The root of
example.comover HTTPS - The root of
example.comover HTTP
The path in the listing is ignored. Redirects within the same root domain are fine, and the ads.txt spec allows only one redirect to a different domain. What we'd do: a plain site on your own domain, with the file at its root and no redirects at all.
Buyers don't look up your app by name. Each bid request carries the store URL of your listing, and the IAB spec asks app stores to publish the developer URL, bundle ID and store ID as tags on every listing page. The crawler reads those tags, then fetches the file. The same spec asks crawlers to check each store listing no more than once a week, so a listing change takes longer to show up than a file change.
Changing your developer website
Moving to a new domain is where many apps lose demand for weeks. The IAB spec suggests keeping the old file live for an extended period, with 30 days given as a guide, and hosting the same file on both domains while crawlers catch up. Update the store listing, copy the file to the new domain, and only then retire the old one.
How to fix app-ads.txt not found and other AdMob errors
Most app-ads.txt AdMob issues have three causes: the store listing points to the wrong website, the file isn't at that website's root, or a line has a typo. AdMob shows a green status for a verified file, grey when it finds no file and red when the file has a problem.
| Issue AdMob reports | Usual cause | Fix |
|---|---|---|
| The app-ads.txt file isn't found | No file at the root, or the listing shows another website | Upload the file to the listed domain, open it in a browser, then wait up to 24 hours |
| Developer website missing from the store listing | The listing has no website, or only an email | Add the website in Play Console or App Store Connect and wait for the store to update |
| Developer website URL isn't valid | A URL the crawler rules can't turn into a file path | Use a normal https:// address on a domain you control |
| Hosted on an unsupported subdomain | The file is on a subdomain the crawler doesn't check | Host it at the address AdMob shows, redirect to it, or change the developer website |
| File not formatted correctly | A missing or mistyped publisher ID, or admob.com instead of google.com | Paste the snippet from your AdMob account again, unchanged |
| robots.txt blocks the crawler | A rule that blocks all bots or the file path | Add User-agent: Google-adstxt followed by an empty Disallow: line. If the file redirects to another host, check that host's robots.txt too |
| Crawler keeps crawling the file from the wrong link | An old or unexpected URL is still being checked | Find the exact crawled URL in the detailed status in AdMob and redirect it to your live file |
| No status shown | No ad requests from the app in the last 7 days, or the app isn't verified yet | Check that the app is live and requesting ads |
If you changed the developer website recently, AdMob's FAQ says checks can take longer and suggests waiting a week before asking for more help. One case surprises people: an unknown app shows up in your AdMob account. AdMob says this means another developer listed your website and the file is working. You can block that app.
Mediation, sellers.json and CTV apps
Every network that can sell your app inventory needs its own line, and the more partners you add, the easier one is to miss. A partner without a line loses bids from buyers who check the file.
- Mediation: list every ad source that can win an impression, not only AdMob. When you add or remove a source, update the file the same day.
- Resellers: if a partner resells your inventory through another exchange, it should give you a
RESELLERline for that exchange. - sellers.json: buyers match the IDs in your file against each ad system's sellers.json, which lists the sellers it works with. An ID missing from the partner's sellers.json looks like an error to them. Here's how to find and read your seller entry.
- CTV: TV app stores also list a developer website, and CTV buyers check the file the same way. Our guides to CTV monetization for streaming apps and how to monetize a Roku channel show where the file fits in a TV launch.
app-ads.txt checklist before you launch or add a network
Run this list every time you publish an app, change the store listing or add an ad source. It takes ten minutes and catches nearly every status AdMob can show.
- Each store listing (Google Play, App Store, every TV store) shows the same developer website, on a domain you control.
https://yourdomain.com/app-ads.txtopens as plain text in a private window, with no login page or homepage in the way.- Your AdMob line is pasted unchanged from your AdMob account, with
google.comas the domain. - Every mediated network and bidder has its own lines, including
RESELLERlines it sent you. - robots.txt doesn't block the file or the
Google-adstxtcrawler. - Networks you've dropped are gone from the file.
- After 24 hours, AdMob shows a green status for each app.
Frequently asked questions
Is app-ads.txt necessary?
app-ads.txt isn't a law, but you need it for any app that earns from programmatic ads. Ad sources that have adopted the standard only buy on apps with a verified file, so going without one shrinks the demand competing for your inventory.
Where do I put the app-ads.txt file?
At the root of the developer website in your app's store listing, so it opens straight after your domain name. It never goes inside the app.
Do I need a website for it?
Yes. The file must sit on a website you control, and that website must be in the store listing. A one-page site on your own domain is enough, as long as you can upload a text file to its root.
How long does AdMob take to verify the file?
AdMob says up to 24 hours after it can reach the file. If you recently changed the developer website in the store, it takes longer, and AdMob suggests waiting a week before asking for help.
Can one file cover several apps?
Yes. Every app that lists the same developer website shares one file, so add each network account once and it covers all of them.
How often should I update app-ads.txt?
Update the file the same day you add or remove an ad source, and whenever a partner sends new lines. Beyond that, review it once a quarter against your mediation setup. Stale lines don't break anything on their own, but they make it harder to see who really sells your inventory.
How can I check that my app-ads.txt works?
Open the file's address in a browser first. Then check your AdMob account, which shows a status for each app, and use the validation page your other networks offer in their dashboards.
Next step: a clean file and more demand
Check the developer website in your listing first, then the file, then the lines. A verified file lets every buyer who checks it bid on your inventory, and it's one of the first things we look at when an app publisher asks for more demand. Want a second opinion on your file, your mediation stack or which premium partners to add? Read about our app monetization support or contact MH AdX to talk it through.


