ads.txt and sellers.json checker API
The ads.txt checker API reads a host's /ads.txt and /sellers.json and returns both as structured JSON, which is easier to diff and validate than the raw files.
Early access: billing is not open yet. Prices below are what a call will debit when it opens. Request access →
Price: $0.001 per call (one credit), with 25 free lookups per account each UTC month. Data source: the host's ads.txt and sellers.json.
Request
Send POST /v1/ads-txt with a JSON body and your key in the Authorization: Bearer header. Send a host. The JSON parses only that host's /ads.txt and /sellers.json.
curl https://one-api.ai/v1/ads-txt \
-H "Authorization: Bearer $ONE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"host":"example.com"}'
import os, requests
resp = requests.post(
"https://one-api.ai/v1/ads-txt",
headers={"Authorization": f"Bearer {os.environ['ONE_API_TOKEN']}"},
json={"host":"example.com"},
timeout=30,
)
print(resp.status_code, resp.json())
Response fields
| Field | Meaning |
|---|---|
ads_txt.found / status | Whether /ads.txt answered 2xx, and its HTTP status. |
ads_txt.records | Each line as domain, publisher_id, relationship (DIRECT or RESELLER) and certification_authority_id. |
ads_txt.variables | contact, subdomain, inventorypartnerdomain, ownerdomain and managerdomain lines. |
sellers_json.sellers | Each seller's seller_id, seller_type, is_confidential, name and domain. |
sellers_json.identifiers | Identifier name and value pairs. |
sellers_json.contact_email / version | Top-level contact and version fields, or null. |
truncated | True on either file when it was larger than 1 MiB. |
Limits and behaviour
- Only the host you send is read, over https, following up to five redirects. Subdomain and inventory partner files are not followed.
- Each file is read up to 1 MiB with a 10 second timeout.
- Lines that do not parse as records or known variables are skipped, not reported.
- A sellers.json that is not valid JSON returns found true and sellers null.
Errors come back as JSON with an HTTP status and a short code. HTTP 400 means the input was refused, 401 a missing or bad key, 402 an empty balance, 429 a rate limit and 502 an upstream failure. Calls that end in 400 or a 5xx status are not charged.
What people use it for
- Confirm a publisher lists your seller account as DIRECT.
- Track changes to an exchange's sellers.json over time.
- Check ownerdomain and managerdomain after an ads.txt 1.1 update.
- Audit a list of publisher domains in a batch job, one call per host, at a fixed price per call.
The same lookup is available to AI agents through the remote MCP server at https://one-api.ai/mcp, using the same key and the same price per call.
FAQ
Does it validate seller IDs against the exchange?
No. It parses both files on the host you send. Cross-checking a publisher's ads.txt against each exchange's sellers.json takes one call per host.
Is app-ads.txt supported?
Not yet. Only /ads.txt and /sellers.json are read.
What if the host has no ads.txt?
found is false and status carries the HTTP status, usually 404. The call still succeeds and is charged as one lookup.
Why read sellers.json as well?
An ads.txt line names a seller account at an ad system. That ad system's sellers.json says who the account belongs to and whether it is a publisher or an intermediary, so reading both lets you match DIRECT lines to a named seller.
Related
Last updated 2026-10-31.