curl --request POST \
--url https://base.sanitizeemail.com/v1/api/filesupload/ \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-KEY: <api-key>' \
--form file='@example-file' \
--form 'name=Customer List' \
--form is_file_organised=true \
--form file_tag=clean \
--form email_column=email_addressimport requests
url = "https://base.sanitizeemail.com/v1/api/filesupload/"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Customer List",
"is_file_organised": "true",
"file_tag": "clean",
"email_column": "email_address"
}
headers = {"X-API-KEY": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('name', 'Customer List');
form.append('is_file_organised', 'true');
form.append('file_tag', 'clean');
form.append('email_column', 'email_address');
const options = {method: 'POST', headers: {'X-API-KEY': '<api-key>'}};
options.body = form;
fetch('https://base.sanitizeemail.com/v1/api/filesupload/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://base.sanitizeemail.com/v1/api/filesupload/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://base.sanitizeemail.com/v1/api/filesupload/"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://base.sanitizeemail.com/v1/api/filesupload/")
.header("X-API-KEY", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://base.sanitizeemail.com/v1/api/filesupload/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"is_first_time": true,
"available_columns": [
"<string>"
],
"sample_first_3_rows": [
{}
]
}{
"id": 123,
"name": "<string>",
"file": "<string>",
"status": "pending",
"file_tag": "clean",
"file_name": "<string>",
"file_size": "<string>",
"stats": {
"total_processed": 123,
"total_emails": 123,
"unique_emails": 123,
"duplicate_emails": 123,
"dropped_emails": 123,
"email_columns_used": [
"<string>"
],
"email_domains": {}
},
"clean_emails_available": true,
"workspace": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}Upload CSV or XLSX
Upload CSV or XLSX files for bulk email validation with automatic email column detection
curl --request POST \
--url https://base.sanitizeemail.com/v1/api/filesupload/ \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-KEY: <api-key>' \
--form file='@example-file' \
--form 'name=Customer List' \
--form is_file_organised=true \
--form file_tag=clean \
--form email_column=email_addressimport requests
url = "https://base.sanitizeemail.com/v1/api/filesupload/"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Customer List",
"is_file_organised": "true",
"file_tag": "clean",
"email_column": "email_address"
}
headers = {"X-API-KEY": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('name', 'Customer List');
form.append('is_file_organised', 'true');
form.append('file_tag', 'clean');
form.append('email_column', 'email_address');
const options = {method: 'POST', headers: {'X-API-KEY': '<api-key>'}};
options.body = form;
fetch('https://base.sanitizeemail.com/v1/api/filesupload/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://base.sanitizeemail.com/v1/api/filesupload/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-KEY: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://base.sanitizeemail.com/v1/api/filesupload/"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://base.sanitizeemail.com/v1/api/filesupload/")
.header("X-API-KEY", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://base.sanitizeemail.com/v1/api/filesupload/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nCustomer List\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_file_organised\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_tag\"\r\n\r\nclean\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email_column\"\r\n\r\nemail_address\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"error": "<string>",
"is_first_time": true,
"available_columns": [
"<string>"
],
"sample_first_3_rows": [
{}
]
}{
"id": 123,
"name": "<string>",
"file": "<string>",
"status": "pending",
"file_tag": "clean",
"file_name": "<string>",
"file_size": "<string>",
"stats": {
"total_processed": 123,
"total_emails": 123,
"unique_emails": 123,
"duplicate_emails": 123,
"dropped_emails": 123,
"email_columns_used": [
"<string>"
],
"email_domains": {}
},
"clean_emails_available": true,
"workspace": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}{
"error": 123,
"message": "<string>"
}How it Works
Upload File
Column Detection
is_file_organised is true, the API automatically detects email columnsColumn Selection (if needed)
Processing
email_column to start validationImportant Notes
email_column parameter, even
on the first upload. It’s particularly useful when you know the exact column
name containing email addresses.available_columns,
resubmit the same file with the chosen email_column to proceed with
processing.is_file_organised=false for files without headers
or with inconsistent structure. The API will attempt to detect emails from the
raw data.Authorizations
API key for authentication
Body
File upload with form data
The CSV or XLSX file to upload for email validation
Display name for the uploaded file
"Customer List"
Whether the file has a structured format with column headers. Set to true for files with headers, false for unorganized data.
true
Tag to categorize the file processing type. 'clean' removes invalid emails, 'validate' checks email validity, 'analyze' provides detailed email insights.
clean, validate, analyze "clean"
Name of the column containing email addresses. Optional on first upload, but required if the API returns column suggestions.
"email_address"
Response
File uploaded but requires email column selection