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 :

https://catchdoms.com/api

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 :

  1. Inscrivez-vous ou connectez-vous sur catchdoms.com
  2. Allez sur la page Accès API
  3. Créez un nouveau token API

L'accès API nécessite un abonnement Pro (468 EUR/an).

Exemple de header de requête

Authorization: Bearer YOUR_API_KEY

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

GET /api/domains

Lister les domaines

Retourne une liste paginée de domaines. Accepte des paramètres de filtre.

GET /api/domains/{id}

Obtenir un domaine

Retourne l'objet domaine complet par son identifiant numérique.

GET /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 source
dynadot, 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 domaine
auction, 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.

GET /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.

GET /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_pageNuméro de page actuel
last_pageNuméro de la dernière page
per_pageÉléments par page
totalTotal de domaines correspondants
fromIndex du premier élément sur cette page
toIndex du dernier élément sur cette page

L'objet links contient :

firstURL de la première page
lastURL de la dernière page
prevURL de la page précédente (null sur la première page)
nextURL 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 :

"Trouve des domaines .fr de plus de 10 ans avec backlinks"
"Montre-moi les enchères GoDaddy avec score > 70"

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 MCP

Troubleshooting

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/json header

403 Subscription Required

API access requires an active Pro subscription.

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.