curl --request POST \
--url https://api.reply.io/v3/contact-accounts/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"name": "<string>",
"description": "<string>",
"domainName": "<string>",
"domainSecondary": "<string>",
"industry": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"timeZoneId": "<string>",
"linkedInUrl": "<string>",
"phone": "<string>",
"twitterUrl": "<string>",
"logoUrl": "<string>",
"email": "<string>",
"customFields": [
{
"id": 123,
"name": "<string>",
"value": "<string>"
}
]
}
]
}
'import requests
url = "https://api.reply.io/v3/contact-accounts/bulk"
payload = { "items": [
{
"name": "<string>",
"description": "<string>",
"domainName": "<string>",
"domainSecondary": "<string>",
"industry": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"timeZoneId": "<string>",
"linkedInUrl": "<string>",
"phone": "<string>",
"twitterUrl": "<string>",
"logoUrl": "<string>",
"email": "<string>",
"customFields": [
{
"id": 123,
"name": "<string>",
"value": "<string>"
}
]
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
name: '<string>',
description: '<string>',
domainName: '<string>',
domainSecondary: '<string>',
industry: '<string>',
country: '<string>',
state: '<string>',
city: '<string>',
timeZoneId: '<string>',
linkedInUrl: '<string>',
phone: '<string>',
twitterUrl: '<string>',
logoUrl: '<string>',
email: '<string>',
customFields: [{id: 123, name: '<string>', value: '<string>'}]
}
]
})
};
fetch('https://api.reply.io/v3/contact-accounts/bulk', 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.reply.io/v3/contact-accounts/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'name' => '<string>',
'description' => '<string>',
'domainName' => '<string>',
'domainSecondary' => '<string>',
'industry' => '<string>',
'country' => '<string>',
'state' => '<string>',
'city' => '<string>',
'timeZoneId' => '<string>',
'linkedInUrl' => '<string>',
'phone' => '<string>',
'twitterUrl' => '<string>',
'logoUrl' => '<string>',
'email' => '<string>',
'customFields' => [
[
'id' => 123,
'name' => '<string>',
'value' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/contact-accounts/bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.reply.io/v3/contact-accounts/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contact-accounts/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"id": 12345,
"error": null,
"errorDetails": null
},
{
"id": 12001,
"error": 3,
"errorDetails": "Account already exists (duplicate name)"
},
{
"id": 0,
"error": 3,
"errorDetails": "Account was not created"
}
]Bulk create accounts
contacts:write scope (or a broader one that includes it).
Create up to 100 accounts in one call. If any item fails validation the whole request is rejected before anything is created. A customFields entry that does not resolve or does not fit its field type fails only its own item; the other items are still created. The response is an array with one entry per submitted item, in the order you sent them, carrying either the id of the created account or an error with details. An item whose name matches an account you already have is reported as an error instead of creating a duplicate, and its id is the id of that existing account.
curl --request POST \
--url https://api.reply.io/v3/contact-accounts/bulk \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"name": "<string>",
"description": "<string>",
"domainName": "<string>",
"domainSecondary": "<string>",
"industry": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"timeZoneId": "<string>",
"linkedInUrl": "<string>",
"phone": "<string>",
"twitterUrl": "<string>",
"logoUrl": "<string>",
"email": "<string>",
"customFields": [
{
"id": 123,
"name": "<string>",
"value": "<string>"
}
]
}
]
}
'import requests
url = "https://api.reply.io/v3/contact-accounts/bulk"
payload = { "items": [
{
"name": "<string>",
"description": "<string>",
"domainName": "<string>",
"domainSecondary": "<string>",
"industry": "<string>",
"country": "<string>",
"state": "<string>",
"city": "<string>",
"timeZoneId": "<string>",
"linkedInUrl": "<string>",
"phone": "<string>",
"twitterUrl": "<string>",
"logoUrl": "<string>",
"email": "<string>",
"customFields": [
{
"id": 123,
"name": "<string>",
"value": "<string>"
}
]
}
] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
items: [
{
name: '<string>',
description: '<string>',
domainName: '<string>',
domainSecondary: '<string>',
industry: '<string>',
country: '<string>',
state: '<string>',
city: '<string>',
timeZoneId: '<string>',
linkedInUrl: '<string>',
phone: '<string>',
twitterUrl: '<string>',
logoUrl: '<string>',
email: '<string>',
customFields: [{id: 123, name: '<string>', value: '<string>'}]
}
]
})
};
fetch('https://api.reply.io/v3/contact-accounts/bulk', 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.reply.io/v3/contact-accounts/bulk",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'items' => [
[
'name' => '<string>',
'description' => '<string>',
'domainName' => '<string>',
'domainSecondary' => '<string>',
'industry' => '<string>',
'country' => '<string>',
'state' => '<string>',
'city' => '<string>',
'timeZoneId' => '<string>',
'linkedInUrl' => '<string>',
'phone' => '<string>',
'twitterUrl' => '<string>',
'logoUrl' => '<string>',
'email' => '<string>',
'customFields' => [
[
'id' => 123,
'name' => '<string>',
'value' => '<string>'
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.reply.io/v3/contact-accounts/bulk"
payload := strings.NewReader("{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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.reply.io/v3/contact-accounts/bulk")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.reply.io/v3/contact-accounts/bulk")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"items\": [\n {\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"domainName\": \"<string>\",\n \"domainSecondary\": \"<string>\",\n \"industry\": \"<string>\",\n \"country\": \"<string>\",\n \"state\": \"<string>\",\n \"city\": \"<string>\",\n \"timeZoneId\": \"<string>\",\n \"linkedInUrl\": \"<string>\",\n \"phone\": \"<string>\",\n \"twitterUrl\": \"<string>\",\n \"logoUrl\": \"<string>\",\n \"email\": \"<string>\",\n \"customFields\": [\n {\n \"id\": 123,\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body[
{
"id": 12345,
"error": null,
"errorDetails": null
},
{
"id": 12001,
"error": 3,
"errorDetails": "Account already exists (duplicate name)"
},
{
"id": 0,
"error": 3,
"errorDetails": "Account was not created"
}
]Authorizations
Authenticate every request with a Bearer token. Pass your Reply API key in the
Authorization header:
Authorization: Bearer <your-api-key>
Get your API key from the Reply dashboard: Settings → API Key.
Body
Request body for bulk creating accounts
List of contact accounts to create
Show child attributes
Show child attributes
Response
Array of creation results, one per input item.
Per-item error codes:
| error | Meaning |
|---|---|
| 3 | InvalidInput — the item was not created. For a duplicate name, id holds the existing account's id and errorDetails is Account already exists (duplicate name). For a customFields entry that does not resolve or does not fit its field type, errorDetails names the field |
| 6 | FeatureDisabled — the item carries customFields and account custom fields are not available for the team |