Skip to content
DomDetailer

API changelog and compatibility notes · Language and spreadsheet API examples

API v2 Current

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.

Do not ship a key in client-side code. Anything in a browser bundle or a mobile binary is readable. Proxy the call through your own server, which is what our web tools do for signed-in users.

Domain metrics

1 credit

Moz, Majestic and Pretty metrics for one domain in a single call.

Request
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

Moz
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.
Majestic
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.
Pretty
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

200 OK · application/json
{
    "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
curl -G https://domdetailer.com/api2/checkDomain.php \
  --data-urlencode "apikey=YOUR_KEY" \
  --data-urlencode "app=YourApp" \
  --data-urlencode "domain=example.com"
Python
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()
Node.js
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();
PHP
$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 credit

Check 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.

Request
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

Response
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.
Metadata (meta)
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.
Each warning (only when needed)
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

200 OK · application/json
{
    "domain": "example.com",
    "name": "example",
    "meta": {
        "checked": 400,
        "taken": 120,
        "not_found": 280,
        "unknown": 0,
        "percentage_taken": 30,
        "credits_used": 1
    }
}

Code

curl
curl -G https://domdetailer.com/api2/checkExtensions.php \
  --data-urlencode "apikey=YOUR_KEY" \
  --data-urlencode "app=YourApp" \
  --data-urlencode "domain=example.com"
Python
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()
Node.js
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();
PHP
$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.

Choose the extensions to check
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"
ListMeaning
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.

Confirm availability with a registrar. These results describe downloaded snapshots. Neither not_found nor unknown guarantees that a domain can be registered now.

Credit balance

Free

How many credits remain on the account. Never charged.

Request
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

Response
Field Type Meaning
[0] string The literal string UnitsLeft.
[1] number Credits remaining.

Example response

200 OK · application/json
[
    "UnitsLeft",
    92921
]

Code

curl
curl -G https://domdetailer.com/api2/checkBalance.php \
  --data-urlencode "apikey=YOUR_KEY" \
  --data-urlencode "app=YourApp"
Python
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()
Node.js
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();
PHP
$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.
402 Payment Required
{
  "error": "not_enough_credits",
  "message": "Not enough credits."
}
A failed request is not charged. A 4xx or 5xx response means no credit was taken, so retrying a transient failure only ever costs you the attempt that succeeds.

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.

Unchanged
  • mozLinks
  • mozDA
  • mozPA
  • mozRank
  • majesticLinks
  • majesticRefDomains
  • majesticCF
  • majesticTF
  • majesticTTF0-2
New in v2
  • prettyLinksIn
  • prettyLinksOut
  • prettyPageCount
  • prettyLinksDofollow
  • prettyLinksEdu
  • prettyLinksGov
  • mozSpam
  • majesticRefIPs
  • majesticRefSubnets
Removed
  • FB_shares
  • FB_comments
  • pinterest_pins
  • stumbles
  • google_plus_one
  • linkedin

Social counters were retired when the networks behind them closed their APIs.

Still on v1? The legacy reference remains available. It is maintained for existing integrations but will not gain new fields.

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.