Introduction
L'API CatchDoms vous donne un accès programmatique aux domaines expirés et aux enchères depuis 21 plateformes (Dynadot, GoDaddy, DropCatch, Catched, Gname, SnapNames, UK Backorder, Subreg, WebExpire, Park.io, BloomUp, SEO.Domains, NameShift, Nicsell, Gnews Domains, Backorders Domains, DomainLore, Rakko) plus 100k+ domaines ccTLD aged au prix d'enregistrement (plan Authority uniquement). Catalogue rafraîchi quotidiennement.
Toutes les réponses sont en JSON. L'URL de base pour tous les endpoints est :
Les données sont rafraîchies quotidiennement. Les enchères sont mises à jour plusieurs fois par jour.
Authentification
Toutes les requêtes API nécessitent un token Bearer dans le header Authorization.
Pour obtenir votre clé API :
- Inscrivez-vous ou connectez-vous sur catchdoms.com
- Allez sur la page Accès API
- Créez un nouveau token API
L'accès API nécessite un abonnement Pro (468 EUR/an).
Exemple de header de requête
Limites de requêtes
L'API est limitée à 15 requêtes par minute par token.
Les informations de limite sont incluses dans les headers de réponse :
| Header | Description |
|---|---|
X-RateLimit-Limit |
Votre limite par minute |
X-RateLimit-Remaining |
Requêtes restantes dans la fenêtre actuelle |
Si vous dépassez la limite, vous recevrez une réponse 429 Too Many Requests. Attendez 60 secondes avant de réessayer.
Utilisez per_page=100 pour récupérer plus de résultats par requête et réduire les appels API.
Endpoints
/api/domains
Lister les domaines
Retourne une liste paginée de domaines. Accepte des paramètres de filtre.
/api/domains/{id}
Obtenir un domaine
Retourne l'objet domaine complet par son identifiant numérique.
/api/user
Utilisateur authentifié
Retourne les informations de l'utilisateur authentifié.
Paramètres de requête
Tous les paramètres sont optionnels. Ajoutez-les au query string de GET /api/domains.
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
source |
string | — | Filtrer par plateforme sourcedynadot, catched, dropcatch, godaddy, gname, snapnames, ukdroplists, subreg, webexpire, parkio, bloomup, seodomains, nameshift, nicsell, gnews-domains, backorders-domains, domainlore, rakkodomain, namepros, regfree |
tld |
string | — | Filtrer par TLD, avec ou sans point. Séparés par des virgules pour plusieurs..com ou .fr,.de,.it |
score_min |
integer | — | Score qualité minimum (0-100). 50+ pour les bons domaines, 70+ pour les excellents. |
age_min |
integer | — | Âge minimum en années, basé sur la première capture Wayback |
type |
string | — | Filtrer par type de domaineauction, closeout |
has_bids |
boolean | — | Uniquement les domaines avec enchères actives |
has_backlinks |
boolean | — | Uniquement les domaines avec referring domains (valeur SEO) |
has_gmb |
boolean | — | Uniquement les domaines avec une fiche d'établissement Google |
da_min |
integer | — | Domain Authority minimum (0-100) |
rd_min |
integer | — | Nombre minimum de referring domains |
language |
string | — | Filtrer par code langue détectéEN, FR, DE, ES, etc. |
contains |
string | — | Sous-chaîne que le nom de domaine doit contenir. Terme unique ("entreprise") ou liste séparée par virgules avec sémantique OR ("entreprise, entrepreneur" matche les noms contenant l'un ou l'autre). Max 200 caractères. |
has_edu_gov |
boolean | — | Uniquement les domaines avec referring domains EDU ou GOV |
tf_min |
integer | — | Trust Flow minimum (0-100, Majestic/SEObserver) |
cf_min |
integer | — | Citation Flow minimum (0-100, Majestic/SEObserver) |
categories |
string | — | Catégories séparées par virgules : topics TTF ou catégories seo.domains, parent (health) ou parent/enfant (recreation/travel). Insensible à la casse. |
techs |
string | — | Labels de stack technique séparés par virgules (sensible à la casse). Sémantique OR : un domaine matche si son historical_tech contient AU MOINS UN des labels. Exemples : "WordPress" trouve tous les sites WordPress ; "Google Maps" trouve les sites avec un embed Google Maps ; "Stripe,Shopify" trouve les sites e-commerce. Utile pour l'acquisition par stack technique. Les utilisateurs Pro ne voient que les matches hors regfee ; les abonnés Authority obtiennent aussi les regfee. |
use_cases |
string | — | Slugs de cas d'usage séparés par virgules (minuscules). Sémantique OR : un domaine matche si son use_cases contient AU MOINS UN des slugs. Les buckets sont déduits du stack technique historique de chaque domaine. Utilise ce filtre pour cibler un type de site plutôt qu'une techno précise. Exemples : "ecommerce" trouve les domaines e-commerce expirés ; "ecommerce,saas" trouve l'un ou l'autre.ecommerce | local-biz | news | saas | forum | media | developer |
traffic_min |
integer | — | Trafic organique mondial estimé minimum (dernier mois suivi, source DataForSEO Labs). Chaque ligne renvoie historical_traffic_etv (dernier mois), historical_traffic_peak (pic sur 24 mois) et historical_traffic_spark (série graphique). Exemple : traffic_min=100 trouve les domaines avec au moins 100 visites par mois sur leur dernier mois suivi. |
include_historical_traffic |
boolean | false | Si true, inclut le JSON complet historical_traffic (répartition par pays + série mensuelle) sur chaque ligne. Désactivé par défaut pour des réponses légères. Quand activé, per_page est plafonné à 20. |
price_min |
number | — | Prix ou enchère minimum (USD) |
price_max |
number | — | Prix ou enchère maximum (USD) |
snapshots_min |
integer | — | Nombre minimum de captures Wayback Machine |
created_after |
date | — | Domaines ajoutés au catalogue à partir de cette date (ISO 8601 ou YYYY-MM-DD). Combinez avec votre dernier timestamp de sync pour ne récupérer que les nouveaux domaines.2026-06-15 ou 2026-06-15T08:00:00Z |
created_before |
date | — | Domaines ajoutés avant cette date (exclusif). À combiner avec created_after pour définir une fenêtre. |
ends_after |
date | — | Auctions dont la fin tombe à partir de cette date. |
ends_before |
date | — | Auctions dont la fin est avant cette date (exclusif). Combinez avec ends_after pour les enchères qui finissent aujourd'hui. |
per_page |
integer | 50 | Résultats par page (1-100) |
page |
integer | 1 | Numéro de page pour la pagination |
Champs de réponse
Chaque domaine dans le tableau data contient ces champs.
| Champ | Type | Nullable | Description |
|---|---|---|---|
| Identité | |||
id |
integer | No | Identifiant unique du domaine |
name |
string | No | Nom de domaine complet |
tld |
string | No | Extension avec le point (.com, .fr, etc.) |
source |
string | No | Plateforme source (dynadot, catched, dropcatch, godaddy, gname, snapnames, ukdroplists, subreg, webexpire, parkio, bloomup, seodomains, nameshift, nicsell, gnews-domains, backorders-domains, domainlore, rakkodomain, namepros, regfree — regfree requiert Authority) |
type |
string | No | Type de domaine (auction, closeout) |
auction_type |
string | Yes | Sous-type pour DropCatch (Dropped, PreRelease, PrivateSeller) ou GoDaddy (Bid, BuyNow) |
| Prix | |||
price |
float | Yes | Prix fixe pour les closeouts, ou prix de départ pour les enchères |
max_bid |
float | Yes | Enchère la plus haute pour les domaines aux enchères |
effective_price |
float | Yes | Le prix réel à payer : max_bid si défini, sinon price. Utilisez ce champ plutôt que de vérifier price et max_bid séparément. |
bids_count |
integer | Yes | Nombre d'enchères placées sur le domaine |
auction_end_date |
string (ISO 8601) | Yes | Fin de l'enchère (ISO 8601) |
| Scoring | |||
estibot_appraisal |
float | Yes | Estimation automatique de la valeur par le registrar |
score |
integer | Yes | Score qualité CatchDoms (0-100), combinant âge, autorité, backlinks, qualité du nom et TLD |
is_spammy |
boolean | No | Si le domaine a été détecté comme spam |
| Historique | |||
age |
integer | Yes | Âge du domaine en années (calculé depuis wayback_first_date) |
wayback_snapshots |
integer | Yes | Nombre total de captures Wayback Machine |
wayback_first_date |
string (YYYY-MM-DD) | Yes | Date de la première capture Wayback (YYYY-MM-DD) |
wayback_last_date |
string (YYYY-MM-DD) | Yes | Date de la dernière capture Wayback (YYYY-MM-DD) |
| Métriques SEO | |||
pagerank |
integer | Yes | Score Open PageRank (0-10) |
domain_authority |
integer | Yes | Domain Authority de DataForSEO (0-100) |
backlinks_count |
integer | Yes | Nombre total de backlinks |
referring_domains |
integer | Yes | Nombre de referring domains uniques |
trust_flow |
integer | Yes | Trust Flow de Majestic/SEObserver (0-100) |
citation_flow |
integer | Yes | Citation Flow de Majestic/SEObserver (0-100) |
ttf_topic |
string | Yes | Catégorie Topical Trust Flow (ex : "Business/Marketing") |
ref_domains_edu |
integer | Yes | Nombre de referring domains depuis des sites .edu |
ref_domains_gov |
integer | Yes | Nombre de referring domains depuis des sites .gov |
ref_domains_dofollow |
integer | Yes | Nombre de referring domains dofollow |
| SEO.Domains | |||
seo_domains_category |
string | Yes | Catégorie principale du marketplace seo.domains (source seodomains uniquement, ex : "Technology", "Finance") |
seo_domains_subcategory |
string | Yes | Catégorie secondaire du marketplace seo.domains (source seodomains uniquement) |
indexed_pages |
integer | Yes | Nombre de pages indexées sur Google (regfree : comptage exact via SERP ; seodomains : 1 si indexé, 0 sinon) |
| Stack technique historique | |||
historical_tech |
array<string> | Yes | Empreintes technologiques détectées sur le snapshot Wayback Machine archivé. Exemples : ["WordPress","Yoast SEO","Stripe","Cloudflare"]. Trois valeurs possibles : null (détection pas encore lancée), [] (détection lancée mais aucun signal — typiquement page parquée ou SPA JS-only), ou un tableau de labels. |
| Trafic | |||
monthly_visitors |
integer | Yes | Visiteurs mensuels estimés (Dynadot et seodomains) |
| Langue | |||
language |
string | Yes | Code langue détecté (EN, FR, DE, etc.), depuis le contenu archivé Wayback |
| Fiche d'établissement Google | |||
has_gmb |
boolean | No | Si une fiche d'établissement Google a été trouvée pour ce domaine |
gmb_name |
string | Yes | Nom de l'établissement sur la fiche d'établissement Google |
gmb_category |
string | Yes | Catégorie de l'établissement sur la fiche d'établissement Google |
gmb_address |
string | Yes | Adresse de l'établissement sur la fiche d'établissement Google |
| WHOIS / RDAP | |||
whois_registered_at |
string (ISO 8601) | Yes | Date de création actuelle auprès du registre (ISO 8601). Reflète le cycle de propriété en cours — une valeur récente sur un domaine ancien signale une suppression puis ré-enregistrement. |
whois_expires_at |
string (ISO 8601) | Yes | Date d'expiration du domaine (ISO 8601) |
whois_last_changed_at |
string (ISO 8601) | Yes | Dernière modification enregistrée au registre (ISO 8601). Récent = changement récent de propriétaire, DNS ou registrar. |
whois_registrar |
string | Yes | Registrar détenant le domaine (ex : "GoDaddy.com, LLC", "NameCheap, Inc.") |
whois_status |
array<string> | Yes | Tableau de codes statut EPP (ex : ["clientTransferProhibited", "serverHold"]) |
whois_nameservers |
array<string> | Yes | Tableau des nameservers actuels (ex : ["ns1.cloudflare.com", "ns2.cloudflare.com"]) |
whois_ns_category |
string | Yes | Classification dérivée des nameservers : for_sale | parked | drop_catcher | active | registrar_default. null si non classifiable. |
whois_checked_at |
string (ISO 8601) | Yes | Dernière récupération WHOIS. null = jamais enrichi ; présent avec champs null = TLD sans RDAP public. |
| Liens | |||
purchase_url |
string | Yes | Lien direct pour enchérir/acheter sur la plateforme source |
| Horodatages | |||
created_at |
string (ISO 8601) | No | Date d'ajout sur CatchDoms (ISO 8601) |
updated_at |
string (ISO 8601) | No | Dernière mise à jour (ISO 8601) |
effective_price — Le prix réel à payer : max_bid si défini, sinon price. Utilisez ce champ plutôt que de vérifier price et max_bid séparément.
API Inventaire Pending-Delete
Inventaire hebdomadaire des domaines sur le point de tomber sur 125+ ccTLDs et gTLDs, classifiés par statut WHOIS avec date de drop estimée. Rafraîchi chaque lundi (ccTLDs) et quotidiennement (gTLDs).
Abonnement Authority+ requis. Les autres tiers reçoivent un 403 avec une upgrade_url. Même authentification Bearer et mêmes limites que le reste de l'API.
/api/pending-delete
Liste les domaines pending-delete avec filtres et pagination. Enveloppe paginée standard (data / links / meta), comme /api/domains.
Par défaut (week_end=all), la vue combinée ne renvoie que les drops à venir, les plus proches d'abord ; les lignes dont la date de drop estimée est passée sont exclues. Ajoutez include_past=1 pour les inclure.
/api/pending-delete/{domain}
Recherche un domaine par son nom (insensible à la casse). Renvoie la ligne du snapshot le plus récent, ou 404 si le domaine n'est pas en état pending-delete actionnable.
Paramètres de requête
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
tld |
string | — | Liste de TLDs séparés par des virgules, avec ou sans point initial.tld=fr,de,com |
status |
string | — | Filtre statut WHOIS, séparés par des virgules. Valeurs autorisées :pendingDelete, redemptionPeriod, serverHold, clientHold, transition, quarantine |
source |
string | — | Source du pipeline : oi-diff = ccTLDs (hebdomadaire), czds-daily = gTLDs (fichiers de zone quotidiens).oi-diff | czds-daily |
week_end |
string | all | Semaine du snapshot (YYYY-MM-DD) ou 'all' (vue combinée sur les semaines conservées). Une semaine explicite inclut les lignes historiques quelle que soit la date de drop. |
drops_within |
integer | — | Uniquement les lignes dont la date de drop estimée est dans les N prochains jours (1-60). N'inclut jamais les dates passées. |
contains |
string | — | Recherche d'une sous-chaîne dans le nom de domaine. |
no_dashes |
boolean | false | Exclut les SLDs contenant des tirets. |
no_numbers |
boolean | false | Exclut les SLDs contenant des chiffres. |
include_past |
boolean | false | Avec week_end=all, renvoie aussi les lignes dont la date de drop estimée est passée (vue historique). |
sort |
string | drop_date | Ordre des résultats. drop_date = plus proche d'abord (lignes sans date calculable en dernier) ; drop_date_desc liste d'abord les lignes sans date, combinez avec drops_within pour ne garder que les lignes datées.drop_date | drop_date_desc | domain |
per_page |
integer | 50 | Résultats par page, 1-200. Note : cet endpoint utilise per_page, pas limit (limit est le paramètre de l'outil MCP). |
page |
integer | 1 | Numéro de page. |
Exemple
# Upcoming .fr drops, soonest first
curl "https://catchdoms.com/api/pending-delete?tld=fr&drops_within=7&per_page=50" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Note performance : la première requête d'une nouvelle combinaison de filtres calcule son total une fois (quelques secondes sur les périmètres très larges) ; les requêtes suivantes le servent depuis le cache et répondent en bien moins d'une seconde.
Pagination
Tous les endpoints de liste retournent des résultats paginés au format standard Laravel.
L'objet meta contient :
current_page | Numéro de page actuel |
last_page | Numéro de la dernière page |
per_page | Éléments par page |
total | Total de domaines correspondants |
from | Index du premier élément sur cette page |
to | Index du dernier élément sur cette page |
L'objet links contient :
first | URL de la première page |
last | URL de la dernière page |
prev | URL de la page précédente (null sur la première page) |
next | URL de la page suivante (null sur la dernière page) |
{
"data": [ ... ],
"links": {
"first": "https://catchdoms.com/api/domains?page=1",
"last": "https://catchdoms.com/api/domains?page=68",
"prev": null,
"next": "https://catchdoms.com/api/domains?page=2"
},
"meta": {
"current_page": 1,
"from": 1,
"last_page": 68,
"per_page": 50,
"to": 50,
"total": 3400
}
}
Exemples de code
Remplacez YOUR_API_KEY par votre token.
# List domains with score >= 50 and backlinks
curl "https://catchdoms.com/api/domains?score_min=50&has_backlinks=1&per_page=10" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
# Get a single domain by ID
curl "https://catchdoms.com/api/domains/12345" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
# Filter by TLD and language
curl "https://catchdoms.com/api/domains?tld=.fr&language=FR&age_min=10" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
# Filter by multiple TLDs
curl "https://catchdoms.com/api/domains?tld=.fr,.de,.it&score_min=50" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
# Filter by source platform (e.g. Rakko Japanese marketplace)
curl "https://catchdoms.com/api/domains?source=rakkodomain&tf_min=10" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://catchdoms.com/api';
// List domains with filters
const params = new URLSearchParams({
score_min: 50,
has_backlinks: 1,
per_page: 10
});
const response = await fetch(`${BASE_URL}/domains?${params}`, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Accept': 'application/json'
}
});
const { data, meta } = await response.json();
console.log(`Found ${meta.total} domains`);
// Get a single domain
const domain = await fetch(`${BASE_URL}/domains/12345`, {
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Accept': 'application/json'
}
}).then(r => r.json());
import requests
API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://catchdoms.com/api'
headers = {
'Authorization': f'Bearer {API_KEY}',
'Accept': 'application/json'
}
# List domains with filters
response = requests.get(f'{BASE_URL}/domains', headers=headers, params={
'score_min': 50,
'has_backlinks': 1,
'language': 'FR',
'per_page': 25
})
data = response.json()
print(f"Found {data['meta']['total']} domains")
for domain in data['data']:
print(f"{domain['name']} - Score: {domain['score']} - Price: {domain['effective_price']}")
# Get a single domain
domain = requests.get(f'{BASE_URL}/domains/12345', headers=headers).json()
Erreurs
L'API utilise les codes HTTP standards. Les réponses d'erreur incluent un corps JSON avec un champ message.
| Code | Signification | Description |
|---|---|---|
| 200 | Succès | Requête exécutée avec succès |
| 401 | Non autorisé | Token API manquant ou invalide |
| 403 | Interdit | Token valide mais pas d'abonnement Pro |
| 404 | Non trouvé | L'ID du domaine n'existe pas |
| 422 | Erreur de validation | Valeur de paramètre invalide (ex: score_min=abc) |
| 429 | Trop de requêtes | Limite dépassée. Attendez 60 secondes. |
Exemple de réponse d'erreur
// 401 Unauthorized
{
"message": "Unauthenticated."
}
// 429 Too Many Requests
{
"message": "Too Many Attempts."
}
Serveur MCP
CatchDoms inclut un serveur MCP (Model Context Protocol) pour les assistants IA comme Claude Code, Cursor et Windsurf.
Au lieu d'écrire des appels API, vous pouvez poser des questions en langage naturel :
Configuration
Ajoutez ceci à la config de votre client MCP :
Claude Code / Cursor
{
"mcpServers": {
"catchdoms": {
"type": "http",
"url": "https://catchdoms.com/mcp/catchdoms",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
Claude Desktop
{
"mcpServers": {
"catchdoms": {
"command": "npx",
"args": [
"mcp-remote",
"https://catchdoms.com/mcp/catchdoms",
"--header",
"Authorization: Bearer YOUR_API_KEY"
]
}
}
}
Claude Code : ~/.claude.json | Cursor : paramètres MCP Claude Desktop requires Node.js.
En savoir plus sur l'intégration MCPTroubleshooting
Getting HTML instead of JSON (Cloudflare captcha)
If your API calls return an HTML page with "Just a moment..." instead of JSON, your IP is being challenged by Cloudflare.
- Disable your VPN or switch to a different VPN node/server
- Try from a different IP address or network
- Make sure you include the
Accept: application/jsonheader
403 Subscription Required
API access requires an active Pro subscription.
- Check your subscription status at catchdoms.com/billing
- If you subscribed after creating your token, create a new token at catchdoms.com/api-access
401 Unauthenticated
Your token is missing or invalid.
- Make sure the header format is exactly:
Authorization: Bearer YOUR_TOKEN(with "Bearer " prefix and a space) - Copy the full token including the number and pipe character (e.g.
42|abc...) - Tokens are shown only once at creation. If lost, revoke and create a new one.
MCP Server disconnected
If Claude Desktop shows "Server disconnected" for the CatchDoms MCP server:
- Check that your token is still valid (create a new one if needed)
- Disable VPN — Cloudflare may block the connection
- Restart Claude Desktop completely (Cmd+Q on Mac, not just close the window)
- Verify your config file syntax in
claude_desktop_config.json
Still having issues? Contact us at [email protected] with your error message and we'll help you debug.