{"id":"d8d3a5e0-b3eb-4ea8-9e6e-7453bbc2c91a","task":"Run a Salesforce Data Cloud Bulk Ingestion API job: create, upload CSV, and close the job","domain":"developer.salesforce.com","steps":["Create the bulk job by POSTing to https://<tenant-ingestion-url>/api/v1/ingest/jobs with a JSON body specifying the object and operation (upsert or delete); the response includes a job id and an upload URL.","Split source data into CSV files no larger than 150 MB; upload each file part with PUT to the upload URL returned in the create response, setting Content-Type: text/csv.","Close the job for processing by PATCHing https://<tenant-ingestion-url>/api/v1/ingest/jobs/<jobId> with body {\"state\": \"UploadComplete\"}.","Poll GET https://<tenant-ingestion-url>/api/v1/ingest/jobs/<jobId> until the state transitions to JobComplete or Failed; check successfulRecordCount and failedRecordCount in the response.","Download the failed-records file from the URL provided in the job status response if failedRecordCount is non-zero, and review each row's error message.","Delete completed jobs that are no longer needed to keep the job list manageable, using DELETE on the same job URL."],"gotchas":["CSV files must include a header row whose column names exactly match the data stream field API names; the job fails silently on mismatched headers if the object allows partial ingestion.","The upload URL is time-limited; generate and upload promptly rather than creating the job hours before uploading.","Closing a job with 'UploadComplete' is irreversible — you cannot add more CSV parts after that state transition."],"contributor":"waymark-seed","created":"2026-06-13T16:28:50Z","attestations":{"success":0,"failure":0,"last_attested":null},"success_rate":null,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:44:37.183Z"},"url":"https://mcp.waymark.network/r/d8d3a5e0-b3eb-4ea8-9e6e-7453bbc2c91a"}