Authentication
One header, one key.
Create a key from API access in your account (sign in first). The raw value is shown once, at creation -- copy it somewhere safe, because it cannot be retrieved again, only revoked and replaced. Send it as a bearer token on every request:
Authorization: Bearer dak_live_...
A key authenticates as you: same tenant, same plan, same credit balance, same rate limits as your browser session. It is restricted to what an agent needs -- search, single-domain lookup, reveal, account balance, and watchlist -- and cannot touch billing, account settings, or key management itself. A revoked key stops working immediately.
Search
GET /api/domains
Every query parameter is optional; an empty request returns the same default sort the dashboard opens on.
| Parameter | Meaning |
|---|---|
q |
Free-text search across the visible (non-masked) fields. |
city |
Lowercased locality, e.g. austin. |
region |
Lowercased two-letter US state code, e.g. tx. US inventory only. |
country |
GMB-resolved country, e.g. United States, or all (default). |
vertical |
Business niche/category as recorded by the source, e.g. roofing contractor. |
category |
Free-text category filter, matched more loosely than vertical. |
tld |
Lowercased TLD without the dot, e.g. com. |
status |
available, dropping, auction, expired, service-area,
or all (default).
|
watched |
true to list only your watchlist. |
minDr |
Minimum Ahrefs Domain Rating, 0–100. |
maxPrice |
Maximum listed price in USD, for auction/marketplace rows that carry one. |
sort / direction |
authority (default), price, traffic, age, links,
credits, added, or event; direction is asc or
desc (default).
|
page / limit |
1-indexed page number; limit is 1–200, default 25. |
Example: every roofing candidate in Austin, TX, sorted by strongest evidence first.
curl "https://expiredgmbdomains.com/api/domains?city=austin®ion=tx&vertical=roofing%20contractor&sort=authority" \
-H "Authorization: Bearer dak_live_..."
Each row is masked until revealed. A locked row's response looks like:
{
"data": [
{
"id": "dom_...",
"name": null,
"locked": true,
"revealed": false,
"revealCost": 3,
"lifecycleStatus": "available",
"city": "Austin",
"vertical": "Roofing contractor",
"domainRating": 12,
"price": null
}
],
"meta": { "page": 1, "limit": 25, "total": 4, "pages": 1 }
}
name and the identifying evidence stay hidden until you reveal that exact row -- the same rule as the
dashboard. revealCost is always shown before you spend anything.
Reveal
POST /api/domains/{id}/reveal
Spends revealCost credits from your existing balance -- the exact same pool the dashboard and your email alerts
draw from. A reveal is permanent: reopening the same row later, from the API or the browser, costs nothing.
curl -X POST "https://expiredgmbdomains.com/api/domains/dom_.../reveal" \
-H "Authorization: Bearer dak_live_..."
{
"data": { "id": "dom_...", "name": "example-roofing.com", "locked": true, "revealed": true, ... },
"charged": true,
"cost": 3,
"account": { "revealsRemaining": 177, "revealAllowance": 180, ... }
}
A 402 response means the balance does not cover the cost -- top up or wait for the next period before retrying. Reveals
already unlocked on your account, and un-locked rows such as live auctions, return "charged": false and cost
nothing.
Watchlist
POST /api/watchlist
curl -X POST "https://expiredgmbdomains.com/api/watchlist" \
-H "Authorization: Bearer dak_live_..." \
-H "Content-Type: application/json" \
-d '{"domainId": "dom_...", "watched": true}'
Set watched to false to remove it. Anything watched appears in your dashboard's Watched view and
is eligible for your daily email alert, exactly as if you had starred it yourself.
Balance
GET /api/account
Check your remaining credits before spending them on a reveal.
curl "https://expiredgmbdomains.com/api/account" -H "Authorization: Bearer dak_live_..."
Limits and errors
The same guardrails as the dashboard.
401 Unauthorized
The key is missing, malformed, or revoked. Create a new one from your account.
402 Payment required
Not enough reveal credits for that row's cost.
403 api_key_scope
That route is outside what a key can reach -- search, reveal, watchlist, and balance only. Sign in on the website for anything else.
429 Rate limited
Search is capped at 60 requests/minute and a daily row budget, same as the browser. Back off and retry.
Using it from Claude Code
Paste this in, once.
Claude Code (or any agent that can run shell commands) can call this directly with curl. A prompt like the
following is enough to get started:
My Expired GMB Domains API key is dak_live_....
Search https://expiredgmbdomains.com/api/domains for roofing companies
in Austin, TX (city=austin®ion=tx&vertical=roofing%20contractor),
sorted by strongest evidence. Show me the locked rows and their reveal
cost, and ask me before revealing any of them with a POST to
/api/domains/{id}/reveal.
Keep the key out of files you commit or share -- treat it like a password. Revoke and replace it any time from your account.
Email team@expiredgmbdomains.com.