API v2 reference
Get domain metrics from Moz, Majestic and Pretty, or check a name across extensions with the extension coverage endpoint. Each successful data request costs one credit. Checking your balance is free.
Authentication
Pass your key as the apikey query parameter, or as an
apikey request header. Every call also needs an app
value naming the software making it — that is what lets us tell you
which of your integrations is spending credits when you ask.
Keys are per account rather than per application, so the same key works from your own code, the desktop app and the web tools. Treat it like a password: anyone holding it can spend your credits.
Domain metrics
1 creditMoz, Majestic and Pretty metrics for one domain in a single call.
GET https://domdetailer.com/api2/checkDomain.php?apikey=YOUR_KEY&app=YourApp&domain=example.com
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
apikey |
string | Required | Your account API key. May also be sent as an apikey header. |
app |
string | Required | A short identifier for the software making the call. Used for support and usage reporting. |
domain |
string | Required | The domain to look up. Send a bare hostname; protocols and a leading www. are stripped for you. |
forceFresh |
boolean | Optional | Bypass the cached Moz record and refetch. Costs the same, takes longer. |
Response fields
| Field | Type | Meaning |
|---|---|---|
mozDA |
number | Domain Authority, 1-100. |
mozPA |
number | Page Authority of the home page, 1-100. |
mozRank |
number | MozRank, 0-10. |
mozTrust |
number | MozTrust, 0-10. |
mozSpam |
number | Spam Score, 0-17. |
mozLinks |
number | External inbound links recorded by Moz. |
| Field | Type | Meaning |
|---|---|---|
majesticTF |
number | Trust Flow, 0-100. |
majesticCF |
number | Citation Flow, 0-100. |
majesticLinks |
number | External inbound links. |
majesticRefDomains |
number | Unique referring domains. |
majesticRefIPs |
number | Unique referring IP addresses. |
majesticRefSubnets |
number | Unique referring class C subnets. |
majesticRefEdu |
number | Inbound links from .edu domains. |
majesticRefGov |
number | Inbound links from .gov domains. |
majesticStatReturned |
string | Which Majestic dataset answered. |
majesticTTF0Name |
string | First Topical Trust Flow category. |
majesticTTF0Value |
number | Trust Flow within that category. |
majesticTTF1Name |
string | Second Topical Trust Flow category. |
majesticTTF1Value |
number | Trust Flow within that category. |
majesticTTF2Name |
string | Third Topical Trust Flow category. |
majesticTTF2Value |
number | Trust Flow within that category. |
| Field | Type | Meaning |
|---|---|---|
prettyLinksIn |
number | External inbound links our crawl has observed. |
prettyLinksOut |
number | External outbound links to other domains. |
prettyPageCount |
number | Pages of this domain in our index. |
prettyLinksDofollow |
number | Inbound links without a nofollow attribute. |
prettyLinksEdu |
number | Inbound links from .edu domains. |
prettyLinksGov |
number | Inbound links from .gov domains. |
What each metric actually tells you, and which combinations catch a manipulated profile, is covered in the field reference.
Example response
{
"domain": "domainhuntergatherer.com",
"mozLinks": 16009,
"mozPA": 42,
"mozDA": 34,
"mozRank": 4,
"mozTrust": 3,
"mozSpam": 0,
"majesticStatReturned": "Default",
"majesticLinks": 82888,
"majesticRefDomains": 1849,
"majesticCF": 30,
"majesticTF": 9,
"majesticRefIPs": 1184,
"majesticRefSubnets": 969,
"majesticRefEdu": 0,
"majesticRefGov": 0,
"majesticTTF0Name": "News/Newspapers",
"majesticTTF0Value": 9,
"majesticTTF1Name": "Recreation/Travel",
"majesticTTF1Value": 5,
"majesticTTF2Name": "Arts/Literature",
"majesticTTF2Value": 5,
"prettyLinksIn": 504,
"prettyLinksOut": 2114,
"prettyPageCount": 364,
"prettyLinksEdu": 0,
"prettyLinksGov": 0,
"prettyLinksDofollow": 469
}
Code
curl -G https://domdetailer.com/api2/checkDomain.php \ --data-urlencode "apikey=YOUR_KEY" \ --data-urlencode "app=YourApp" \ --data-urlencode "domain=example.com"
import requests r = requests.get( "https://domdetailer.com/api2/checkDomain.php", params={ "apikey": "YOUR_KEY", "app": "YourApp", "domain": "example.com", }, timeout=60, ) r.raise_for_status() data = r.json()
const url = new URL("https://domdetailer.com/api2/checkDomain.php"); Object.entries({ apikey: "YOUR_KEY", app: "YourApp", domain: "example.com", }).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json();
$qs = http_build_query([
'apikey' => 'YOUR_KEY',
'app' => 'YourApp',
'domain' => 'example.com',
]);
$json = file_get_contents(
'https://domdetailer.com/api2/checkDomain.php?' . $qs
);
$data = json_decode($json, true);
Extension coverage
1 creditCheck the same exact name across all published extensions by default. Get counts and percentage taken, with optional taken and not_found lists. Not found does not mean available to register. Each successful request costs one credit total; requests with no usable data are not charged.
GET https://domdetailer.com/api2/checkExtensions.php?apikey=YOUR_KEY&app=YourApp&domain=example.com
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
apikey |
string | Required | Your account API key. May also be sent as an apikey header. |
app |
string | Required | A short identifier for your integration. |
domain |
string | Required | An exact name without an extension, a full domain or an HTTP(S) URL. seosoftwarereviews and seosoftwarereviews.info both check seosoftwarereviews. Names allow letters, digits and internal hyphens, up to 63 ASCII/punycode bytes. Subdomains are reduced using the Public Suffix List: www.example.co.uk checks example. Hosted tenant names such as user.blogspot.com are rejected. Use ASCII punycode for portable IDN input. |
suffixes |
string | Optional | Optional comma-separated selection, up to 5000 entries; duplicates are removed. Omit to check all published extension datasets automatically, including newly imported extensions. Explicitly requested extensions without data count as unknown. Long selections may exceed your HTTP server URL limit. |
include_taken |
boolean | Optional | Set to 1 to include the taken TLD list. Default 0 omits it. Does not change which extensions are checked. |
include_not_found |
boolean | Optional | Set to 1 to include the not_found TLD list. Default 0 omits it. Does not change the counts or credit cost. |
Response fields
| Field | Type | Meaning |
|---|---|---|
domain |
string | Normalized registry-level domain, or the normalized name when no extension was supplied. |
name |
string | Exact ASCII/punycode label checked across extensions. |
taken |
array | Only returned with include_taken=1. Extensions where the name was found, without leading dots. Based on registry data, not a live registrar check. |
not_found |
array | Only returned with include_not_found=1. Extensions checked where the name was absent. This does not guarantee availability to register. |
unknown |
array | Only returned when explicitly requested extensions have no data, listing those unchecked extensions. |
meta |
object | Always returned: counts, percentage taken and credit cost, independent of list options. |
warnings |
array | Optional. Only returned when a result needs qualification, such as older data. Omitted for fresh results. |
| Field | Type | Meaning |
|---|---|---|
checked |
integer | Number of extensions actually checked: taken plus not_found. Excludes unknown extensions. |
taken |
integer | Number of checked extensions where the name was found, whether or not the list was requested. |
not_found |
integer | Number of checked extensions without a match. Not a count of domains available to register. |
unknown |
integer | Number of explicitly requested extensions without data. Zero when checking all published datasets. |
percentage_taken |
number | Percentage of checked extensions that are taken: taken / checked * 100, rounded to two decimal places. Excludes unknown extensions. |
credits_used |
integer | Always 1 on a successful response, including partial coverage. |
| Field | Type | Meaning |
|---|---|---|
code |
string | stale_data means the listed results use older data while an update is pending. |
count |
integer | Number of checked extensions using older data. The warning stays compact even across hundreds of datasets. |
Read the coverage interpretation guide for unchecked extensions, freshness warnings and the limits of registration inference. The example below is illustrative, not a live report of available datasets.
Example response
{
"domain": "example.com",
"name": "example",
"meta": {
"checked": 400,
"taken": 120,
"not_found": 280,
"unknown": 0,
"percentage_taken": 30,
"credits_used": 1
}
}
Code
curl -G https://domdetailer.com/api2/checkExtensions.php \ --data-urlencode "apikey=YOUR_KEY" \ --data-urlencode "app=YourApp" \ --data-urlencode "domain=example.com"
import requests r = requests.get( "https://domdetailer.com/api2/checkExtensions.php", params={ "apikey": "YOUR_KEY", "app": "YourApp", "domain": "example.com", }, timeout=60, ) r.raise_for_status() data = r.json()
const url = new URL("https://domdetailer.com/api2/checkExtensions.php"); Object.entries({ apikey: "YOUR_KEY", app: "YourApp", domain: "example.com", }).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json();
$qs = http_build_query([
'apikey' => 'YOUR_KEY',
'app' => 'YourApp',
'domain' => 'example.com',
]);
$json = file_get_contents(
'https://domdetailer.com/api2/checkExtensions.php?' . $qs
);
$data = json_decode($json, true);
Reading extension coverage results
Use extension coverage as another signal when researching a domain name.
Send example.com to check the exact name example
across your chosen extensions. It does not match similar names or identify
whether the domains have the same owner.
Omit suffixes to check all published extension datasets, including newly imported TLDs.
Pass a comma-separated selection to restrict the check. The default response contains summary counts;
use include_taken=1 or include_not_found=1 to include either TLD list.
curl -G https://domdetailer.com/api2/checkExtensions.php \ -H "apikey: YOUR_KEY" \ --data-urlencode "app=YourApp" \ --data-urlencode "domain=example.com" \ --data-urlencode "suffixes=org,biz,info"
| List | Meaning |
|---|---|
taken |
The exact name appears in this extension's downloaded dataset. |
not_found |
A dataset was checked and the exact name was absent. A registered domain without DNS delegation can be missing from a zone file. |
unknown |
No dataset has been published for this extension. This says nothing about the domain's registration. |
The taken and not_found lists are optional and off by default.
Counts always appear as meta.taken, meta.not_found and meta.unknown.
The brief summary also gives
meta.checked, meta.percentage_taken
and meta.credits_used. The percentage is taken divided by checked,
multiplied by 100 and rounded to two decimal places.
Unknown extensions are excluded from the checked count.
Supported datasets are scheduled to refresh daily. If older data is used,
an optional warnings entry with code stale_data
reports the number of affected extensions in count. Routine snapshot details
are omitted. The example above illustrates the format, not live results.
A successful response costs one credit total, including
partial or stale results. If none of the requested extensions has a usable
dataset, the endpoint returns 503 coverage_unavailable without
charging. Failed requests are not charged.
not_found
nor unknown guarantees that a domain can be registered now.
Credit balance
FreeHow many credits remain on the account. Never charged.
GET https://domdetailer.com/api2/checkBalance.php?apikey=YOUR_KEY&app=YourApp
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
apikey |
string | Required | Your account API key. |
app |
string | Required | A short identifier for your integration. |
simple |
boolean | Optional | Return the bare number as text/plain instead of JSON. Convenient for shell scripts. |
Response fields
| Field | Type | Meaning |
|---|---|---|
[0] |
string | The literal string UnitsLeft. |
[1] |
number | Credits remaining. |
Example response
[
"UnitsLeft",
92921
]
Code
curl -G https://domdetailer.com/api2/checkBalance.php \ --data-urlencode "apikey=YOUR_KEY" \ --data-urlencode "app=YourApp"
import requests r = requests.get( "https://domdetailer.com/api2/checkBalance.php", params={ "apikey": "YOUR_KEY", "app": "YourApp", }, timeout=60, ) r.raise_for_status() data = r.json()
const url = new URL("https://domdetailer.com/api2/checkBalance.php"); Object.entries({ apikey: "YOUR_KEY", app: "YourApp", }).forEach(([k, v]) => url.searchParams.set(k, v)); const res = await fetch(url); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json();
$qs = http_build_query([
'apikey' => 'YOUR_KEY',
'app' => 'YourApp',
]);
$json = file_get_contents(
'https://domdetailer.com/api2/checkBalance.php?' . $qs
);
$data = json_decode($json, true);
Errors
Standard HTTP status codes. The body carries a small JSON object with an
error slug you can branch on and a message written
for whoever is reading the log.
| Status | error | When it happens |
|---|---|---|
| 400 | missing_parameter |
A required parameter is absent, or the domain could not be parsed as a hostname. |
| 401 | invalid_api_key |
The key is missing, malformed, or not attached to an account. |
| 402 | not_enough_credits |
The account has no credits left. Nothing was charged. |
| 404 | account_not_found |
The key or email did not match any account. |
| 429 | rate_limited |
Too many requests. The body carries retry_after in seconds - wait that long rather than retrying immediately. |
| 502 | upstream_error |
A data source failed to respond. Safe to retry after a short pause. |
| 503 | coverage_unavailable |
Extension coverage is unavailable or none of the requested datasets has been published. No credit is charged. |
| 500 | server_error |
Something went wrong on our side. If it persists, tell us what you sent. |
{
"error": "not_enough_credits",
"message": "Not enough credits."
}
Rate limits and concurrency
Requests are rate limited per account. Up to 20 concurrent connections are supported for domain metrics. The backlinks endpoint is considerably heavier, and five is a sensible ceiling there.
Exceeding the limit returns 429 with a retry_after
value in seconds. Honour it — retrying immediately extends the block
rather than clearing it.
Cache results for domains you check repeatedly. Domain metrics move on a timescale of weeks; extension coverage follows registry snapshot imports. Refresh cached extension coverage daily and retain any returned freshness warnings.
Migrating from v1
v2 is close enough to v1 that most integrations need only a new path and a few extra fields read. The parameters are unchanged.
- mozLinks
- mozDA
- mozPA
- mozRank
- majesticLinks
- majesticRefDomains
- majesticCF
- majesticTF
- majesticTTF0-2
- prettyLinksIn
- prettyLinksOut
- prettyPageCount
- prettyLinksDofollow
- prettyLinksEdu
- prettyLinksGov
- mozSpam
- majesticRefIPs
- majesticRefSubnets
- FB_shares
- FB_comments
- pinterest_pins
- stumbles
- google_plus_one
Social counters were retired when the networks behind them closed their APIs.
Start at 25,000 lookups for $34.
One balance covers the browser tools, the desktop app and the API. Nothing renews, nothing expires, and you can stop using it for six months without losing anything.