Quand il s'agit de charger des millions d'enregistrements dans Salesforce ou Data Cloud, l'API REST classique et même l'Ingestion API montrent vite leurs limites. Bulk API 2.0 est conçue précisément pour ce cas d'usage : elle traite les opérations en asynchrone, gère automatiquement le batching interne et optimise le débit sans que le client ait à découper manuellement les fichiers. Voici comment l'utiliser correctement en environnement de production.
L'API REST (ou SOAP) traite les enregistrements en synchrone, avec une limite pratique autour de 200 records par appel pour rester performant. Au-delà de quelques dizaines de milliers de lignes, les temps de traitement, le nombre d'appels HTTP et le risque de timeout deviennent ingérables. Bulk API 2.0 répond à ce problème avec une approche différente :
Contrairement à Bulk API 1.0, la version 2.0 supprime la nécessité de gérer soi-même le découpage en batches — c'est la principale simplification opérationnelle.
Un chargement via Bulk API 2.0 suit toujours la même séquence d'appels REST :
POST /services/data/v60.0/jobs/ingest avec l'objet cible, l'opération (insert, update, upsert, delete) et le format CSV.PUT /services/data/v60.0/jobs/ingest/{jobId}/batches avec le contenu CSV en corps de requête (content-type text/csv).PATCH avec "state": "UploadComplete" pour signaler que tous les batches ont été envoyés et déclencher le traitement.GET /jobs/ingest/{jobId} jusqu'à obtenir JobComplete ou Failed.successfulResults) et échoués (failedResults).POST /services/data/v60.0/jobs/ingest
{
"object": "Contact",
"operation": "upsert",
"externalIdFieldName": "External_Id__c",
"contentType": "CSV",
"lineEnding": "LF"
}
Le choix de l'opération conditionne directement les performances et la sécurité du chargement :
Toujours indexer le champ External ID utilisé pour l'upsert (case "External ID" cochée sur le champ). Sans index, les performances d'upsert se dégradent fortement au-delà de quelques centaines de milliers de lignes.
Bulk API 2.0 gère l'ordonnancement interne des batches, mais plusieurs leviers restent sous votre contrôle :
Un job Bulk peut se terminer avec le statut JobComplete même si une partie des lignes a échoué : la réussite du job ne garantit pas la réussite de chaque enregistrement. Il faut systématiquement :
failedResults, qui contient une colonne sf__Error décrivant la cause (validation rule, duplicate rule, type mismatch...).jobId et les métriques (nombre traité, réussi, échoué) pour audit et alerting.Pour de l'ingestion Data Cloud spécifiquement, Bulk API 2.0 s'utilise aussi côté Ingestion API sous forme de "bulk ingestion jobs", suivant le même cycle de vie, ce qui permet de charger des DLO volumineux sans saturer les endpoints synchrones. C'est l'option à privilégier pour toute reprise d'historique (data migration) avant de basculer en flux incrémental via CDC ou streaming.
Notre équipe DevToSpace accompagne vos projets d'ingestion de données vers Data Cloud et Marketing Cloud Next.
Parler à un expert