FAQ — Questions Techniques
Interprétation des résultats
Que signifie responseCode: 550 dans les résultats SMTP ?
Le code 550 (ou 551, 552, 553) indique que le serveur SMTP a explicitement rejeté l'adresse :
550 5.1.1— Utilisateur inconnu550 5.7.1— Message refusé (politique)
Ces emails sont définitivement invalid. Ne les retentez pas.
Mon email a hasMxRecords: false mais il existe. Pourquoi ?
Cela peut arriver si :
- Le domaine utilise uniquement un enregistrement A/AAAA pour recevoir des emails (rare mais valide)
- La résolution DNS a échoué temporairement (timeout)
- Le domaine utilise un enregistrement MX privé ou non-standard
Qu'est-ce que le score et comment est-il calculé ?
Le score (0-100) est une combinaison pondérée de tous les checks :
| Signal | Poids | Impact |
|---|---|---|
| Syntaxe invalide | Éliminatoire | → 0 |
| Pas de MX | Éliminatoire | → 0 |
| SMTP rejeté | Éliminatoire | → 0 |
| Email jetable | Élevé | -40 points |
| Role account | Modéré | -15 points |
| Random local | Modéré | -20 points |
| SMTP valide | Bonus | +15 points |
Intégration et performance
Comment réduire la latence de l'API ?
- Désactivez le SMTP si non nécessaire — gain de 1-15s
- Mettez en cache les résultats (voir pattern ci-dessous)
- Utilisez le batch pour les volumes > 50 emails
Pattern de cache recommandé
import NodeCache from 'node-cache';
const emailCache = new NodeCache({
stdTTL: 24 * 3600, // 24h pour les valides
checkperiod: 3600,
});
async function validateWithCache(email: string): Promise<ValidationResult> {
const cached = emailCache.get<ValidationResult>(email);
if (cached) return cached;
const result = await callYesWeCheckApi(email);
// Ne cache que les résultats définitifs
if (result.status === 'valid' || result.status === 'invalid') {
emailCache.set(email, result);
}
return result;
}
Puis-je faire des appels en parallèle ?
Oui, mais respectez les rate limits. Pour 100 emails, faites des batches de 5-10 requêtes simultanées :
const emails = ['[email protected]', '[email protected]', /* ... */];
// Traiter 5 emails en parallèle
const results = await Promise.all(
emails.slice(0, 5).map(email => validateEmail(email))
);
// Pour de gros volumes, utilisez plutôt le batch endpoint
Au-delà de 50 emails, utilisez toujours POST /v2/batch/upload.
C'est plus rapide, plus fiable et optimisé pour le traitement SMTP groupé par MX.
Sécurité
Les emails envoyés à l'API sont-ils stockés ?
Les emails sont temporairement loggués pour le débogage et les statistiques d'usage. Les logs sont anonymisés après 7 jours.
Voir notre Politique de confidentialité pour les détails complets.
L'API est-elle compatible RGPD ?
Oui. YesWeCheck :
- Stocke les données dans des serveurs EU
- Propose l'export et la suppression de compte depuis le Dashboard
- Anonymise les logs après 7 jours
Puis-je valider des emails de test ?
Pour tester sans risque, utilisez des domaines inexistants ou des adresses avec smtp: false :
# Sans SMTP — gratuit, aucun effet de bord
curl -X POST .../v2/email/validate \
-d '{"email": "[email protected]", "smtp": false}'
Erreurs spécifiques
ACTIVE_JOB_EXISTS — Comment résoudre ?
Une seule validation batch peut tourner à la fois par organisation. Vérifiez d'abord :
curl https://api.yeswecheck.fr/v2/batch/active-job \
-H "Authorization: Bearer JWT"
Si un job est bloqué (status processing depuis longtemps), annulez-le :
curl -X POST https://api.yeswecheck.fr/v2/batch/JOB_ID/cancel \
-H "Authorization: Bearer JWT"
Mon token JWT expire trop vite
Le JWT expire après 15 minutes. Implémentez un mécanisme de refresh automatique :
class AuthClient {
private accessToken: string;
private refreshToken: string;
async request(url: string, options: RequestInit) {
const response = await fetch(url, {
...options,
headers: {
...options.headers,
'Authorization': `Bearer ${this.accessToken}`,
},
});
if (response.status === 401) {
// Token expiré — rafraîchir
await this.refresh();
// Réessayer
return this.request(url, options);
}
return response;
}
private async refresh() {
const { accessToken, refreshToken } = await fetch(
'https://api.yeswecheck.fr/v2/auth/refresh',
{
method: 'POST',
body: JSON.stringify({ refreshToken: this.refreshToken }),
}
).then(r => r.json());
this.accessToken = accessToken;
this.refreshToken = refreshToken;
}
}