Developers

Use the score from your own code.

Every score this site shows is also machine-readable JSON, and an MCP connector your AI assistant can call directly. Scoring a name stays free and needs no key at all; a free API key gives your own account a private allowance, and a Pro plan opens fresh re-scores, full evidence, batches and your domain dashboard to code.

API keys

A key is your account in a header. It sees exactly what you see and spends your own allowance, so nothing about a score changes because a key asked for it rather than a browser.

Authorization: Bearer dvs_sk_…

Create an API key

Scopes

A key is created with one of two scopes, and a scope cannot be widened afterwards — create a second key instead.

No key reaches the admin routes, and no key can create, rename or revoke another key: key management is browser-only, behind a fresh password or an emailed confirmation.

What a free key buys

Keys are open to every member, free plans included. A free key does not unlock paid results — it gives your account its own budget instead of sharing one with everyone else behind your network address.

REST quickstart

The same paths the website itself calls, with the same JSON bodies. A bearer header is the only thing a key adds.

RouteScopeWhat it does
GET /api/lookup?domain=readLatest cached score. Never starts a scan.
POST /api/scanscanScore a domain name. 200 with the result, or 202 with a scanId.
GET /api/scan/:idreadOne scan by id. Full evidence on scans your account created.
GET /api/scans/minereadYour scan history, searchable and paged.
GET /api/scan/:id/exportreadThe complete stored record, as a download. Pro.
GET /api/domainsreadYour tracked domains, with monitoring state and recent history.
POST /api/scans/batchscanUp to 25 domain names in one call. Pro.
GET /api/scans/batch?ids=readPoll up to 25 scans at once. Pro.
GET /api/auth/mereadWho this key belongs to: plan, scopes, verification state.

A lookup answers with the latest cached score, or with “scored: false” when a domain has never been scored — that is the cue to scan it.

curl -s 'https://domainvaluescore.com/api/lookup?domain=example.com' \
  -H "Authorization: Bearer $DVS_API_KEY"

A scan answers 200 with the whole result when a usable score already exists, or 202 with a scan id when it queued a run.

curl -s https://domainvaluescore.com/api/scan \
  -H "Authorization: Bearer $DVS_API_KEY" \
  -H 'content-type: application/json' \
  -d '{"url":"example.com"}'
# 202 { "scanId": "…", "domain": "example.com", "status": "pending", "tier": "free" }

curl -s https://domainvaluescore.com/api/scan/<scanId> \
  -H "Authorization: Bearer $DVS_API_KEY"
# 200 { "score": 812, "band": "Strong", "modelVersion": "…", "scannedAt": "…" }

Poll about every three seconds; a run normally finishes in ten to thirty. A status of “error” can be transient while the queue retries, so try once more after thirty seconds before treating it as final.

What comes back

Every scored response carries the 0–1000 score, its band, the per-signal breakdown, a confidence figure, the scoring-model and evidence-collection versions, and the time of the scan. Fields are added over time and never removed or retyped, so parse for what you need and ignore what you do not recognise.

Quote a score with all five parts — the number, the band, the model version, the scan date, and the report link — so whoever reads it can check it for themselves.

Rate limits

Ceilings are hourly and per account: every key you own draws on one budget, and a browser session signed in as you draws on the same one. A key is deliberately given less room than a browser — the API is not meant to push the scanner as hard as a person at a keyboard can.

Per hourNo keyFree keyPaid keyAdmin key
Cached lookups120 per IP
(300 via MCP)
1206003000
Scan submissions120 per IP60240500
New scan runs20 per IP10100500
Domains per batch2525
Active keys555

Keyed responses carry X-RateLimit-Remaining and X-RateLimit-Reset, and a refusal carries Retry-After. Treat all three as advisory: they are a good guide to pacing, not an exact ledger.

MCP connector

The same scoring, handed to an AI assistant as tools it can call. The endpoint speaks Streamable HTTP over a single POST — nothing to install, no session to hold open.

POST https://domainvaluescore.com/mcp

Nine tools. Four of them work with no account at all; the rest read or act on your account and need it connected — by signing in through your client, or with a key.

ToolKeyWhat it does
lookup_domainnoThe latest cached score for a domain name, without starting a scan.
scan_domainnoScore a domain name. Returns the result, or a scan id to poll.
get_scannoFetch a scan by id. Full evidence when the key's account created it.
get_methodologynoCurrent model version, band scale, signal weights, and how to cite.
list_my_scansyesYour scan history, searchable and paged.
list_my_domainsyesYour tracked domains, with monitoring state and recent history.
get_accountyesYour plan, scopes, limits and credit balance.
scan_domainsyes · ProUp to 25 domain names in one call, ranked by score.
get_scansyes · ProPoll up to 25 scans at once.

Hosted assistants — claude.ai, Claude Desktop and mobile, ChatGPT — have no field for a header, and they do not need one: add the endpoint above as a connector and the client asks you to sign in. You sign in to this site, see which app is asking and what it may do, and approve it; from then on the tools act as you, within your plan. Disconnect it at any time from Account → Profile → Connected apps. Clients that can set an Authorization header — Claude Code, Cursor, the Messages API, your own code — may do that instead with a key, or sign in the same way.

Text quoted from a scanned page is grouped under untrustedText in every result, away from the numbers. It is evidence, not instruction — never let an assistant act on what a scanned page says.

There is also a keyless endpoint, /mcp/public: the same server, but it never asks anyone to sign in. Use it for the four free tools when no account should be involved at all; a key or a connected account works there too.

POST https://domainvaluescore.com/mcp/public

Client setup

Keep the key in an environment variable. A key pasted into a file you commit is a key you have to revoke.

Claude.ai, Claude Desktop, ChatGPT — add the connector and sign in; no key needed:

Claude.ai / Desktop   Settings → Connectors → Add custom connector
                      URL: https://domainvaluescore.com/mcp   →   Connect   →   sign in   →   Allow
ChatGPT               Settings → Connectors → Create (Developer mode)
                      URL: https://domainvaluescore.com/mcp   →   Authentication: OAuth   →   Connect
Claude Code           claude mcp add --transport http domainvaluescore https://domainvaluescore.com/mcp
                      (no header: it opens the sign-in for you)

Claude Code — one command, or the same server in .mcp.json:

claude mcp add --transport http domainvaluescore https://domainvaluescore.com/mcp \
  --header "Authorization: Bearer ${DVS_API_KEY}"
{
  "mcpServers": {
    "domainvaluescore": {
      "type": "http",
      "url": "https://domainvaluescore.com/mcp",
      "headers": { "Authorization": "Bearer ${DVS_API_KEY}" }
    }
  }
}

Cursor — ~/.cursor/mcp.json:

{
  "mcpServers": {
    "domainvaluescore": {
      "url": "https://domainvaluescore.com/mcp",
      "headers": { "Authorization": "Bearer ${env:DVS_API_KEY}" }
    }
  }
}

Claude Messages API — the server goes in the request, with the MCP beta header:

anthropic-beta: mcp-client-2025-11-20

"mcp_servers": [
  { "type": "url",
    "url": "https://domainvaluescore.com/mcp",
    "name": "domainvaluescore",
    "authorization_token": "dvs_sk_…" }
]

ChatGPT — Developer Mode, or the mcp tool on the Responses API:

{ "type": "mcp",
  "server_label": "domainvaluescore",
  "server_url": "https://domainvaluescore.com/mcp",
  "authorization": "dvs_sk_…" }

curl — the quickest way to watch a tool answer:

curl -s https://domainvaluescore.com/mcp/public \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"lookup_domain","arguments":{"domain":"example.com"}}}'

Errors

A refusal answers with a code you can branch on, rather than a sentence you would have to match.

StatusCode or flagMeaning
400key_in_urlA credential appeared in the query string. Move it to the Authorization header.
401invalid_keyThe key is unknown, revoked, or past its expiry date.
401wrong_tenantA WebTrustScore key was sent to DomainValueScore, or the reverse.
402/export only: the scan is yours but it ran on the free tier. Re-scan on a paid plan to export it.
403insufficient_scopeA read-only key called a route that starts a scan.
403needsVerification: trueThe account's email address is not confirmed yet.
403upgrade: trueThe route needs a paid plan. Batches are Pro.
429An hourly ceiling was reached. Retry-After says how long to wait.
503unavailableScanning is paused. Retry later; nothing was consumed.

Using scores in your own product

Show a score wherever it helps someone decide, and quote it with attribution and the report link so anyone can check it against the source. What is not allowed is reselling the scores as a data product of your own. The Terms are the authority on this.

Read the Terms of Service