People
Batch upsert people
Upsert up to 1000 people in one request. Idempotent and safely retryable. Attributes merge by default; pass mode:‘replace’ to swap each person’s whole set.
POST
/
api
/
v1
/
cdp
/
people
/
batch
Batch upsert people
curl --request POST \
--url https://www.useboom.ai/api/v1/cdp/people/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"externalId": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phoneNumber": "<string>",
"attributes": {}
}
],
"mode": "merge"
}
'import requests
url = "https://www.useboom.ai/api/v1/cdp/people/batch"
payload = {
"items": [
{
"externalId": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phoneNumber": "<string>",
"attributes": {}
}
],
"mode": "merge"
}
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: [
{
externalId: '<string>',
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phoneNumber: '<string>',
attributes: {}
}
],
mode: 'merge'
})
};
fetch('https://www.useboom.ai/api/v1/cdp/people/batch', 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://www.useboom.ai/api/v1/cdp/people/batch",
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' => [
[
'externalId' => '<string>',
'firstName' => '<string>',
'lastName' => '<string>',
'email' => '<string>',
'phoneNumber' => '<string>',
'attributes' => [
]
]
],
'mode' => 'merge'
]),
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://www.useboom.ai/api/v1/cdp/people/batch"
payload := strings.NewReader("{\n \"items\": [\n {\n \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\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://www.useboom.ai/api/v1/cdp/people/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.useboom.ai/api/v1/cdp/people/batch")
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 \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\n}"
response = http.request(request)
puts response.read_body{
"summary": {
"total": 0,
"created": 0,
"updated": 0,
"failed": 0
},
"errors": [
{
"index": 0,
"error": {
"code": "<string>",
"message": "<string>"
},
"externalId": "<string>"
}
]
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Organization API key, sent as Authorization: Bearer boom_org_....
Body
application/json
People to upsert.
Required array length:
1 - 1000 elementsShow child attributes
Show child attributes
How attributes and the profile fields are applied. 'merge' (default) overlays the attributes you send onto the stored ones: omitted keys are kept, a key sent as null is removed, and an omitted or null profile field (firstName, lastName, email, phoneNumber) keeps its stored value. 'replace' swaps the whole attribute set (any key you leave out is DELETED) and writes every profile field as sent, so an omitted one is cleared.
Available options:
merge, replace Was this page helpful?
⌘I
Batch upsert people
curl --request POST \
--url https://www.useboom.ai/api/v1/cdp/people/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"items": [
{
"externalId": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phoneNumber": "<string>",
"attributes": {}
}
],
"mode": "merge"
}
'import requests
url = "https://www.useboom.ai/api/v1/cdp/people/batch"
payload = {
"items": [
{
"externalId": "<string>",
"firstName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phoneNumber": "<string>",
"attributes": {}
}
],
"mode": "merge"
}
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: [
{
externalId: '<string>',
firstName: '<string>',
lastName: '<string>',
email: '<string>',
phoneNumber: '<string>',
attributes: {}
}
],
mode: 'merge'
})
};
fetch('https://www.useboom.ai/api/v1/cdp/people/batch', 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://www.useboom.ai/api/v1/cdp/people/batch",
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' => [
[
'externalId' => '<string>',
'firstName' => '<string>',
'lastName' => '<string>',
'email' => '<string>',
'phoneNumber' => '<string>',
'attributes' => [
]
]
],
'mode' => 'merge'
]),
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://www.useboom.ai/api/v1/cdp/people/batch"
payload := strings.NewReader("{\n \"items\": [\n {\n \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\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://www.useboom.ai/api/v1/cdp/people/batch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.useboom.ai/api/v1/cdp/people/batch")
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 \"externalId\": \"<string>\",\n \"firstName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phoneNumber\": \"<string>\",\n \"attributes\": {}\n }\n ],\n \"mode\": \"merge\"\n}"
response = http.request(request)
puts response.read_body{
"summary": {
"total": 0,
"created": 0,
"updated": 0,
"failed": 0
},
"errors": [
{
"index": 0,
"error": {
"code": "<string>",
"message": "<string>"
},
"externalId": "<string>"
}
]
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}