Skip to main content

Traitement batch CSV

Validez des milliers d'emails en une seule opération asynchrone.

Cas d'usage

  • Nettoyer une liste de contacts existante
  • Qualifier des leads importés depuis un CRM/ERP
  • Vérifier une liste d'abonnés newsletter
  • Préparer une campagne emailing pour maximiser la délivrabilité

Formats supportés

FormatExtensionNotes
CSV.csvSéparateur auto-détecté (,, ;, \t)
Texte.txtUn email par ligne
Excel.xlsxPremière colonne email détectée

Taille max : 10 Mo — ~200 000 emails par fichier

Workflow complet

1. Parse (optionnel)     → Aperçu du fichier, détection de la colonne email
2. Upload → Création du job asynchrone
3. Polling du statut → Suivi de la progression en temps réel
4. Export → CSV / XLSX / PDF

Étape 1 — Parser le fichier (optionnel)

curl -X POST https://api.yeswecheck.fr/v2/batch/parse \
-H "Authorization: Bearer VOTRE_JWT" \
-F "file=@liste_clients.csv"
{
"headers": ["id", "prenom", "nom", "email", "ville"],
"detectedEmailColumn": "email",
"rowCount": 15420,
"separator": ",",
"preview": [
{ "id": "1", "prenom": "Jean", "nom": "Dupont", "email": "[email protected]" },
{ "id": "2", "prenom": "Marie", "nom": "Martin", "email": "[email protected]" }
]
}

Étape 2 — Lancer le traitement

# Sans SMTP (gratuit, rapide)
curl -X POST https://api.yeswecheck.fr/v2/batch/upload \
-H "Authorization: Bearer VOTRE_JWT" \
-F "file=@liste_clients.csv" \
-F "smtp=false" \
-F "deduplicate=true" \
-F "label=Liste Q1 2026"
# Avec SMTP complet (multi-pass)
curl -X POST https://api.yeswecheck.fr/v2/batch/upload \
-H "Authorization: Bearer VOTRE_JWT" \
-F "file=@liste_clients.csv" \
-F "smtp=true" \
-F "smtpTimeout=8000" \
-F "pass2Enabled=true" \
-F "deduplicate=true" \
-F "label=Campagne emailing mars"
{
"jobId": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"totalEmails": 15420,
"fileName": "liste_clients.csv",
"label": "Liste Q1 2026",
"createdAt": "2026-02-25T10:00:00.000Z"
}

Étape 3 — Suivre la progression

Interrogez le statut toutes les 2-5 secondes :

curl https://api.yeswecheck.fr/v2/batch/550e8400-e29b-41d4-a716-446655440000/status \
-H "Authorization: Bearer VOTRE_JWT"

Phases de traitement (avec SMTP)

┌────────────────────────────────────────────────────────┐
│ Progression SMTP Batch │
├──────────┬───────────────┬───────────┬─────────────────┤
│ Phase │ Poids % │ Vitesse │ Description │
├──────────┼───────────────┼───────────┼─────────────────┤
│ Pass 0 │ 10% │ Rapide │ Syntaxe + DNS │
│ Pass 1 │ 70% │ Lent │ SMTP (1ère pass)│
│ Pass 2 * │ 20% │ Lent │ Retry Unknown │
└──────────┴───────────────┴───────────┴─────────────────┘
* Si pass2Enabled: true

Réponse de statut

{
"jobId": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"progress": {
"processed": 7210,
"total": 15420,
"valid": 5834,
"invalid": 1089,
"risky": 287,
"unknown": 0,
"percentage": 47
},
"currentPhase": "smtp_verification",
"estimatedTimeRemaining": "8m30s",
"smtp": {
"enabled": true,
"downgraded": false
},
"multiPass": {
"pass0Done": true,
"pass1Done": false,
"smtpEligibleCount": 12400,
"pass1Count": 5210
}
}

Polling avec JavaScript

async function waitForCompletion(jobId, jwt) {
while (true) {
const status = await fetch(
`https://api.yeswecheck.fr/v2/batch/${jobId}/status`,
{ headers: { 'Authorization': `Bearer ${jwt}` } }
).then(r => r.json());

console.log(`${status.progress.percentage}% — ${status.currentPhase}`);
console.log(`${status.progress.valid} | ❌ ${status.progress.invalid} | ⚠️ ${status.progress.risky}`);
console.log(`⏱️ Reste: ${status.estimatedTimeRemaining}`);

if (status.status === 'completed' || status.status === 'failed') {
return status;
}

// Attendre 3 secondes avant le prochain check
await new Promise(resolve => setTimeout(resolve, 3000));
}
}

const finalStatus = await waitForCompletion(jobId, jwt);
console.log('Terminé !', finalStatus.progress);

Étape 4 — Exporter les résultats

Préparer l'export (recommandé pour les grandes listes)

L'export est généré en arrière-plan et envoyé par email (lien valide 48h) :

curl -X POST https://api.yeswecheck.fr/v2/batch/JOB_ID/export/prepare \
-H "Authorization: Bearer VOTRE_JWT" \
-H "Content-Type: application/json" \
-d '{"format": "csv"}'
{
"exportId": "exp_abc123",
"message": "Un lien de téléchargement (valide 48h) sera envoyé par email dès que l'export est prêt."
}

Vérifier si l'export est prêt

curl "https://api.yeswecheck.fr/v2/batch/JOB_ID/export/status?format=csv" \
-H "Authorization: Bearer VOTRE_JWT"
{
"status": "ready",
"downloadUrl": "https://exports.yeswecheck.fr/abc123.csv?token=...",
"expiresAt": "2026-02-27T10:00:00.000Z"
}

Télécharger le rapport PDF

curl https://api.yeswecheck.fr/v2/batch/JOB_ID/download-pdf \
-H "Authorization: Bearer VOTRE_JWT" \
--output rapport-batch.pdf

Gestion des jobs

# Lister tous les jobs (avec filtres)
curl "https://api.yeswecheck.fr/v2/batch/jobs?status=completed&limit=20" \
-H "Authorization: Bearer VOTRE_JWT"

# Mettre en pause
curl -X POST https://api.yeswecheck.fr/v2/batch/JOB_ID/pause \
-H "Authorization: Bearer VOTRE_JWT"

# Reprendre
curl -X POST https://api.yeswecheck.fr/v2/batch/JOB_ID/resume \
-H "Authorization: Bearer VOTRE_JWT"

# Annuler
curl -X POST https://api.yeswecheck.fr/v2/batch/JOB_ID/cancel \
-H "Authorization: Bearer VOTRE_JWT"

# Supprimer (job terminé uniquement)
curl -X DELETE https://api.yeswecheck.fr/v2/batch/JOB_ID \
-H "Authorization: Bearer VOTRE_JWT"

Structure du CSV exporté

ColonneDescription
emailAdresse email originale
statusvalid, invalid, risky, unknown
scoreScore de 0 à 100
syntax_validtrue/false
has_mx_recordstrue/false
is_disposabletrue/false
is_role_accounttrue/false
smtp_deliverabletrue/false/null
smtp_response_code250, 550, etc.
typo_suggestionEmail corrigé suggéré

Bonnes pratiques batch

Performance SMTP

Pour les grandes listes avec SMTP, le traitement est groupé par serveur MX. Les serveurs stricts (Google, Microsoft) peuvent répondre lentement — prévoyez 1-4h pour 10 000 emails SMTP.

pass2Enabled

Le Pass 2 re-vérifie les emails unknown (timeout SMTP au Pass 1) avec un délai. Recommandé pour les campagnes critiques. Ajoute ~20% de temps de traitement.