Chaque outil disponible est un endpoint JSON sous https://api.ferrlens.com. Envoyez un POST
avec un corps JSON, recevez du JSON. Pas d'authentification : les requêtes anonymes partagent un
budget par IP, voir Limites de débit.
curl -X POST https://api.ferrlens.com/v1/dns/lookup \
-H 'content-type: application/json' \
-d '{"domain":"example.com"}'
Erreurs
Une requête en échec renvoie un statut non 2xx et un corps avec un code stable :
{ "code": "INVALID_STRATEGY", "message": "strategy must be 'mobile' or 'desktop'" }
Raisonnez sur code, pas sur message. Un 429 porte RATE_LIMITED et un en-tête
Retry-After.
Les URL soumises doivent être publiques. Les adresses qui résolvent vers des plages privées ou internes sont refusées.
DNS
| Endpoint | Requête | Réponse |
|---|---|---|
POST /v1/dns/lookup |
domain |
domain, records (kind, records[]), total |
POST /v1/dns/propagation |
domain, kind (A par défaut) |
domain, kind, distinct_answers, hits[] |
POST /v1/dns/reverse |
ip |
ip, hostnames[] |
kind pour la propagation vaut A, AAAA, MX, TXT, NS, CNAME ou SOA. Chaque entrée
de hits correspond à un résolveur public : resolver, resolver_label, resolver_ip,
timings_ms, records, error. Quand distinct_answers n'a qu'une entrée, tous les
résolveurs sont d'accord.
| Endpoint | Requête | Réponse |
|---|---|---|
POST /v1/email/spf-dmarc |
domain |
spf, dmarc, dkim_selectors[], score, notes[] |
POST /v1/email/blacklist |
target (domaine ou IP) |
target, resolved_ip, checked, listed, errored, entries[] |
POST /v1/email/verify |
email |
syntax_valid, local_part, domain, disposable, role_based, mx[], has_mx |
SEO et web
| Endpoint | Requête | Réponse |
|---|---|---|
POST /v1/seo/check |
url, strategy (mobile par défaut, ou desktop) |
url, fetched_at, scores, core_web_vitals, notes[], findings[] |
POST /v1/seo/check/stream |
identique | server-sent events |
POST /v1/seo/robots |
domain, user_agent, test_path |
url, status, raw, groups[], sitemaps[], matched_agent, test_result |
POST /v1/seo/sitemap |
url |
url, status, is_index, url_count, sample[], children[], warnings[] |
POST /v1/web/meta |
url |
url, final_url, title, entries[], counts |
POST /v1/web/og-preview |
url |
url, final_url, card, warnings[] |
POST /v1/web/mixed-content |
url |
url, final_url, is_https, mixed[], total |
POST /v1/web/cors |
url, origin, method (GET par défaut) |
preflight, actual, checks[] |
POST /v1/web/ct-search |
domain |
domain, total, unique_sans, certificates[] |
POST /v1/http/headers |
url |
url, final_url, status, headers, timings_ms, redirects[] |
POST /v1/http/sec-headers |
url |
url, final_url, status, total_score, grade, checks[] |
scores contient performance, seo, accessibility et best_practices, chacun un nombre ou
null. Les résultats SEO sont mis en cache 24 heures par URL et par stratégie.
La variante stream envoie d'abord accepted, puis vitals, scores et notes au fil de leur
disponibilité, et se termine par done ou error. Un résultat en cache arrive en un seul
événement cached suivi de done.
Vérification de liens
POST /v1/link-check parcourt un site depuis url et rapporte le statut de chaque lien trouvé.
| Champ | Défaut | Limites |
|---|---|---|
url |
requis | |
max_depth |
2 |
borné entre 1 et 3 |
max_pages |
200 |
borné entre 10 et 500 |
Le parcours respecte robots.txt, patiente entre les requêtes et s'arrête après 60 secondes. La
réponse liste les pages parcourues et un summary avec total, broken, redirects, ok,
external, blocked_by_robots, blocked et unreachable.
Partages
POST /v1/shares, GET /v1/shares/{id} et DELETE /v1/shares/{id} sont décrits dans
Liens de partage.