Public API Karma.Domains provides programmatic access to domain reports: auctions, expired, backorder, and buy-now. All responses are JSON over HTTPS. Base URL: https://api.karma.domains, route prefix: /v1.
Karma.Domains is a domain intelligence platform for investors, SEO teams, and automation pipelines:
- 400,000+ new domains daily in discovery and monitoring flows (7,000,000+ domains in total)
- 30+ domain data sources overall, including 27+ auction/expired/backorder/buy-now sources (GoDaddy, NameJet, DropCatch, Dynadot, GNAME, Namecheap, etc.)
- 90+ filters for precise search across domain quality, SEO, content history, and auction signals (TF, CF, DA, DR, Age, Backlinks, Traffic, Keywords, Anchor Text, etc.)
- TLD and ccTLD coverage (for example
.com,.net,.org,.biz,.info,.at,.be,.ca,.cc,.cl,.co,.co.nz) - SEO and authority data from major vendors: Ahrefs, Majestic, Moz, SimilarWeb
- Historical content and change signals via Wayback Machine
Request and response schemas (filter fields, report structure, sort enums) — in the interactive docs: Swagger UI or ReDoc.
This page is an integration overview: authentication, limits, endpoint list, typical workflows, and examples.
- Introduction
- Authentication
- Rate limiting
- Daily row quota
- Endpoint overview
- Model parameters reference
- Typical workflows
- Caching
- Request examples (curl)
- Integration use cases
- MCP and Public API
- FAQ
- Where is the full filter field reference?
- What is the difference between
availableandis_expired? - Why 403 with a correct key?
- Why does the API response not match the UI or a just-done action?
- What
sort_byvalues are allowed? - Do I need this page if OpenAPI exists?
- Can I export the entire database via the API?
- Is there a sandbox?
- Error codes
- Useful links
Introduction
The Public API is for scripts, internal dashboards, CRM systems, and any automation that needs the same data as the Karma.Domains web app.
- Format: JSON
- API version: 1.0.0
- Databases:
auctions,expired,backorder,buynow; search across all at once —POST /v1/reports/search(same as the “all databases” table in the UI) - Field documentation: only in OpenAPI
- Available only on the Pro plan and above
Authentication
Every request must include the header:
Authorization: Bearer YOUR_API_KEY
How to get an API key
- Pro plan (without Pro, the API is unavailable).
- Profile → Settings — create or reset the key in the API key section.
The same key is used for the MCP server (AI assistants). The request limit is shared between REST and MCP.
Typical responses when the key is wrong
| Code | Reason |
|---|---|
| 401 | Missing header, invalid key, or typo in Bearer |
| 403 | Key is valid, but the account has no active Pro (Pro plan required for API access) |
Always send Accept: application/json.
Rate limiting
- 60 requests per minute per API key
- Window: 60 seconds
- Counter is shared across all Public API endpoints and MCP
Successful responses include headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Limit (60) |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
When the limit is exceeded: 429 Too Many Requests and Retry-After header (seconds until retry).
Tips: use page_size up to 50 for lists; do not poll POST /search more often than needed — responses are cached (see “Caching”).
Daily row quota
- 50,000 list rows per day per account (API key / signed-in user)
- Reset: UTC midnight
- Counter is shared across Public API list endpoints, MCP list tools, web UI tables, and CSV export
Each list request charges page_size rows (the requested page size, not total_count).
Successful list responses include headers:
| Header | Description |
|---|---|
X-Quota-Limit | Daily limit (50000) |
X-Quota-Remaining | Rows left today |
X-Quota-Reset | Unix timestamp when the daily quota resets |
When the quota is exceeded: 429 Too Many Requests and Retry-After (seconds until reset).
Pagination depth: for a single search/filter, page × page_size must not exceed 5000 (e.g. with page_size=50, max page is 100). This limits deep scraping of one result set; the daily quota caps total volume across all queries.
Endpoint overview
Full query/body parameters — in OpenAPI.
| Method | Path | Purpose |
|---|---|---|
POST | /v1/reports/search | Search reports by ReportListFilterSchema body, pagination, sorting |
GET | /v1/reports/favorites | Current user’s favorite reports list |
POST | /v1/reports/favorites | Add a report to favorites |
DELETE | /v1/reports/favorites/{report_type}/{report_id} | Remove from favorites |
GET | /v1/reports/by-domain/{domain} | Find report IDs by exact domain name |
GET | /v1/reports/{report_type}/{report_id} | Full report by database type and report id |
GET | /v1/reports/check/expired/{report_id} | Check whether the domain has dropped for an expired report |
GET | /v1/user | User profile (PublicUserProfileSchema) |
GET | /v1/domains/checker/expiry/{domain} | Live check: whether the domain is available to register |
GET | /v1/domains/checker/karma_metric/{domain} | Live Karma Metric calculation via WayBack Machine |
Model parameters reference
Below is a practical parameter-level map for the 3 core OpenAPI models that define most API capabilities.
ReportListFilterSchema (request body for POST /v1/reports/search)
Value semantics used across this schema:
nullor omitted field = no filter.- String query fields support
,for AND and|for OR where documented. - Date ranges are arrays of 2 strings:
[from, to]. - Most score ranges use inclusive
*_min/*_max.
| Parameter | Type | Description |
|---|---|---|
domain | string | null | Domain substring filter, case-insensitive. , = AND (all terms must match), | = OR (any term). Max length: 350. |
tlds | string | null | TLD list separated by comma or space (e.g., .com .net .org). Max length: 350. |
domain_type | string[] | null | Allowed values: auctions, backorder, buynow, expired. OR logic between selected values. |
favorites | boolean | null | true = only favorites, false = exclude favorites. Requires authenticated user context. |
categories | string[] | null | OR logic by category, supports Category / Subcategory format, case-insensitive substring matching. |
languages | string | Language query with , (AND) / | (OR), case-insensitive substring matching. Max length: 350. |
keywords | string | null | Search in Wayback content (title, description, h1-h6, etc.). , = AND, | = OR. Max length: 350. |
website_ids | string[] | IDs like GA/Metrika to find same-owner domains. |
domain_length_min / domain_length_max | integer | null | Domain length bounds (documented as 1..30). |
domain_numbers / domain_hyphens | boolean | Require/exclude digits and hyphens in domain names. |
report_added_time | string[2] | null | Date range: ["YYYY-MM-DD","YYYY-MM-DD"]. Backend applies start/end day boundaries automatically. |
karmascore_min / karmascore_max | integer | null | KarmaScore bounds, 0..100. |
karmametric_min / karmametric_max | integer | null | Karma Metric bounds, 0..100. |
brandscore_min / brandscore_max | integer | null | Brandscore bounds, 0..100. |
openpagerank_min / openpagerank_max | integer | null | Open PageRank bounds, documented as 0..10. |
ahrefs_dr_min / ahrefs_dr_max | number | null | Ahrefs DR bounds, 0..100. |
ahrefs_ur_min / ahrefs_ur_max | number | null | Ahrefs UR bounds, 0..100. |
ahrefs_ar_min / ahrefs_ar_max | integer | null | Ahrefs Rank bounds (>= 0). |
majestic_tf_min / majestic_tf_max | integer | null | Majestic TF bounds, 0..100. |
majestic_cf_min / majestic_cf_max | integer | null | Majestic CF bounds, 0..100. |
majestic_bl_min / majestic_bl_max | integer | Majestic backlinks bounds. |
majestic_rd_min / majestic_rd_max | integer | Majestic referring domains bounds. |
majestic_topics / majestic_lang | string[] / string | Topic and anchor-language filters. |
moz_da_min / moz_da_max | integer | null | Moz DA bounds, 0..100. |
moz_ss_min / moz_ss_max | integer | null | Moz Spam Score bounds, 0..100. |
moz_bl_min / moz_bl_max | integer | Moz backlinks bounds. |
moz_rd_min / moz_rd_max | integer | Moz referring domains bounds. |
moz_bl_url / moz_bl_anchor | string | Moz backlink URL / anchor phrase filters. |
sw_visits_min / sw_visits_max | integer | SimilarWeb visits bounds. |
sw_last_traffic_date | string[2] | null | SimilarWeb month range: ["YYYY-MM","YYYY-MM"]. |
sw_country_filters | object[] | Country share filters (country, optional share_min). |
sw_ts_direct_min...sw_ts_social_max | number | null | SimilarWeb traffic-source channel share bounds, 0..100. |
wa_age_min / wa_age_max | integer | null | Wayback domain age in years. |
wa_first_snap / wa_last_snap | string[2] | null | Date range: ["YYYY-MM-DD","YYYY-MM-DD"] for first/last snapshot windows. |
wa_changes_min/max, wa_redirects_min/max, wa_parkings_min/max | integer | Wayback history counters. |
wa_hieroglyphs, wa_redirects, wa_error403 | boolean | Wayback content quality flags. |
wa_lang_filters | object[] | Wayback language filters (language, optional ratio_min). |
wa_server_code, wa_server_code_ratio_min/max | integer | null / number | null | Wayback server code filter (e.g., 200, 301, 302, 403, 404) + ratio bounds 0..100. |
ke_etv_min/max, ke_total_min/max | integer | Keywords Everywhere traffic value / keywords bounds. |
ke_keyword | string | Keywords Everywhere phrase filter. |
google_has_index, google_has_mentions | boolean | null | true/false/unset semantics for requiring index or mentions in Google SERP. |
google_title_index/mentions, google_description_index/mentions | string | SERP snippet title/description phrase filters. |
trustpilot_rating_min/max, trustpilot_reviews_count_min/max | number | null / integer | null | Trustpilot rating bounds (0..5) and reviews count bounds. |
trustpilot_category | string | Trustpilot category phrase filter. |
auction_source | string[] | null | Auction source names (case-insensitive) or compound value `source |
auction_end_time, auction_added_time | string[2] | null | Date range: ["YYYY-MM-DD","YYYY-MM-DD"]. |
auction_price_min/max | number | Auction price bounds. |
auction_bids_min/max | integer | Auction bids count bounds. |
combine_seo | object | null | Cross-vendor CombineSEOFilter: authority/backlinks/refdomains/traffic/keywords/backlink-url/anchors, with vendor-scoped OR logic in each row and AND between rows. |
ReportListResponseSchema (response for POST /search and GET /favorites)
| Parameter | Type | Description |
|---|---|---|
report_list | ReportItem[] | Paginated rows for table view and shortlist generation. |
total_count | integer | Total number of matched records for current filter. |
report_list[] row-level fields (from ReportItem) include:
| Parameter | Type | Description |
|---|---|---|
report_id | string | Stable report identifier (used for full report and favorites). |
report_type | string | One of auctions, expired, backorder, buynow. |
domain, domain_tld | string | Domain name and TLD. |
added_at, updated_at | integer | Timestamps. |
processed, demo, is_expired | boolean | State flags used in UI/API workflows. |
karmascore, karmametric, brandscore | integer | Core quality/brandability metrics. |
ahrefs_dr, ahrefs_ur | number | Ahrefs summary metrics. |
majestic_tf/cf/bl/rd, moz_da/ss/bl/rd | integer | Majestic and Moz summary metrics. |
ke_etv, ke_total | integer | Keywords Everywhere summary values. |
sw_last_traffic, sw_country_share, sw_sources | integer/object | SimilarWeb traffic summaries. |
wa_age, wa_last_snap, wa_changes, wa_langs, wa_server_code | integer/array | Wayback summary signals. |
google_index, trustpilot_rating, trustpilot_reviews_count | boolean/number/integer | Google/Trustpilot summary fields. |
auctions | array/object | Auction entries summary if available. |
ReportFullResponseSchema (response for GET /v1/reports/{report_type}/{report_id})
| Parameter | Type | Description |
|---|---|---|
report_id, report_type, domain, domain_tld | string | Core identity fields. |
domain_length, domain_numbers, domain_hyphens | integer/boolean | Domain structure attributes. |
favorite, demo, processed, is_expired | boolean | Report state and user-related flags. |
added_at, updated_at, created_at, checked_at, expire_checked_at | integer | Lifecycle timestamps. |
providers_status | object | Per-provider processing status map (string values). |
web_archive | object | Wayback Machine data — see breakdown below. |
metrics | DomainMetrics | Nested SEO/traffic/reputation metrics — see breakdown below. |
auctions | object | null | Auction lots grouped by end_time — see breakdown below. |
metrics → DomainMetrics
Most provider blocks can be an object with data, false (not loaded), or null. categories and blacklists can also be [] when empty.
| Parameter | Type | Description |
|---|---|---|
openpagerank | number | integer | boolean | null | Open PageRank score (typically 0..10) when available. |
categories | CategoryData[] | boolean | null | Content categories from classification providers. |
blacklists | BlacklistsData[] | boolean | null | Security/reputation blacklist hits. |
ahrefs | AhrefsData | boolean | null | Ahrefs domain metrics. |
majestic | MajesticData | boolean | null | Majestic Trust/Citation Flow and backlink profile. |
moz | MozData | boolean | null | Moz authority, spam score, and backlink details. |
keywordseverywhere | KeywordseverywhereData | boolean | null | Keywords Everywhere traffic/keyword estimates. |
similarweb | SimilarWebData | boolean | null | SimilarWeb visits, sources, and geo share. |
brandscore | BrandscoreData | boolean | null | Brandability score components. |
karma_metric | KarmaMetricData | boolean | null | Karma Metric score from Wayback history. |
trustpilot | TrustpilotData | boolean | null | Trustpilot rating and review stats. |
google | GoogleData | boolean | null | Google index and mention SERP snippets. |
ai_summary | string | null | AI-generated domain summary text. |
AhrefsData
| Parameter | Type | Description |
|---|---|---|
domain_rating | number | null | Ahrefs DR. |
url_rating | number | integer | null | Ahrefs UR. |
ahrefs_rank | integer | null | Ahrefs Rank (lower = stronger). |
MajesticData
| Parameter | Type | Description |
|---|---|---|
tf, cf | integer | null | Trust Flow / Citation Flow (0..100). |
backlinks, refdomains | integer | null | Backlinks and referring domains counts. |
primary_topic | string | null | Main topical category. |
topics | array | null | Topic distribution list. |
anchor_lang | array | null | Anchor text language distribution. |
indexed_urls, referring_ips, referring_subnets | integer | null | Index and network diversity counters. |
MozData
| Parameter | Type | Description |
|---|---|---|
moz_domain_authority | integer | null | Moz DA. |
moz_spam_score | integer | null | Moz Spam Score. |
page_rank, moz_link_propensity | number | integer | null | Legacy rank and link propensity. |
moz_*_to_subdomain fields | integer | null | Moz link graph counters (pages/domains, follow/nofollow/redirect/deleted). |
moz_da_history_values | string | null | Serialized DA history values. |
backlinks | MozBacklink[] | null | Backlink rows (domain_source, url_source, domain_target, url_target, anchor_text, harmonic_centrality, last_found_date). |
KeywordseverywhereData
| Parameter | Type | Description |
|---|---|---|
etv | integer | null | Estimated traffic value. |
total_keywords | integer | null | Total tracked keywords. |
data | KeywordItem[] | null | Keyword rows (position, etv, keyword). |
SimilarWebData
| Parameter | Type | Description |
|---|---|---|
estimated_monthly_visits | object | null | Month → visits map. |
traffic_sources | TrafficSources | null | Channel shares: Social, Paid Referrals, Mail, Referrals, Search, Direct (0..1 ratios). |
top_country_shares | CountryShare[] | null | Geo distribution (Country, CountryCode, Value). |
engagments | Engagements | null | BounceRate, PagePerVisit, Visits, TimeOnSite, Month, Year. |
category | string | null | SimilarWeb site category. |
BrandscoreData
| Parameter | Type | Description |
|---|---|---|
pronounceability, memorability, uniqueness, appeal, brandscore | integer | Brandability components and final score. |
KarmaMetricData
| Parameter | Type | Description |
|---|---|---|
karma_metric | integer | Final score, 0..100. |
components | KarmaMetricComponents | A_mass, A_cont, A_stab, A_trend (each 0..100). |
period | string | null | Period in YYYY-MM format (or null when unavailable). |
TrustpilotData
| Parameter | Type | Description |
|---|---|---|
rating | number | null | Rating, typically 0..5. |
reviews_count | integer | null | Number of reviews. |
category | string | null | Trustpilot business category. |
GoogleData
| Parameter | Type | Description |
|---|---|---|
google_index | GoogleItem[] | null | Indexed pages for site:domain (rank, url, title, description). |
google_mentions | GoogleItem[] | null | Mention results for quoted domain searches. |
CategoryData / BlacklistsData
| Model | Key fields |
|---|---|
CategoryData | categories[], vendor, info_url |
BlacklistsData | vendor, info_url, optional info |
web_archive (Wayback Machine payload)
Object with three main blocks: info, ts_summary, history. In full-report responses, history is returned newest-first.
| Parameter | Type | Description |
|---|---|---|
info | object | null | Archive coverage summary for the domain. |
ts_summary | object | null | Aggregated KarmaScore / Wayback signals used in table filters. |
history | array | Snapshot timeline (one object per Wayback capture). |
web_archive.info
| Parameter | Type | Description |
|---|---|---|
snap_counter | integer | Total number of Wayback snapshots counted. |
years_counter | integer | Number of years with archive activity (domain age signal). |
first_ts | integer | Unix timestamp of first snapshot. |
last_ts | integer | Unix timestamp of latest snapshot. |
years | object | Year → monthly snapshot-count map (sparkline/calendar data). |
web_archive.ts_summary
| Parameter | Type | Description |
|---|---|---|
average_karma_score | integer | Average KarmaScore, 0..100 (maps to list field karmascore). |
wa_changes | integer | Number of significant content changes in scanned history. |
wa_langs | array | Language distribution rows: language, pageRatio (0..100). |
wa_server_code | array | HTTP code distribution: server_code (e.g. 200, 301, 403), response_ratio (0..100). |
wa_tags | array | Detected content tags over history. |
pattern_shares | array | Pattern share rows: factor, description, share. |
chart_data | array | Time series points: timestamp, karma_score, lang, server_code, tags, detected_patterns. |
web_archive.history[] (snapshot row)
| Parameter | Type | Description |
|---|---|---|
snaped_at | integer | Snapshot Unix timestamp. |
webarchive_link | string | null | Wayback URL for this capture (null on closing placeholder snap). |
headers | object | null | HTTP metadata, commonly status_code (200, 301, 302, 403, 404, 429, …), original_url. |
screenshot | boolean | null | true if screenshot exists (binary stored separately; fetch via screenshot API in UI). |
content_info | object | null | Parsed page content (see below). |
karma_score | object | null | Per-snapshot score: score (0..100), detected_patterns, tags (porno/crypto/gambling/… flags). |
redirects | array | null | Redirect chain data when present. |
website_ids | array | null | Detected site IDs (name, website, ids[]) e.g. analytics tags. |
built_with | object | null | Technology stack detection payload (when available). |
web_archive.history[].content_info
| Parameter | Type | Description |
|---|---|---|
lang | string | null | Detected page language code. |
title, description, keywords | string | null | Meta / page text fields used in filters and UI. |
generator, author, copyright | string | null | Additional meta fields. |
h1 … h6 | string[] | null | Heading texts (searchable via keywords filter). |
cloud_words | array | null | Word cloud entries (word). |
external_links, internal_links | array | null | Outbound/inbound link lists. |
rel_canonical, meta_robots | string | null | Canonical URL and robots meta. |
length_symbols, length_words | integer | Content size counters. |
auctions (auction lots)
Present when the report has auction data (auctions, and sometimes related rows in other bases).
In full report responses, lots are grouped by end time:
{
"1764441900": [
{ "source": "godaddy", "sale_type": "auction", "price": 120, "bids": 3, "...": "..." }
]
}
- Object key =
end_time(Unix seconds). - Value = array of lot objects ending at that time (multiple platforms can share one key).
| Parameter | Type | Description |
|---|---|---|
source | string | Auction platform/registrar source (e.g. godaddy, namejet, dynadot, dropcatch, sedo, sav.com). Case-insensitive in filters. |
sale_type | string | Listing type (e.g. auction, buynow, Closeout, Pre-Release, Dropped). |
domain | string | Domain name for the lot. |
item_id | string | Platform-specific lot/listing id. |
end_time | integer | Lot end time (Unix seconds); also used as grouping key in full report. |
price | number | Current price (typically USD). |
bids | integer | null | Bid count when applicable. |
currency | string | Currency symbol/code (default "$"). |
report_type | string | Owning base: auctions, backorder, or buynow. |
priority | integer | Internal sort/priority weight (default 0). |
Filter tip: auction_source in search accepts plain source (godaddy) or compound value source|sale_type (e.g. godaddy|auction).
For exact field constraints (nullable rules, enum values, min/max, nested objects), always use OpenAPI or ReDoc.
report_type parameter
For full report and favorites: auctions, expired, backorder, buynow.
Value all is only used in search logic (all databases), not as {report_type} in the path.
Pagination and sorting (list endpoints)
Query parameters:
| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
page_size | 10 | Page size (max 50) |
sort_by | added_at | Sort column name (as in the UI table; enum in OpenAPI) |
sort_desc | true | true — descending |
Depth limit: page × page_size ≤ 5000. Requests beyond this return 422 validation error.
Domains in URLs
For {domain} in the path, use percent-encoding (IDN, Cyrillic, etc.). The server normalizes the name (punycoded/lowercase).
Typical workflows
1. Search → full report
POST https://api.karma.domains/v1/reports/searchwith a filter body (see OpenAPI →ReportListFilterSchema).- From
report_list[], takereport_idandreport_type. GET https://api.karma.domains/v1/reports/{report_type}/{report_id}.
Filters match filters in the web UI — easy to compare with the UI; see OpenAPI for the field schema.
2. Exact domain without a long search
GET /v1/reports/by-domain/example.com- In the response,
matches[]— up to one entry per database where the domain exists. - Pick the needed
report_type→GET /v1/reports/{report_type}/{report_id}.
If matches is empty — the domain is not in Karma databases.
3. Favorites
- List only:
GET /v1/reports/favorites - Same list via search:
POST /v1/reports/searchwith"favorites": truein the body - Add:
POST /v1/reports/favoriteswith{"report_id": "...", "report_type": "expired"} - Remove:
DELETE /v1/reports/favorites/expired/{report_id}
4. Drop check (expired report)
GET /v1/reports/check/expired/{report_id} — report id, not domain name.
- On successful check, updates the report record on the server
is_expired: true— domain is likely available to register (not “WHOIS expiry date passed”)- Repeat live check for the same report — at most once every 3 hours (business rule)
- HTTP response is cached 1 hour for repeated GET with the same
report_id(see “Caching”)
5. Domain check without a report in the database
GET /v1/domains/checker/expiry/{domain} — live WHOIS/DNS; does not change the database report.
available: true— likely registerableavailable: false— taken or reserved- Repeat request for the same domain within ~1 hour may return a cached response
6. Karma Metric on the fly
GET /v1/domains/checker/karma_metric/{domain} — Karma Metric from WayBack Machine; does not update the report. Response fields — OpenAPI (KarmaMetricData). Response cache per domain — ~1 hour.
Read more about Karma Metric in the blog
7. Balance and plan
GET /v1/user — email, balance (credits), plan flags, subscription data. API key is not in the response. Response cached ~1 minute per key — do not poll more often than needed for an up-to-date balance.
Caching
At the Public API level, the HTTP response body is cached. Some endpoints use early refresh (background refresh before TTL expires: 4 min for 5 min TTL, 50 min for 1 h TTL).
| Endpoint | TTL |
|---|---|
POST /v1/reports/search | 5 min |
GET /v1/reports/favorites | 5 min |
POST /v1/reports/favorites | none |
DELETE /v1/reports/favorites/{report_type}/{report_id} | none |
GET /v1/reports/by-domain/{domain} | 5 min |
GET /v1/reports/check/expired/{report_id} | 1 h |
GET /v1/reports/{report_type}/{report_id} | none |
GET /v1/user | 1 min |
GET /v1/domains/checker/expiry/{domain} | 1 h |
GET /v1/domains/checker/karma_metric/{domain} | 1 h |
POST/DELETE favorites change server data immediately, but a repeat GET /favorites or POST /search with favorites: true may return a stale list until cache expires (5 min).
Request examples (curl)
Replace YOUR_API_KEY with your profile key. Base URL: https://api.karma.domains.
Search expired with a filter
curl -X POST "https://api.karma.domains/v1/reports/search?page=1&page_size=25&sort_by=added_at&sort_desc=true" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"karmascore_min": 60,
"domain_type": ["expired"]
}'
Filter body — any fields from ReportListFilterSchema in OpenAPI.
Full report
curl "https://api.karma.domains/v1/reports/expired/507f1f77bcf86cd799439011" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Lookup by domain
curl "https://api.karma.domains/v1/reports/by-domain/example.com" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Add to favorites
curl -X POST "https://api.karma.domains/v1/reports/favorites" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"report_id": "507f1f77bcf86cd799439011",
"report_type": "expired"
}'
Domain availability check
curl "https://api.karma.domains/v1/domains/checker/expiry/mybrand.com" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Karma Metric
curl "https://api.karma.domains/v1/domains/checker/karma_metric/mybrand.com" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Integration use cases
Nightly expired selection pipeline
Daily cron: POST /search with a saved JSON filter (like a saved filter in the UI), pagination with page_size=50, export report_id to your DB. Detailed analysis — GET full report only for the shortlist.
Monitoring a name list before registration
Queue of domains → GET /domains/checker/expiry/{domain} → branch on available. Does not require a report in Karma.Domains.
Syncing favorites with internal CRM
Periodic GET /favorites; on user action in CRM — POST/DELETE favorites. Account for ~5 min list cache.
BI / funnel analytics
Export search pages, aggregate total_count and metrics from report_list without opening the UI. List row schema — ReportListResponseSchema in OpenAPI.
MCP + scripts on one key
Team uses MCP in Cursor for ad-hoc search and Public API for stable ETL. Total 60 requests per minute — plan batches and backoff on 429.
MCP and Public API
| Public API (REST) | MCP | |
|---|---|---|
| Audience | Developers, scripts, ETL | AI assistants (Cursor, Claude) |
| Interface | HTTP + JSON | Dialog, tools |
| Docs | This page + OpenAPI | /en/expired-domains-mcp/ |
| Data | Same reports and databases | Same |
| Key & limit | Shared | Shared |
For new code integrations, start with REST. For chat experiments — MCP.
FAQ
Where is the full filter field reference?
OpenAPI, schema ReportListFilterSchema. Field meanings match filter help in the UI.
What is the difference between available and is_expired?
Both in API context mean: domain is likely available to register.
available — live check by name (/domains/checker/expiry).
is_expired — check tied to an expired-database report (/reports/check/expired/{report_id}).
Why 403 with a correct key?
No active Pro plan. Check subscription in profile.
Why does the API response not match the UI or a just-done action?
Public API HTTP cache — see the table in “Caching”. Account for TTL when syncing with the UI.
What sort_by values are allowed?
Enum list in OpenAPI — names of report table columns in the web app.
Do I need this page if OpenAPI exists?
OpenAPI is the source of truth for types and fields. This page adds context: limits, cache, call order, use cases, and pitfalls not in the schema.
Can I export the entire database via the API?
No. A single search is limited to 5000 rows of pagination depth, and your account can retrieve at most 50,000 list rows per day (UTC) across API, MCP, and UI. Use filters to narrow results; fetch full reports one domain at a time via GET /reports/{report_type}/{report_id}.
Is there a sandbox?
No separate sandbox; use a Pro account and respect rate limits. For debugging, GET /user and a narrow POST /search with a strict filter work well.
Error codes
| Code | Meaning |
|---|---|
| 200 | Success |
| 401 | Unauthorized (key) |
| 403 | No Pro |
| 404 | Report or resource not found |
| 422 | Body/query validation error (invalid filter, sort_by, …) |
| 429 | Rate limit or daily row quota exceeded |
| 503 | Rate limiter or row quota service temporarily unavailable |
Error body usually has detail (string or validation object array). Example:
{
"detail": "Invalid API key"
}
Useful links
- OpenAPI (Swagger): https://api.karma.domains/docs
- ReDoc: https://api.karma.domains/redoc
- MCP for AI
- API key: Profile → Settings
- UI filter help