Skip to content
SimpleCold

API docs

Endpoints

Upload an email list

On this page

Uploads a CSV file and starts a bulk verification job in the background. Save the job id from the response; every later call needs it.

POST/api/v1/api-validation/bulk

Request

Send multipart/form-data with one file field.

FieldTypeRequiredDescription
filefileYesA CSV file up to 50 MB, with content type text/csv.

The job is named after the file, without the extension: q3-webinar-leads.csv becomes q3-webinar-leads in the dashboard.

CSV format

  • The first row must be a header row.
  • One column must be named email, e-mail, email address, emailaddress, emails or mail (case and surrounding spaces are ignored).
  • Commas, semicolons and tabs all work as delimiters.
  • Rows with an empty email cell are skipped, and duplicate addresses are removed.
  • Any other columns are kept and come back in the result file.
q3-webinar-leads.csv
name,email,company
Jane Doe,[email protected],Acme Corp
Sam Lee,[email protected],Tech Inc

A file without a header row is read as if its first address were the header, and fails with Email column not found in the file.

Examples

curl "https://simplecold.com/api/v1/api-validation/bulk" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "[email protected];type=text/csv"

;type=text/csv sets the content type of the file part. The endpoint only accepts text/csv, and some curl builds guess a different type from the extension, so set it explicitly.

Don't set a Content-Type header yourself when sending FormData. A hand-written header without the boundary breaks the upload.

Response · 200
{
  "code": "SUCCESS",
  "message": "Successfully performed operation.",
  "payload": {
    "id": "b0f6c2a4-6a3e-4c55-9d1e-2f8a7c1b9e40",
    "name": "q3-webinar-leads",
    "totalEmails": 4812,
    "totalValidEmails": 0,
    "totalCreditsUsed": 4812,
    "status": "IN PROGRESS",
    "createdAt": "2026-07-30T09:14:02.511Z",
    "updatedAt": "2026-07-30T09:14:02.511Z"
  },
  "requestId": "1d9f..."
}

The payload is the new job record, so it can also contain bookkeeping fields such as orgId, userId and apiKeyId.

Response fields

FieldTypeDescription
idstringThe job ID. Use it for status and download.
namestringThe file name without its extension.
totalEmailsnumberUnique addresses in the file, after empty rows and duplicates are removed.
totalValidEmailsnumberAddresses with the reason code mailbox_found. 0 at upload; filled in when the job completes.
totalCreditsUsednumberCredits reserved for the job (one per unique address).
statusstringIN PROGRESS for API uploads. See job statuses.
createdAt, updatedAtstringISO 8601 timestamps.

Errors

HTTPMessageCause
400File is requiredNo file field in the multipart body.
400Invalid file type. Only text/csv are allowed.The file part's content type isn't text/csv.
400File too largeThe file is over 50 MB. Split it.
400Email column not found in the file.No header matches an accepted email column name.
400No email addresses found in the file.The email column is empty.
400Insufficient credits. / Please buy credits.Your balance can't cover the file. No job is created.
401Invalid API key and othersSee authentication errors.
429Rate limit exceeded. Maximum 10 uploads per minute per API key.Over 10 uploads per minute with this API key. Wait Retry-After seconds.

Error bodies use { "code": "FAILURE", "message": "...", "data": null }. The 429 body has code: "RATE_LIMITED", details in data, plus status and error (see Rate limits).

Next

Poll the job status until it is COMPLETED, then download the results.

Upload an email list | SimpleCold API docs