Base URL https://ppceye.com. Everything is GET and returns JSON. Create a key on your
account page — the plaintext is shown once, and your
first key comes with 200 free credits, enough to exercise all five endpoints.
Authenticate with either header:
curl "https://ppceye.com/api/v1/advertiser?name=Dealer%20Spike" \
-H "Authorization: Bearer ppc_xxxxxxxxxxxx"
# equivalent
curl "https://ppceye.com/api/v1/advertiser?name=Dealer%20Spike" \
-H "x-api-key: ppc_xxxxxxxxxxxx"
Every successful response carries your balance, so you never need a separate call for it:
"credits_charged": 1,
"credits_remaining": 199
Billed in prepaid credits — one-time purchase, never expire, no
subscription. Credits are deducted before the query runs; an insufficient balance returns 402
and costs nothing. Pack prices are on the
pricing page.
| Endpoint | Credits / call |
|---|---|
/api/v1/advertiser, /api/v1/domain | 3 |
/api/v1/advertiser/history | 9 |
/api/v1/advertiser/domains | 15 |
/api/v1/brandbid | 60 |
Advertiser summary. Google issues one company several advertiser IDs; this endpoint merges them by name before aggregating.
| Parameter | Notes |
|---|---|
name (required) | Advertiser name, case-sensitive, same as on the site |
{
"advertiser": "Dealer Spike",
"advertiser_ids": [
"AR05738027791505424385", "AR08139894827664801793",
"AR09607180450548154369", "AR11199105612044566529",
"AR15781632204146212865"
],
"creatives": 16313,
"landing_domains": 1854,
"last_seen": "2026-09-16",
"country": "US",
"advertiser_type": null,
"credits_charged": 1,
"credits_remaining": 199
}
advertiser_type is "agency", "direct" or null. It is a
manual label, so null means nobody has classified this advertiser yet — not that it is not an agency.
There is no time dimension here; use /advertiser/history for that.
Domain summary: how many advertisers are running ads that land on this domain.
| Parameter | Notes |
|---|---|
domain (required) | Root domain; normalized for you (www., scheme and path are stripped) |
{
"domain": "dmit.io",
"advertisers": 8,
"last_crawled": "2026-08-22 11:25:38",
"has_data": true,
"credits_charged": 1,
"credits_remaining": 198
}
Month-by-month activity, which tells you whether an advertiser is scaling up or winding down.
| Parameter | Notes |
|---|---|
name (required) | Advertiser name |
{
"advertiser": "Dealer Spike",
"window_start": "2023-09-18",
"months": [
{ "month": "2026-06", "creatives": 1876, "domains": 588 },
{ "month": "2026-07", "creatives": 1304, "domains": 404 },
{ "month": "2026-08", "creatives": 792, "domains": 264 },
{ "month": "2026-09", "creatives": 9819, "domains": 1430 }
],
"credits_charged": 3,
"credits_remaining": 195
}
window_start tells you the actual
floor), and the sample above shows only the last four entries. The site itself exposes the full six-plus years.Which landing domains this advertiser runs ads to — the core signal separating a brand advertising itself from an agency or affiliate buying for many clients. One or two domains usually means the brand or its dealer; a thousand unrelated ones means an intermediary.
| Parameter | Notes |
|---|---|
name (required) | Advertiser name |
{
"advertiser": "Dealer Spike",
"landing_domain_count": 1854,
"landing_domains": [
{ "domain": "ronhooverrvs.com", "creatives": 853, "last_seen": "2026-09-16" },
{ "domain": "meyersrvsuperstores.com", "creatives": 837, "last_seen": "2026-09-16" },
{ "domain": "rvstation.com", "creatives": 580, "last_seen": "2026-09-16" },
{ "domain": "mikethompson.com", "creatives": 129, "last_seen": "2026-09-16" }
],
"truncated": true,
"credits_charged": 5,
"credits_remaining": 190
}
landing_domain_count is the full total; landing_domains returns at most
500 entries, ordered by creative count. truncated flags the difference. The sample keeps the first 4.
Who is advertising onto your domain, with each advertiser's landing-domain footprint inline.
| Parameter | Notes |
|---|---|
domain (required) | Your root domain |
{
"domain": "dmit.io",
"advertiser_count": 8,
"advertisers": [
{
"advertiser": "罗小加",
"advertiser_id": "AR17017046509952172033",
"creatives": 6,
"first_seen": "2025-12-23",
"last_seen": "2026-05-28",
"landing_domain_count": 275,
"profile": "multi_domain_intermediary"
},
{
"advertiser": "Liu Li",
"advertiser_id": "AR17818107663557328897",
"creatives": 5,
"first_seen": "2026-02-04",
"last_seen": "2026-05-29",
"landing_domain_count": 197,
"profile": "multi_domain_intermediary"
},
{
"advertiser": "Absolute Link Limited",
"advertiser_id": "AR06785990551779934209",
"creatives": 4,
"first_seen": "2026-04-13",
"last_seen": "2026-09-05",
"landing_domain_count": 870,
"profile": "multi_domain_intermediary"
}
],
"credits_charged": 10,
"credits_remaining": 180
}
profile is single_domain (1), few_domains (2–4) or
multi_domain_intermediary (5+). At most 100 advertisers are returned; the sample keeps the first 3.
profile is descriptive, not a verdict. Whether an ad infringes depends on whether the
ad copy uses your trademark, which this endpoint cannot tell you — do not treat it as a conclusion. The
evidence workflow is in
this guide.| Status | error | Meaning |
|---|---|---|
400 | missing_name / missing_domain | Required parameter empty. No credits charged. |
401 | unauthorized | Key missing, malformed, revoked, or the account is disabled. No credits charged. |
402 | insufficient_credits | Balance too low; the response carries required and balance. No credits charged. |
404 | not_found | No such advertiser or domain. This one is charged — the lookup ran. |
Definitions, refresh cadence and known limits are documented in the data methodology. Questions about the API go to [email protected].