API Documentation

Complete reference for the DomScan Domain Intelligence API

Overview

DomScan provides a comprehensive RESTful API for domain intelligence. Check availability across 1000+ TLDs, get AI-powered name suggestions, estimate domain values, monitor domain health, detect typosquatting threats, and check social handle availability.

Start for Free: DomScan includes 10,000 free credits per month. No credit card required. We'll give plenty of notice before any pricing changes.

Authentication

No authentication is required to get started. Your account begins with 10,000 free credits per month, so you can make requests immediately.

When API keys are introduced, they will be passed via the X-API-Key header:

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/status?name=example&tlds=com"

Base URL

All API requests should be made to:

https://domscan.net

Quickstart

Make your first availability check in seconds. These examples call the /v1/status endpoint and return availability across multiple TLDs.

curl "https://domscan.net/v1/status?name=launch&tlds=com,io,ai&prefer_cache=1"
const response = await fetch(
  "https://domscan.net/v1/status?name=launch&tlds=com,io,ai&prefer_cache=1"
);
const data = await response.json();
console.log(data.results);
import requests

response = requests.get(
    "https://domscan.net/v1/status",
    params={"name": "launch", "tlds": "com,io,ai", "prefer_cache": 1},
    timeout=10,
)
print(response.json()["results"])
package main

import (
  "encoding/json"
  "fmt"
  "net/http"
)

func main() {
  url := "https://domscan.net/v1/status?name=launch&tlds=com,io,ai&prefer_cache=1"
  resp, err := http.Get(url)
  if err != nil {
    panic(err)
  }
  defer resp.Body.Close()

  var payload map[string]any
  json.NewDecoder(resp.Body).Decode(&payload)
  fmt.Println(payload["results"])
}

Request Headers

DomScan works without authentication during beta. If/when keys are required, send them in the X-API-Key header.

  • Content-Type: application/json (required for POST requests)
  • Accept: application/json (optional but recommended)
  • X-API-Key: API key for authenticated requests (future)

Check Domain Availability

Check if a domain name is available across one or more TLDs.

GET /v1/status

Query Parameters

ParameterTypeDescription
name required string Domain label without TLD (e.g., "mycompany")
tlds required string Comma-separated list of TLDs to check (max 50)
prefer_cache optional boolean Use cached results when available (recommended)

Example Request

curl "https://domscan.net/v1/status?name=startup&tlds=com,io,co&prefer_cache=1"
const url = new URL("https://domscan.net/v1/status");
url.searchParams.set("name", "startup");
url.searchParams.set("tlds", "com,io,co");
url.searchParams.set("prefer_cache", "1");

const response = await fetch(url);
const data = await response.json();
console.log(data.results);
import requests

params = {"name": "startup", "tlds": "com,io,co", "prefer_cache": 1}
data = requests.get("https://domscan.net/v1/status", params=params).json()
print(data["results"])
 "startup",
  "tlds" => "com,io,co",
  "prefer_cache" => 1
]);
$response = file_get_contents("https://domscan.net/v1/status?$query");
echo $response;
?>

Example Response

{
  "name": "startup",
  "results": [
    {
      "domain": "startup.com",
      "tld": "com",
      "available": false,
      "source": "rdap",
      "checked_at": "2025-01-05T10:30:00.000Z"
    },
    {
      "domain": "startup.io",
      "tld": "io",
      "available": true,
      "source": "rdap",
      "checked_at": "2025-01-05T10:30:00.000Z"
    }
  ],
  "meta": {
    "served_by": "pop=LAX country=US",
    "worker_version": "2.0.0"
  }
}

Bulk Domain Check

Check availability of multiple complete domain names in a single request.

POST /v1/status/bulk

Request Body

FieldTypeDescription
domains required string[] Array of complete domain names (max 50)
options.prefer_cache optional boolean Use cached results when available

Example Request

curl -X POST "https://domscan.net/v1/status/bulk" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["mybrand.com", "mybrand.io"], "options": {"prefer_cache": true}}'
const response = await fetch("https://domscan.net/v1/status/bulk", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    domains: ["mybrand.com", "mybrand.io"],
    options: { prefer_cache: true }
  })
});
const data = await response.json();
console.log(data.results);
import requests

payload = {
  "domains": ["mybrand.com", "mybrand.io"],
  "options": {"prefer_cache": True}
}
response = requests.post(
  "https://domscan.net/v1/status/bulk",
  json=payload,
  timeout=10
)
print(response.json()["results"])
package main

import (
  "bytes"
  "encoding/json"
  "fmt"
  "net/http"
)

func main() {
  payload := map[string]any{
    "domains": []string{"mybrand.com", "mybrand.io"},
    "options": map[string]bool{"prefer_cache": true},
  }
  body, _ := json.Marshal(payload)
  resp, err := http.Post("https://domscan.net/v1/status/bulk", "application/json", bytes.NewReader(body))
  if err != nil {
    panic(err)
  }
  defer resp.Body.Close()
  fmt.Println(resp.Status)
}

Domain Suggestions

Generate AI-powered domain name suggestions based on keywords. Returns brandable, short, and keyword-rich options with availability status.

GET /v1/suggest

Query Parameters

ParameterTypeDescription
keywords required string Comma-separated keywords (e.g., "tech,cloud")
limit optional number Max suggestions to return (default: 20, max: 100)
tlds optional string TLDs to use (default: "com,ai,app")
style optional string Style: brandable, short, keyword-rich, pronounceable

Example Request

curl "https://domscan.net/v1/suggest?keywords=cloud,sync&limit=10&style=brandable"
const params = new URLSearchParams({
  keywords: "cloud,sync",
  limit: "10",
  style: "brandable"
});
const response = await fetch("https://domscan.net/v1/suggest?" + params);
console.log(await response.json());
import requests

params = {"keywords": "cloud,sync", "limit": 10, "style": "brandable"}
data = requests.get("https://domscan.net/v1/suggest", params=params).json()
print(data["suggestions"])

Example Response

{
  "suggestions": [
    {
      "name": "cloudsync",
      "domain": "cloudsync.io",
      "tld": "io",
      "score": 95,
      "styles": ["brandable", "pronounceable"],
      "method": "combination",
      "available": true
    }
  ],
  "keywords": ["cloud", "sync"],
  "generated_count": 10,
  "available_count": 4
}

Domain Valuation

Get algorithmic value estimates based on domain characteristics like length, TLD tier, dictionary words, and brandability patterns.

Note: This is an algorithmic estimate only. Actual market value may vary significantly based on buyer demand and market conditions.
GET /v1/value

Query Parameters

ParameterTypeDescription
domain required string Complete domain name (e.g., "startup.com")

Example Request

curl "https://domscan.net/v1/value?domain=startup.io"

Example Response

{
  "domain": "startup.io",
  "label": "startup",
  "tld": "io",
  "estimate": {
    "low": 350,
    "mid": 700,
    "high": 1750,
    "currency": "USD"
  },
  "factors": {
    "length": 7,
    "tldTier": "premium",
    "isDictionaryWord": true,
    "isBrandable": true,
    "pronounceability": 0.85
  },
  "confidence": 0.65
}
POST /v1/value/bulk

Valuate multiple domains in one request. Request body: {"domains": ["a.com", "b.io"]}

Domain Health

Comprehensive health checks including DNS configuration, SSL certificates, email deliverability, and security headers.

GET /v1/health

Query Parameters

ParameterTypeDescription
domain required string Domain to check (e.g., "example.com")

Example Response

{
  "domain": "example.com",
  "score": 85,
  "grade": "A",
  "details": {
    "dns": { "score": 100, "hasA": true, "hasMX": true },
    "ssl": { "score": 90, "valid": true, "issuer": "Let's Encrypt" },
    "email": { "score": 80, "hasSPF": true, "hasDMARC": true },
    "security": { "score": 70, "hasHSTS": true }
  },
  "warnings": ["Missing DNSSEC"]
}
GET /v1/health/quick

Quick health check - only DNS and HTTPS reachability. Faster but less comprehensive.

Typosquatting Detection

Detect typosquatting threats by analyzing common typos, homoglyphs, and brand impersonation risks.

GET /v1/typos

Query Parameters

ParameterTypeDescription
domain required string Domain to check for typosquatting variants
limit optional number Max permutations to check (default: 50)

Example Response

{
  "domain": "google.com",
  "permutations_generated": 50,
  "registered_typos": [
    {
      "domain": "gooogle.com",
      "type": "repetition",
      "risk": "high",
      "registered": true
    },
    {
      "domain": "googIe.com",
      "type": "homoglyph",
      "risk": "critical",
      "registered": true
    }
  ],
  "threat_level": "critical",
  "risk_summary": {
    "critical": 2,
    "high": 5,
    "medium": 10,
    "low": 8
  }
}

Social Handle Availability

Check username availability across social media platforms like GitHub and Reddit.

GET /v1/social

Query Parameters

ParameterTypeDescription
handle required string Username/handle to check

Example Response

{
  "handle": "mycompany",
  "availability": {
    "github": { "available": false, "profile_url": "https://github.com/mycompany" },
    "reddit": { "available": true, "profile_url": null }
  },
  "summary": {
    "available_count": 1,
    "unavailable_count": 1
  }
}

Domain Compare

Compare multiple domains side-by-side. Get availability, valuation estimates, brand scores, and intelligent recommendations.

GET /v1/compare

Query Parameters

ParameterTypeDescription
domains required string Comma-separated domain names (2-10 domains)

Example Request

curl "https://domscan.net/v1/compare?domains=startup.com,startup.io,startup.ai"

Example Response

{
  "domains": [
    {
      "domain": "startup.io",
      "available": true,
      "valuation": { "estimate_usd": 2500, "confidence": 0.7 },
      "score": { "overall": 85, "brandability": 90 },
      "tld_info": { "type": "ccTLD", "trust_tier": "premium" },
      "recommendation_rank": 85,
      "recommendation_reason": "available, premium .io TLD, excellent brand score"
    }
  ],
  "recommendation": {
    "best_available": "startup.io",
    "best_overall": "startup.com",
    "best_value": "startup.ai",
    "reasoning": "startup.io is recommended: available, premium TLD"
  }
}

TLD Intelligence

Get detailed information about TLDs including pricing, restrictions, trust scores, and recommended use cases.

GET /v1/tlds

Query Parameters

ParameterTypeDescription
type optional string Filter by type: gTLD, ccTLD, newTLD, idn
trust_tier optional string Filter by trust: premium, standard, economy
use_case optional string Get TLDs for a use case (e.g., "startup", "tech")
GET /v1/tlds/:tld

Example Response

{
  "tld": "io",
  "type": "ccTLD",
  "name": "British Indian Ocean Territory",
  "description": "Popular with tech startups and SaaS companies",
  "introduced": 1997,
  "restrictions": "None - open registration",
  "rdap_supported": true,
  "pricing": {
    "registration_usd": 40,
    "renewal_usd": 40
  },
  "popularity": { "rank": 5, "tier": "top10", "use_cases": ["startup", "tech", "saas"] },
  "trust": { "score": 85, "tier": "premium" }
}

DNS Security Analysis

Comprehensive email and DNS security analysis including SPF, DKIM, DMARC, DNSSEC, and CAA records.

GET /v1/dns/security

Query Parameters

ParameterTypeDescription
domain required string Domain to analyze

Example Response

{
  "domain": "example.com",
  "spf": { "exists": true, "valid": true, "policy": "fail" },
  "dkim": { "exists": true, "selectors_found": ["google", "selector1"] },
  "dmarc": { "exists": true, "policy": "reject", "percentage": 100 },
  "dnssec": { "enabled": true, "valid": true },
  "caa": { "exists": true, "issuers": ["letsencrypt.org"] },
  "security_score": 92,
  "security_grade": "A",
  "recommendations": ["Consider adding MTA-STS for encrypted email delivery"]
}

DNS Propagation Checker

Check DNS record propagation across 13 global DNS servers worldwide.

GET /v1/dns/propagation

Query Parameters

ParameterTypeDescription
domain required string Domain to check
type optional string Record type: A, AAAA, CNAME, MX, TXT, NS (default: A)
expected optional string Expected value to check for

Example Response

{
  "domain": "example.com",
  "record_type": "A",
  "propagation_percentage": 100,
  "fully_propagated": true,
  "consistent": true,
  "unique_values": ["93.184.216.34"],
  "results": [
    {
      "server": { "name": "Cloudflare US", "location": "Global Anycast" },
      "success": true,
      "records": ["93.184.216.34"],
      "ttl": 86400,
      "response_time_ms": 12
    }
  ],
  "summary": {
    "total_servers": 13,
    "successful": 13,
    "failed": 0
  }
}
GET /v1/dns/servers

Get the list of DNS servers used for propagation checks.

DNS Lookup

Query DNS records for any domain. Supports A, AAAA, MX, NS, TXT, CNAME, CAA, SOA, and more.

GET /v1/dns

Query Parameters

ParameterTypeDescription
domain required string Domain name to query
type optional string Record type: A, AAAA, MX, NS, TXT, CNAME, CAA, SOA (default: A)

Example Response

{
  "domain": "example.com",
  "type": "A",
  "records": [
    { "value": "93.184.216.34", "ttl": 300 }
  ],
  "query_time_ms": 45
}
GET /v1/dns/all

Get all DNS record types for a domain in a single request.

Domain Profile

Get normalized RDAP registration data including registrar, creation date, expiration, nameservers, and DNSSEC status.

GET /v1/profile

Query Parameters

ParameterTypeDescription
domain required string Full domain name (e.g., example.com)

Example Response

{
  "domain": "example.com",
  "registrar": "IANA",
  "created": "1995-08-14T04:00:00Z",
  "updated": "2023-08-14T07:01:38Z",
  "expires": "2024-08-13T04:00:00Z",
  "nameservers": ["a.iana-servers.net", "b.iana-servers.net"],
  "dnssec": true,
  "status": ["clientDeleteProhibited", "serverUpdateProhibited"]
}

Redirect Chain

Follow URL redirect chains to detect HTTPS upgrades, domain changes, and final landing pages.

GET /v1/redirects

Query Parameters

ParameterTypeDescription
url required string Starting URL to follow
max_redirects optional number Maximum redirects to follow (default: 10)

Example Response

{
  "original_url": "http://example.com",
  "final_url": "https://www.example.com/",
  "redirect_count": 2,
  "chain": [
    { "url": "http://example.com", "status": 301, "location": "https://example.com" },
    { "url": "https://example.com", "status": 301, "location": "https://www.example.com/" }
  ],
  "https_upgrade": true,
  "total_time_ms": 234
}

Tech Stack Detection

Detect technologies used by a website: CDN, CMS, frameworks, analytics, and more.

GET /v1/tech

Query Parameters

ParameterTypeDescription
domain required string Domain to analyze

Example Response

{
  "domain": "example.com",
  "technologies": {
    "cdn": ["Cloudflare"],
    "cms": [],
    "analytics": ["Google Analytics"],
    "frameworks": ["React"],
    "servers": ["nginx"]
  },
  "headers": {
    "server": "cloudflare",
    "x-powered-by": null
  }
}

Website Categorization

Classify websites into categories: e-commerce, tech, news, blogs, and more.

GET /v1/categorize

Query Parameters

ParameterTypeDescription
domain required string Domain to categorize

Example Response

{
  "domain": "github.com",
  "categories": ["Technology", "Software Development", "Code Hosting"],
  "primary_category": "Technology",
  "confidence": 0.95
}

Domain Similarity

Compare domains for similarity. Useful for detecting typosquatting with multiple algorithms.

GET /v1/similarity

Query Parameters

ParameterTypeDescription
domain1 required string First domain to compare
domain2 required string Second domain to compare

Example Response

{
  "domain1": "google.com",
  "domain2": "g00gle.com",
  "similarity": {
    "levenshtein": 0.86,
    "jaro_winkler": 0.93,
    "visual": 0.91
  },
  "is_similar": true,
  "typosquatting_risk": "high"
}

TLD Coverage

Get the list of supported TLDs and RDAP endpoint health.

GET /v1/coverage

Query Parameters

ParameterTypeDescription
live optional boolean Test RDAP endpoints live (slower)

Response Format

All responses are JSON. Each domain result contains these common fields:

  • domain - Complete domain name
  • available - Boolean availability status
  • source - "rdap" or "cache"
  • checked_at - ISO 8601 timestamp
  • error - Present if an error occurred

HTTP Status Codes

200 OK - Request successful

400 Bad Request - Invalid parameters

429 Too Many Requests - Rate limit exceeded

500 Server Error - Internal error

502 Bad Gateway - Upstream RDAP error

Error Codes

BAD_REQUEST Missing or invalid parameters
UNSUPPORTED_TLD TLD not supported
INVALID_DOMAIN Invalid domain format
RDAP_TIMEOUT Registry timeout
RATE_LIMITED Too many requests

Rate Limits

  • Cached requests (prefer_cache=1): Unlimited
  • Fresh RDAP lookups: ~100 requests/minute
  • Bulk endpoint: 50 domains per request
  • TLDs per request: 50 maximum
Tip: Always use prefer_cache=1 for best performance and to avoid rate limits.

Caching

DomScan uses intelligent caching for fast responses:

  • Available domains: 60 seconds
  • Registered domains: 6 hours

Best Practices

1. Always Use Caching

Add prefer_cache=1 to all requests unless you specifically need fresh data.

2. Batch Your Requests

Use the bulk endpoint instead of making multiple individual requests.

3. Check Coverage First

Verify which TLDs are supported: GET /v1/coverage

4. Handle Errors Gracefully

Implement retry logic with exponential backoff for transient failures.

Need Help? Contact us at @estevecastells