DomainKits API

The DomainKits REST API provides programmatic access to domain intelligence data. Search newly registered, aged, expired, and deleted domains. Look up WHOIS records, reverse nameserver queries, and download NRDs zone files. API access requires a Premium or higher plan.

Responses contain no personal data. WHOIS results are limited to registrar, dates, status codes and nameservers; registrant names, emails, addresses and phone numbers are not returned.

Base URL
https://premium-api.domainkits.com/api/v1
Authentication

Include your API key in every request. API keys are the same keys used for the DomainKits MCP Server.

Authorization Header (recommended)
Authorization: Bearer dk_xxx
Custom Header
X-API-Key: dk_xxx
Quick Start
# Search newly registered .com domains curl "https://premium-api.domainkits.com/api/v1/search/nrds?tld=com" \ -H "Authorization: Bearer dk_your_key"
Response
{ "success": true, "data": [...], "total": 12345 }
Missing or Invalid Key
{ "success": false, "error": "API key required." }
Versioning & Stability

The API is versioned in the URL path (/api/v1). We treat the v1 contract as stable so you can build on it without surprises.

What stays stable within v1
  • Existing response fields are not removed or renamed. New fields may be added, so parse defensively and ignore unknown fields.
  • Existing request parameters keep their meaning. New optional parameters may be added.
  • The success / error envelope and HTTP status code semantics do not change.
  • A value of 0 in rate-limit configuration means unlimited. This convention is stable.
Breaking changes
Any breaking change ships under a new version path (/api/v2). When a version is scheduled for retirement, we announce it with at least 90 days notice before v1 stops responding. Endpoints marked Beta are excluded from this guarantee and may change while in beta.
Quota reset
Daily quotas reset at 00:00 UTC. Per-minute limits use a rolling 60-second window. These limits are separate from the DomainKits web interface and the MCP server, which are metered independently.
Version in path
https://premium-api.domainkits.com/api/v1/...
Rate limit headers (every metered response)
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 57 X-RateLimit-Reset: 1719744000
Forward compatibility
# New fields may appear over time. # Ignore unknown keys; never assume # the field set is closed within v1.
Errors

The API uses standard HTTP status codes. Errors return a JSON object with success: false and an error message.

200 Success
302 Redirect (file download)
400 Bad request
401 Unauthorized
403 Forbidden
405 Method not allowed
429 Rate limit exceeded
502 Request timed out
Error Response
{ "success": false, "error": "Error message here" }
GET /api/v1/search/nrds

Search newly registered domains (last 60 days, refreshed continuously). Provide query for keyword search, tld without query to browse, or neither to page through the full dataset. The freshest rows (registered within the last hours, not yet in the daily datasets) carry live: true. They are included by default; pass live=false to leave them out. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10 (e.g. com or com,net,org). Results are the union. Without query, enters TLD browse mode.
position stringoptional
Keyword position within the second-level label. Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63. Either side may be omitted; equal values select an exact length.
period_min / period_max integeroptional
Registration term range in years, 1-10.
create_date_start / create_date_end dateoptional
Registration date range, YYYY-MM-DD, inclusive. Either side may be omitted.
has_number / all_number / all_alpha / has_hyphen / has_sale booleanoptional
Composition and listing filters. Only the literals true / false; 1, 0, yes return 400. has_sale=true keeps only domains with a marketplace listing.
exclude_query stringoptional
Negative keywords, comma-separated; matching domains are excluded.
live booleanoptional
Whether the freshest rows are included. false restricts results to the daily datasets; true (same as omitting the parameter) returns the full data including the freshest rows. Only the literals true / false. To isolate the freshest rows, filter on the per-row live field.
sort stringoptional
reg_date_desc (default) reg_date_asc length_asc length_desc period_asc period_desc tld_count_asc tld_count_desc alpha.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000. Beyond that use export.
Response fields
domain, tld, created, expires, period, length, tld_count, components, for_sale (listing code, empty when not listed), live (true = registered within the last hours, flips to false once the daily datasets cover it). The field set is fixed; empty means no value.
Request (keyword search)
curl "https://premium-api.domainkits.com/api/v1/search/nrds?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 99114, "limit": 2, "offset": 0, "data": [ { "domain": "wellcelltech.com", "tld": "com", "created": "2026-08-11", "expires": "2027-08-11", "period": 1, "length": 12, "tld_count": 1, "components": ["well", "cell", "tech"], "for_sale": "", "live": false } ] }
Request (TLD browse, short names without hyphens)
curl "https://premium-api.domainkits.com/api/v1/search/nrds?tld=com&length_max=4&has_hyphen=false&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 1137337, "limit": 2, "offset": 0, "data": [ { "domain": "rvkp.com", "tld": "com", "created": "2026-08-10", "expires": "2027-08-10", "period": 1, "length": 4, "tld_count": 1, "components": null, "for_sale": "", "live": false } ] }
GET /api/v1/search/nrds-live

Search the live newly registered feed, covering the last 3 days only. Same parameter vocabulary as /search/nrds: provide query for keyword search, tld without query to browse one TLD (single value here, no comma lists), or neither to page through the whole live window. Use this endpoint when recency matters; use /search/nrds for the full history, richer filters, and larger exports. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens). When provided, searches across all TLDs.
tld stringoptional
TLD filter, single value (e.g. com). Optional; omit both tld and query to browse the whole window.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
create_date_start / create_date_end dateoptional
Registration date range, YYYY-MM-DD, inclusive. The feed only holds the last 3 days.
has_number / all_number / all_alpha / has_hyphen booleanoptional
Composition filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
reg_date_desc (default) reg_date_asc length_asc length_desc alpha alpha_desc. Any other value returns 400.
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Bypasses pagination and returns up to 10,000 rows in one pass. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns match this endpoint's JSON fields. Returns 404 when no rows match.
limit integeroptional
Results per page (default: 40). Capped at 200 for Premium, 500 for Platinum.
offset integeroptional
Pagination offset, 0-10,000 on this endpoint.
Response fields
domain, tld, created, expires, length, components
Notes
No tld_count
Unlike /search/nrds, this endpoint does not return tld_count. Every domain here was registered within the last three days, so the count would carry no information.
Exact totals
total is exact after all filters, including position and exclude_query. When a query matches more than 10,000 rows before those filters, the endpoint returns 400; narrow the conditions.
Request (keyword search, today only)
curl "https://premium-api.domainkits.com/api/v1/search/nrds-live?query=cloud&create_date_start=2026-08-19&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 115, "limit": 2, "offset": 0, "data": [ { "domain": "cloudrental.app", "tld": "app", "created": "2026-08-19T11:10:48Z", "expires": "2027-08-19T11:10:48Z", "length": 11, "components": ["cloud", "rental"] } ] }
Request (TLD browse, letters-only 4-character names)
curl "https://premium-api.domainkits.com/api/v1/search/nrds-live?tld=com&all_alpha=true&length_min=4&length_max=4&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 2, "limit": 2, "offset": 0, "data": [ { "domain": "ydra.com", "tld": "com", "created": "2026-08-18T09:31:02Z", "expires": "2027-08-18T09:31:02Z", "length": 4, "components": ["ydra"] } ] }
GET /api/v1/search/aged

Search aged domains (5 to 20+ years of history). Provide query for keyword search, tld without query (comma-separated, up to 10), or neither to page through the full dataset. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10. Without query, enters TLD browse mode.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
age_min / age_max integeroptional
Domain age range in years, 0-100. Either side may be omitted.
has_number / all_number / all_alpha / has_hyphen / has_sale booleanoptional
Composition and listing filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
age_desc (default) age_asc length_asc length_desc reg_date_asc reg_date_desc tld_count_asc tld_count_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
Response fields
domain, tld, created (full date), age (years), length, components, for_sale (listing code, empty when not listed), tld_count
Request (keyword search)
curl "https://premium-api.domainkits.com/api/v1/search/aged?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 554550, "limit": 2, "offset": 0, "data": [ { "domain": "bostech.com", "tld": "com", "created": "1988-03-12", "age": 38, "length": 7, "components": ["bos", "tech"], "for_sale": "", "tld_count": 26 } ] }
Request (TLD browse, 20+ years, short names)
curl "https://premium-api.domainkits.com/api/v1/search/aged?tld=com&age_min=20&length_max=4&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 346696, "limit": 2, "offset": 0, "data": [ { "domain": "bbn.com", "tld": "com", "created": "1985-04-24", "age": 41, "length": 3, "components": null, "for_sale": "", "tld_count": 119 } ] }
GET /api/v1/search/active

Search active (currently registered) domains, 250M+ inventory. Two modes: provide query for keyword search, or provide tld without query (comma-separated, up to 10). Omitting both browses the full inventory across all TLDs. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10. Without query, enters TLD browse mode.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
has_number / all_number / all_alpha / has_hyphen / has_sale booleanoptional
Composition and listing filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
length_asc (default) length_desc alpha tld_count_asc tld_count_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
Response fields
domain, tld, length, for_sale (listing code, empty when not listed), tld_count
Request
curl "https://premium-api.domainkits.com/api/v1/search/active?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Request (TLD browse, listed for sale only)
curl "https://premium-api.domainkits.com/api/v1/search/active?tld=com&has_sale=true&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 265881, "limit": 2, "offset": 0, "data": [ { "domain": "tech.asia", "tld": "asia", "length": 4, "for_sale": "se", "tld_count": 488 } ] }
GET /api/v1/search/expired

Search expired domains (grace, redemption, pending delete). Provide query for keyword search, tld without query (comma-separated, up to 10), or neither to page through the full dataset. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10. Without query, enters TLD browse mode.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
age_min / age_max integeroptional
Domain age range in years, 0-100.
status stringoptional
Expiry stage filter. Values: expired, redemption, pending_delete.
has_hold booleanoptional
Registrar hold status. Only true / false.
auction_date_start / auction_date_end dateoptional
Auction date range, YYYY-MM-DD, inclusive. Either side may be omitted.
found_date_start / found_date_end dateoptional
Range for the date the domain was first observed in the expired pool, YYYY-MM-DD, inclusive. Use a recent start date to select fresh expiries.
has_number / all_number / all_alpha / has_hyphen booleanoptional
Composition filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
age_desc (default) age_asc length_asc length_desc tld_count_asc tld_count_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
Response fields
domain, tld, created, age, status (expired | redemption | pending_delete), auction_date, found_date, length, category, majestic, backlinks, hold, tld_count. The field set is fixed; empty or null means no value.
Request (keyword search)
curl "https://premium-api.domainkits.com/api/v1/search/expired?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 67035, "limit": 2, "offset": 0, "data": [ { "domain": "timestech.com", "tld": "com", "created": "1994-05-02", "age": 32, "status": "expired", "auction_date": "", "found_date": "2026-08-05", "length": 9, "category": "", "majestic": null, "backlinks": null, "hold": "", "tld_count": 9 } ] }
Request (TLD browse, pending delete)
curl "https://premium-api.domainkits.com/api/v1/search/expired?tld=com&status=pending_delete&limit=2" \ -H "Authorization: Bearer dk_xxx"
GET /api/v1/search/deleted

Search deleted (dropped) domains. Provide query for keyword search, tld without query (comma-separated, up to 10), or neither to page through the full dataset. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10. Without query, enters TLD browse mode.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
age_min / age_max integeroptional
Domain age range in years, 0-100.
has_hold booleanoptional
Registrar hold status. Only true / false.
found_date_start / found_date_end dateoptional
Range for the date the drop was observed, YYYY-MM-DD, inclusive. Use a recent start date to select fresh drops.
has_number / all_number / all_alpha / has_hyphen booleanoptional
Composition filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
age_desc (default) age_asc length_asc length_desc tld_count_asc tld_count_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
Response fields
domain, tld, age (years), reg_year, exp_year (year granularity), found_date, length, components, hold, tld_count
Request
curl "https://premium-api.domainkits.com/api/v1/search/deleted?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 167989, "limit": 2, "offset": 0, "data": [ { "domain": "aristechchem.com", "tld": "com", "age": 29, "reg_year": "1997", "exp_year": "2026", "found_date": "2026-06-04", "length": 12, "components": ["aris", "tech", "chem"], "hold": "", "tld_count": 1 } ] }
GET /api/v1/search/market

Search marketplace domains currently listed for sale. Provide query for keyword search, tld without query (comma-separated, up to 10), or neither to page through the full dataset. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10. Without query, enters TLD browse mode.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
platform stringoptional
Marketplace the listing appears on, comma-separated, up to 10, case-insensitive (e.g. sedo,godaddy or 4.cn). Values follow the data; a platform with no listings returns an empty result, not an error.
listed_days_min / listed_days_max integeroptional
Days since the listing first appeared, 1-3 (1 = today). Listings older than 3 days count as 4+ for this range; use listed_days_max=3 for fresh listings.
has_number / all_number / all_alpha / has_hyphen / has_sale booleanoptional
Composition and listing filters. Only the literals true / false.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
length_asc (default) length_desc alpha tld_count_asc tld_count_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
Response fields
domain, tld, length, components, for_sale (listing code), platform (marketplace name), listed_days (1-3, null when older), tld_count
Request (keyword search)
curl "https://premium-api.domainkits.com/api/v1/search/market?query=tech&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 22841, "limit": 2, "offset": 0, "data": [ { "domain": "tech.exchange", "tld": "exchange", "length": 4, "components": ["tech"], "for_sale": "go", "platform": "Godaddy", "listed_days": null, "tld_count": 521 } ] }
Request (TLD browse, one marketplace)
curl "https://premium-api.domainkits.com/api/v1/search/market?tld=com&platform=sedo&limit=2" \ -H "Authorization: Bearer dk_xxx"
Search Export

Export full results as a downloadable file. Add export=csv or export=txt to any endpoint listed below, with any of that endpoint's filters. Export bypasses pagination and returns up to 50,000 results in a single response (per-endpoint caps below). All export requests, regardless of endpoint, draw on the shared Search Export quota. Returns 404 when no rows match.

Export Parameter
export stringoptional
Export format. Values: csv or txt.
  • csv returns a per-endpoint column set, listed below
  • txt returns domain names only, one per line
CSV Columns
CSV columns match each endpoint's JSON response fields exactly.
  • /search/nrds — domain, tld, created, expires, period, length, tld_count, for_sale, components
  • /search/aged — domain, tld, created, age, length, components, for_sale, tld_count
  • /search/expired — domain, tld, created, age, status, auction_date, found_date, length, category, majestic, backlinks, hold, tld_count
  • /search/deleted — domain, tld, age, reg_year, exp_year, found_date, length, components, hold, tld_count
  • /search/active — domain, tld, length, for_sale, tld_count
  • /search/market — domain, tld, length, components, for_sale, platform, listed_days, tld_count
  • /ns-reverse: domain, tld, length
  • /monitor/changes: domain, tld, found_date, reason, details_old, details_new, length, tld_count, components
  • /typosquat: domain, tld, type, registered, for_sale, expiring, tld_count
When sort is omitted, each endpoint exports in its default order (newest first on /search/nrds, oldest first on /search/aged, /search/expired, and /search/deleted, shortest first on /search/active, /search/market, and /ns-reverse, most recent change first on /monitor/changes; /typosquat exports in generation order, grouped by variant class).
Supported Endpoints
  • /search/nrds, /search/aged, /search/active, /search/expired, /search/deleted, /search/market (up to 50,000 rows)
  • /ns-reverse, /monitor/changes (up to 50,000 rows; columns in their sections)
  • /typosquat (the whole generated set, up to 5,000 rows; no latest_whois in exports)
  • /search/nrds-live (up to 10,000 rows), /ct/subdomains (10,000), /ct/certs and /ct/search (5,000)
Rate Limits
Export requests draw on a separate quota and do not consume your regular search allowance.
PlanPer minutePer dayPer month
Premium210100
Platinum101001,000
Daily quotas reset at 00:00 UTC; monthly quotas reset on the 1st (UTC). Quotas follow the account, so regenerating an API key does not reset usage. Track what you have left with /usage.
Request (CSV export)
curl -o results.csv \ "https://premium-api.domainkits.com/api/v1/search/nrds?query=tech&has_number=false&export=csv" \ -H "Authorization: Bearer dk_xxx"
CSV Response
domain,tld,created,expires,period,length,tld_count,for_sale,components wellcelltech.com,com,2026-08-11,2027-08-11,1,12,1,,well cell tech biotechlab.net,net,2026-08-10,2027-08-10,1,10,3,se,bio tech lab ...
Request (TXT export)
curl -o results.txt \ "https://premium-api.domainkits.com/api/v1/search/nrds?query=tech&has_number=false&export=txt" \ -H "Authorization: Bearer dk_xxx"
TXT Response
wellcelltech.com biotechlab.net ...
Request (expired domains, CSV export)
curl -o expiring.csv \ "https://premium-api.domainkits.com/api/v1/search/expired?tld=com&status=pending_delete&export=csv" \ -H "Authorization: Bearer dk_xxx"
Request (TLD browse export, listed for sale)
curl -o com_forsale.txt \ "https://premium-api.domainkits.com/api/v1/search/active?tld=com&has_sale=true&export=txt" \ -H "Authorization: Bearer dk_xxx"
GET /api/v1/whois

Retrieve WHOIS registration data for a domain name.

Query Parameters
domain stringrequired
Full domain name including TLD (e.g. abtdomain.com).
Request
curl "https://premium-api.domainkits.com/api/v1/whois?domain=abtdomain.com" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "registered": true, "data": { "domain": "abtdomain.com", "registrar_name": "NameSilo", "created": "2023-04-21T15:51:41Z", "expires": "2027-04-21T15:51:41Z", "updated": "2026-04-22T08:30:19Z", "nameservers": ["marvin.ns.cloudflare.com", "norah.ns.cloudflare.com"], "status": ["client transfer prohibited"] } }
GET /api/v1/dns

Query DNS records for a domain. The records object is keyed by record type (A, AAAA, MX, NS, TXT, CNAME, SOA, and CAA when present). A record type is included only when the resolver returns data for it; an absent key is not proof that no such record exists. Parse defensively.

Query Parameters
domain stringrequired
Domain name to query (e.g. google.com).
Request
curl "https://premium-api.domainkits.com/api/v1/dns?domain=google.com" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "data": { "domain": "google.com", "records": { "A": [{ "ip": "142.251.210.46", "ttl": 300 }], "AAAA": [{ "ipv6": "2607:f8b0:4006:811::200e", "ttl": 300 }], "MX": [{ "target": "smtp.google.com", "pri": 10 }], "NS": [{ "target": "ns1.google.com" }, ...] } } }
POST /api/v1/bulk/dns

Resolve nameservers for up to 20 domains in one request. Where the nameservers identify a marketplace or a parking service, the entry carries a domain_status of for_sale or parking; domains in normal use have no such field. Each domain in the batch draws one unit from the same daily quota as /dns, so a batch of 20 costs the same as 20 single lookups. Batch calls are capped at 5 per minute.

Body Parameters
domains arrayrequired
Domain names to resolve. Maximum 20 per request. Duplicates and malformed entries are dropped before the lookup.
Request
curl -X POST "https://premium-api.domainkits.com/api/v1/bulk/dns" \ -H "Authorization: Bearer dk_xxx" \ -H "Content-Type: application/json" \ -d '{"domains": ["example.com", "example.net"]}'
Response
{ "success": true, "total": 2, "registered": 2, "data": [ { "domain": "example.com", "status": "registered", "nameservers": ["a.iana-servers.net", "b.iana-servers.net"] }, { "domain": "example.net", "status": "registered", "nameservers": ["ns1.sedoparking.com"], "domain_status": "parking" } ] }
POST /api/v1/bulk/whois

Registrar, dates, EPP status codes and nameservers for up to 30 domains in one request. No registrant personal data is returned. Each domain in the batch draws one unit from the same daily quota as /whois, so a batch of 30 costs the same as 30 single lookups. Batch calls are capped at 5 per minute.

Body Parameters
domains arrayrequired
Domain names to look up. Maximum 30 per request. Duplicates and malformed entries are dropped before the lookup.
Request
curl -X POST "https://premium-api.domainkits.com/api/v1/bulk/whois" \ -H "Authorization: Bearer dk_xxx" \ -H "Content-Type: application/json" \ -d '{"domains": ["example.com", "example.net"]}'
Response
{ "success": true, "total": 2, "registered": 2, "data": [ { "domain": "example.com", "registered": true, "registrar_name": "RESERVED-IANA", "created": "1995-08-14T04:00:00Z", "expires": "2027-08-13T04:00:00Z", "status": ["client transfer prohibited"], "nameservers": ["a.iana-servers.net"] }, { "domain": "example.net", "registered": false } ] }
GET /api/v1/ns-reverse

Find all domains using a specific nameserver, across gTLDs and ccTLDs (multi-level suffixes like co.uk supported). Same parameter vocabulary as the search endpoints; unrecognized parameter names and values return 400.

Query Parameters
ns stringrequired
Nameserver hostname (e.g. ns1.example.com). An unknown nameserver returns an empty result, not an error.
query stringoptional
Filter by substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10 (e.g. com,net or co.uk).
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
length_min / length_max integeroptional
Second-level label length range, 1-63.
has_number / all_number / all_alpha / has_hyphen booleanoptional
Composition filters. Only the literals true / false; 1, 0, yes return 400.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
length_asc (default) length_desc alpha.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Bypasses pagination and returns up to 50,000 rows in one pass. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns: domain, tld, length. Returns 404 when no rows match.
Response fields
Envelope: ns (echo), ns_total (domains on this nameserver before filters), total (matches after filters), limit, offset. Each record: domain, tld, length.
Request
curl "https://premium-api.domainkits.com/api/v1/ns-reverse?ns=dns1.registrar-servers.com&length_max=6&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "ns": "dns1.registrar-servers.com", "ns_total": 1284512, "total": 48211, "limit": 2, "offset": 0, "data": [ { "domain": "ab.com", "tld": "com", "length": 2 } ] }
Response (unknown nameserver)
{ "success": true, "ns": "ns1.nobody.example", "ns_total": 0, "total": 0, "data": [] }
GET /api/v1/safety

Check if a domain is flagged as unsafe by Google Safe Browsing, and whether it is indexed by Google.

Query Parameters
domain stringrequired
Domain name to check (e.g. google.com).
Request
curl "https://premium-api.domainkits.com/api/v1/safety?domain=google.com" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "data": { "domain": "google.com", "safe": { "is_safe": true, "threat_types": [], "matches_count": 0 }, "index": { "indexed": true, "index_count": 363000000 } } }
GET /api/v1/ip-lookup

Look up geolocation and network information for an IP address or domain. Domains are resolved server-side (scheme and www. prefixes are stripped). Fields with no data are null (numbers) or empty strings. IP geolocation data by MaxMind (GeoLite2).

Query Parameters
query stringrequired
IP address (IPv4 or IPv6) or domain name to look up.
Request
curl "https://premium-api.domainkits.com/api/v1/ip-lookup?query=8.8.8.8" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 1, "data": [ { "ip": "8.8.8.8", "type": "IPv4", "asn": 15169, "as_organization": "GOOGLE", "continent": "North America", "continent_code": "NA", "country": "United States", "country_code": "US", "is_eu": false, "region": "California", "region_code": "CA", "city": "Los Angeles", "postal": "90009", "latitude": 34.0544, "longitude": -118.2441, "timezone": "America/Los_Angeles" } ], "elapsed": "2ms" }
Request (domain)
curl "https://premium-api.domainkits.com/api/v1/ip-lookup?query=google.com" \ -H "Authorization: Bearer dk_xxx"
GET /api/v1/registrar

Search ICANN-accredited registrars by name substring (with alias support) or exact match by IANA ID. Results include accreditation status, RDAP URL, drop-catch platform detection, parent organization mapping, and RDAP contact details when available. total is the full hit count; page with limit / offset.

Query Parameters
query stringrequired
Registrar name or IANA ID to search for (e.g. godaddy or 146).
limit integer
Rows per page. Default 20.
offset integer
Rows to skip. Default 0.
Response Fields
is_drop_catch
Whether the registrar belongs to a drop-catch / backorder platform.
parent_id / parent_name
Parent organization when the registrar is part of a group. parent_id is an IANA ID or a platform label (not always numeric); empty when independent.
rdap_fetched
false means RDAP contact details (address / phone / email) could not be fetched for this row, not that none exist.
Request (by name)
curl "https://premium-api.domainkits.com/api/v1/registrar?query=godaddy" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 1, "limit": 20, "offset": 0, "data": [ { "id": "146", "name": "GoDaddy.com, LLC", "status": "Accredited", "rdap_url": "https://rdap.godaddy.com/v1/", "is_drop_catch": false, "parent_id": "", "parent_name": "", "country": "United States of America", "contact": "Legal Department +1 4805058800 legal@godaddy.com", "website": "http://www.godaddy.com", "address": "2155 E GoDaddy Way, Tempe, AZ 85284, US", "phone": "tel:480 505 8865", "email": "generalcounsel@godaddy.com", "rdap_fetched": true } ], "elapsed": "3ms" }
Request (by IANA ID)
curl "https://premium-api.domainkits.com/api/v1/registrar?query=146" \ -H "Authorization: Bearer dk_xxx"
GET /api/v1/status-guide

Look up EPP domain status codes. Search by status name, alias, or category (e.g. clientHold, pending, security). Each row is one status code; possible_reasons is always present and is an empty string when not applicable.

Query Parameters
query stringrequired
Status code, keyword, or category to search for.
Request
curl "https://premium-api.domainkits.com/api/v1/status-guide?query=clientHold" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 1, "data": [ { "status": "clientHold", "aliases": ["client hold", "clienthold"], "category": "Domain Not Working", "description": "Domain is on hold and will not resolve.", "action": "Contact your registrar immediately.", "severity": "critical", "possible_reasons": "Unpaid bills, suspected fraud..." } ], "elapsed": "1ms" }
Request (by category)
curl "https://premium-api.domainkits.com/api/v1/status-guide?query=security" \ -H "Authorization: Bearer dk_xxx"
GET /api/v1/typosquat

Generate lookalike domains for a domain and check which variants are registered. Thirteen classes: omission, transposition, keyboard-adjacent replacement, insertion, repetition, hyphenation, vowel-swap, homoglyph, plural/singular, exact-TLD, TLD-swap, combosquatting (brand + keyword), and IDN homograph (Cyrillic look-alikes, returned as ASCII punycode xn-- domains). Registered variants carry a latest_whois snapshot. Use for brand protection, phishing detection, and defensive registration planning. The input domain itself must be ASCII; subdomains are reduced to their registrable domain (www.example.co.uk becomes example.co.uk).

Query Parameters
domain stringrequired
Domain to scan (e.g. example.com). Must include a TLD.
types stringoptional
Restrict generation to these variant classes, comma-separated (e.g. omission,combosquatting). Omit for all 13. Any other value returns 400.
registered booleanoptional
Keep only registered (true, who is squatting) or only unregistered (false, still available to register defensively) variants. Omit for both. Only the literals true / false.
whois booleanoptional
Default true. Set to false to skip WHOIS lookups entirely, returning only registration status. Speeds up the response. Not applied to export downloads.
limit integeroptional
Maximum variants to return, 1-5000. Defaults to the entire generated set: this endpoint's result set is bounded by construction (a few thousand rows at most), so there is nothing to page through by default.
offset integeroptional
Pagination offset, 0-5000.
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns are domain, tld, type, registered, for_sale, expiring, tld_count (exports do not carry latest_whois). Returns 404 when no rows match.
Response Fields
total integer
Matches after the types and registered filters, independent of offset.
generated / registered_total integer
Counts before filters: how many variants exist and how many are already taken. Together they answer "N lookalikes, M are registered" without a second request.
data[].type string
Variant class: omission, transposition, replacement, insertion, repetition, hyphenation, vowel-swap, homoglyph, plural, exact-tld, tld-swap, combosquatting, idn-homograph.
data[].registered / for_sale / expiring mixed
Whether the variant is taken, its marketplace listing code (empty string when not listed), and whether it is in an expiring state.
data[].tld_count integer
How many TLDs this variant's name portion is registered under. 0 for names nobody has registered.
data[].latest_whois object
Most recent cached WHOIS snapshot for a registered variant, when available. Not a real-time lookup. Omitted when no snapshot exists.
Request (who is squatting)
curl "https://premium-api.domainkits.com/api/v1/typosquat?domain=example.com&registered=true" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "domain": "example.com", "total": 87, "generated": 449, "registered_total": 87, "limit": 5000, "offset": 0, "whois_note": "latest_whois reflects the most recent cached snapshot, not a real-time lookup", "data": [ { "domain": "exampl.com", "tld": "com", "type": "omission", "registered": true, "for_sale": "se", "expiring": false, "tld_count": 14, "latest_whois": { "created": "2019-03-12T00:00:00Z", "updated": "2025-07-16T00:00:00Z", "expires": "2026-03-12T00:00:00Z", "registrar_name": "Sav.com, LLC", "status": ["client transfer prohibited"], "nameservers": ["ns1.dan.com", "ns2.dan.com"] } } ] }
Request (still available, defensive registration)
curl "https://premium-api.domainkits.com/api/v1/typosquat?domain=example.com&registered=false&whois=false" \ -H "Authorization: Bearer dk_xxx"
Request (one class only, as a file)
curl "https://premium-api.domainkits.com/api/v1/typosquat?domain=example.com&types=combosquatting&export=csv" \ -H "Authorization: Bearer dk_xxx" -OJ
GET /api/v1/tld-check

Check the registration status of a domain prefix across monitored TLDs.

Query Parameters
prefix stringrequired
Domain prefix to check (e.g. abtdomain).
mode stringoptional
Response mode: count, check (default), or list.
tlds stringoptional
Comma-separated TLDs to check (only for mode=check). Default: com,net,org,io,ai,bot,dev,app,pro,online.
Request (check, default)
curl "https://premium-api.domainkits.com/api/v1/tld-check?prefix=abtdomain" \ -H "Authorization: Bearer dk_xxx"
Response (check)
{ "success": true, "data": { "com": "registered", "net": "available", "org": "available", "io": "available", "ai": "available" }, "total": 1, "prefix": "abtdomain" }
Request (count)
curl "https://premium-api.domainkits.com/api/v1/tld-check?prefix=abtdomain&mode=count" \ -H "Authorization: Bearer dk_xxx"
Response (count)
{ "success": true, "data": null, "total": 1, "prefix": "abtdomain" }
Request (list)
curl "https://premium-api.domainkits.com/api/v1/tld-check?prefix=google&mode=list" \ -H "Authorization: Bearer dk_xxx"
Response (list)
{ "success": true, "data": ["com", "net", "org", "io", ...], "total": 482, "prefix": "google" }
GET /api/v1/monitor/changes

Track status changes of high-value domains over the last 7 days: transfers, drops, renewals, and nameserver updates. Each row is one change event, so a domain that changed twice appears twice. All parameters are optional; without filters, returns the most recent events first. Unrecognized parameter names and values return 400.

Query Parameters
query stringoptional
Search keyword matched as a substring of the second-level label (min 2 characters, letters/digits/hyphens).
tld stringoptional
TLD filter, comma-separated, up to 10.
position stringoptional
Values: start, end, middle. Requires query; omit to match anywhere.
reason stringoptional
Filter by change reason. Values: new_registration, domain_transfer, domain_expired, nameserver_change.
length_min / length_max integeroptional
Second-level label length range, 1-63.
found_date_start / found_date_end dateoptional
Range for the date the change was observed, YYYY-MM-DD, inclusive. Data covers the last 7 days.
has_number / all_number / all_alpha / has_hyphen booleanoptional
Composition filters. Only the literals true / false. No filter is applied by default.
exclude_query stringoptional
Negative keywords, comma-separated.
sort stringoptional
found_date_desc (default, most recent change first) found_date_asc length_asc length_desc tld_count_asc tld_count_desc alpha alpha_desc.
limit integeroptional
Results per page (default: 40, max: 500).
offset integeroptional
Pagination offset, 0-200,000.
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Bypasses pagination. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns match this endpoint's JSON fields. Returns 404 when no rows match.
Response fields
domain, tld, found_date, reason, details_old / details_new (state before / after the change: registrar or nameservers), length, tld_count, components
Request
curl "https://premium-api.domainkits.com/api/v1/monitor/changes?query=premium&reason=nameserver_change&limit=3" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "total": 3, "limit": 3, "offset": 0, "data": [ { "domain": "challengepremium.com", "tld": "com", "found_date": "2026-06-26", "reason": "nameserver_change", "details_old": "NS59.DOMAINCONTROL.COM,NS60.DOMAINCONTROL.COM", "details_new": "", "length": 16, "tld_count": 1, "components": ["challenge", "premium"] } ] }
GET /api/v1/ct/subdomains

Discover subdomains observed in Certificate Transparency logs. Returns unique subdomain prefixes with the date each was last seen.

Query Parameters
domain stringrequired
Registered domain to query (e.g. example.com).
limit integeroptional
Max results (default: 1000, max: 10000). A larger value returns 400.
after stringoptional
Only include records logged on or after this date (YYYY-MM-DD).
before stringoptional
Only include records logged on or before this date (YYYY-MM-DD).
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Bypasses pagination and returns up to 10,000 rows in one pass. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns match this endpoint's JSON fields.
Request
curl "https://premium-api.domainkits.com/api/v1/ct/subdomains?domain=example.com&limit=5" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "data": [ { "d": "mail", "ls": "2026-07-20" }, { "d": "api", "ls": "2026-07-18" }, { "d": "cdn", "ls": "2026-06-01" } ], "total": 5 }
GET /api/v1/ct/certs

Look up certificate records by domain or SHA-256 fingerprint. Covers currently valid certificates.

Query Parameters
domain stringrequired*
Domain to query. Required unless fingerprint is provided.
fingerprint stringrequired*
SHA-256 certificate fingerprint (64 hex chars). Required unless domain is provided.
limit integeroptional
Max results (default: 100, max: 5000). A larger value returns 400.
issuer stringoptional
Filter by certificate issuer (e.g. R11, WE1).
cert_type stringoptional
Filter by certificate type: DV, OV, EV.
after stringoptional
Records logged on or after this date (YYYY-MM-DD).
before stringoptional
Records logged on or before this date (YYYY-MM-DD).
export stringoptional
Download results as a file instead of JSON. Values: csv, txt. Bypasses pagination and returns up to 5,000 rows in one pass. Billed against the Search Export quota, which carries a monthly cap. txt is one domain per line; csv columns match this endpoint's JSON fields.
Request
curl "https://premium-api.domainkits.com/api/v1/ct/certs?domain=example.com&limit=2" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "data": [ { "domain": "example.com", "log_time": "2026-07-20T16:18:16Z", "issue_time": "2026-07-20T16:08:14Z", "not_after": "2026-10-18T16:14:46Z", "issuer": "R11", "cert_type": "DV", "fingerprint": "73444a55...", "san_list": "*.example.com|example.com", "source": "google_argon2026h2", "reg_domain": "example.com" } ], "total": 2 }
GET /api/v1/nrds/download

Download newly registered domains data files. Returns a 302 redirect to a signed download URL valid for 5 minutes. Each file can be downloaded up to 10 times per day per API key.

Query Parameters
tld stringoptional
TLD to download. Defaults to all TLDs combined.
type stringoptional
File type. Defaults to domains_only.
  • domains_only (.txt.gz) domain names, one per line. e.g. abtdomain.com
  • basic_info (.csv.gz) domain, registration date, expiration date. e.g. abtdomain.com,2026-06-30,2027-06-30
  • full_whois (.csv.gz, Platinum only) domain, registration date, expiration date, registrar, status codes, nameservers. e.g. abtdomain.com,2026-06-30,2027-06-30,GoDaddy.com LLC,clientTransferProhibited,ns1.example.com|ns2.example.com
date stringoptional
Date in YYYY-MM-DD format. Defaults to today.
Request
# Use -L to follow the redirect, -J -O to save with server filename curl -L -J -O \ "https://premium-api.domainkits.com/api/v1/nrds/download?tld=com&type=domains_only" \ -H "Authorization: Bearer dk_xxx"
Response
HTTP/1.1 302 Found Location: https://download.domainkits.com/... # The redirect URL serves the .txt.gz file directly. # On rate limit (3 downloads/file/day): { "success": false, "error": "Daily download limit reached (3/3)." }
GET /api/v1/usage

View your current API key usage and per-endpoint counters.

Request
curl "https://premium-api.domainkits.com/api/v1/usage" \ -H "Authorization: Bearer dk_xxx"
Response
{ "success": true, "endpoints": { "search": { "minute": { "used": 5, "limit": 0 }, "daily": { "used": 42, "limit": 0 } }, ... } }
Rate Limits

Each endpoint has a per-minute and a daily request limit that vary by tier. A value of unlimited means no numeric cap applies. Daily quotas reset at 00:00 UTC; per-minute limits use a rolling 60-second window. Search Export additionally carries a monthly quota, which resets on the 1st (UTC). When a limit is exceeded, the API returns 429 Too Many Requests.

Endpoint Premium / min Premium / day Platinum / min Platinum / day Max results
Search602,000unlimitedunlimited50,000
NRDs Live20500unlimitedunlimitedP:200 / Plat:500
Search Export210
100 / month
10100
1,000 / month
50,000
RDAP WHOIS3050050unlimited
DNS60500unlimitedunlimited
Reverse NS20100unlimited5001,000
Domain Changes202,000unlimitedunlimited1,000
TLD Check20600unlimitedunlimited
Safety55010200
IP Lookup2020050unlimited
Registrar Check2020050unlimited
Status Guide30unlimitedunlimitedunlimited
TLD Trends30unlimitedunlimitedunlimited
Keyword Trends20unlimitedunlimitedunlimitedP:50 / Plat:100
CT Subdomains2020060unlimited10,000
CT Certs2020060unlimited5,000
CT Search1010030unlimited5,000
Typosquat Scan120unlimitedunlimited
NRDs Downloadunlimitedunlimitedunlimitedunlimited3 / file / day
Usage30unlimited30unlimited
Rate Limit Headers
# On every metered response. The Reset # value is the unix time the current # per-minute window rolls over. X-RateLimit-Limit: 20 X-RateLimit-Remaining: 17 X-RateLimit-Reset: 1719744000
429 Response
{ "success": false, "error": "Rate limit exceeded (20/min). Wait and retry." }