Bulk upsert contacts from CSV
Insert or update contacts from a CSV upload, up to the configured bulk import limit (default 1000). Rows are processed independently and reuse the same bulk upsert rules as the JSON endpoint. Source is always set to import.
POST
/
client
/
contacts
/
bulk
/
csv
Bulk upsert contacts from CSV
curl --request POST \
--url https://api.mailerpath.com/api/v1/client/contacts/bulk/csv \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form overwrite_blank_fields=true \
--form has_header=true \
--form 'delimiter=,' \
--form 'default_timezone=<string>'import requests
url = "https://api.mailerpath.com/api/v1/client/contacts/bulk/csv"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"overwrite_blank_fields": "true",
"has_header": "true",
"delimiter": ",",
"default_timezone": "<string>"
}
headers = {"Authorization": "<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('overwrite_blank_fields', 'true');
form.append('has_header', 'true');
form.append('delimiter', ',');
form.append('default_timezone', '<string>');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.mailerpath.com/api/v1/client/contacts/bulk/csv', 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://api.mailerpath.com/api/v1/client/contacts/bulk/csv",
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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$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://api.mailerpath.com/api/v1/client/contacts/bulk/csv"
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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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://api.mailerpath.com/api/v1/client/contacts/bulk/csv")
.header("Authorization", "<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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mailerpath.com/api/v1/client/contacts/bulk/csv")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}Authorizations
JWT Bearer token or raw API key via Authorization header
Body
multipart/form-data
CSV file
Apply blank-field overwrite mode to every row in this import
Whether the CSV includes a header row
Single-character CSV delimiter
Default IANA timezone (or common alias like PST, EST, SGT) used when row timezone is empty
⌘I
Bulk upsert contacts from CSV
curl --request POST \
--url https://api.mailerpath.com/api/v1/client/contacts/bulk/csv \
--header 'Authorization: <api-key>' \
--header 'Content-Type: multipart/form-data' \
--form file='@example-file' \
--form overwrite_blank_fields=true \
--form has_header=true \
--form 'delimiter=,' \
--form 'default_timezone=<string>'import requests
url = "https://api.mailerpath.com/api/v1/client/contacts/bulk/csv"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"overwrite_blank_fields": "true",
"has_header": "true",
"delimiter": ",",
"default_timezone": "<string>"
}
headers = {"Authorization": "<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('overwrite_blank_fields', 'true');
form.append('has_header', 'true');
form.append('delimiter', ',');
form.append('default_timezone', '<string>');
const options = {method: 'POST', headers: {Authorization: '<api-key>'}};
options.body = form;
fetch('https://api.mailerpath.com/api/v1/client/contacts/bulk/csv', 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://api.mailerpath.com/api/v1/client/contacts/bulk/csv",
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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: multipart/form-data"
],
]);
$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://api.mailerpath.com/api/v1/client/contacts/bulk/csv"
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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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://api.mailerpath.com/api/v1/client/contacts/bulk/csv")
.header("Authorization", "<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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mailerpath.com/api/v1/client/contacts/bulk/csv")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<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=\"overwrite_blank_fields\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"has_header\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delimiter\"\r\n\r\n,\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"default_timezone\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}{
"data": {},
"errors": [
{
"condition": "format",
"error": "Invalid email format",
"key": "email"
}
],
"message": "Operation successful",
"meta": {},
"success": true
}
