List profiles
curl --request POST \
--url http://localhost:3001/api/v1/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"search": "<string>",
"segmentFilter": [
"<string>"
],
"profilePropertyFilter": [
{
"id": "<string>",
"values": [
"<string>"
]
}
],
"sourceFilter": [],
"deliverySuppressionReasonFilter": [],
"cursor": "<string>",
"limit": 50,
"profileIds": [
"<string>"
]
}
'import requests
url = "http://localhost:3001/api/v1/profiles"
payload = {
"search": "<string>",
"segmentFilter": ["<string>"],
"profilePropertyFilter": [
{
"id": "<string>",
"values": ["<string>"]
}
],
"sourceFilter": [],
"deliverySuppressionReasonFilter": [],
"cursor": "<string>",
"limit": 50,
"profileIds": ["<string>"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
search: '<string>',
segmentFilter: ['<string>'],
profilePropertyFilter: [{id: '<string>', values: ['<string>']}],
sourceFilter: [],
deliverySuppressionReasonFilter: [],
cursor: '<string>',
limit: 50,
profileIds: ['<string>']
})
};
fetch('http://localhost:3001/api/v1/profiles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3001",
CURLOPT_URL => "http://localhost:3001/api/v1/profiles",
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([
'search' => '<string>',
'segmentFilter' => [
'<string>'
],
'profilePropertyFilter' => [
[
'id' => '<string>',
'values' => [
'<string>'
]
]
],
'sourceFilter' => [
],
'deliverySuppressionReasonFilter' => [
],
'cursor' => '<string>',
'limit' => 50,
'profileIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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 := "http://localhost:3001/api/v1/profiles"
payload := strings.NewReader("{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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("http://localhost:3001/api/v1/profiles")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3001/api/v1/profiles")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"profiles": [
{
"id": "<string>",
"email": "<string>",
"phone": "<string>",
"sources": [
"<string>"
],
"properties": {},
"segments": [
{
"id": "<string>",
"name": "<string>",
"type": "<string>"
}
],
"deliverySuppression": {
"suppressed": true,
"email": "<string>",
"suppressedAt": "<string>",
"latestBounceReason": "<string>",
"latestBounceDiagnosticCode": "<string>"
},
"createdAt": "<string>",
"updatedAt": "<string>"
}
],
"profileCount": 4503599627370495,
"previousCursor": "<string>",
"nextCursor": "<string>"
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}Profiles
List profiles
Get paginated list of Profiles with optional filtering
POST
/
api
/
v1
/
profiles
List profiles
curl --request POST \
--url http://localhost:3001/api/v1/profiles \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"search": "<string>",
"segmentFilter": [
"<string>"
],
"profilePropertyFilter": [
{
"id": "<string>",
"values": [
"<string>"
]
}
],
"sourceFilter": [],
"deliverySuppressionReasonFilter": [],
"cursor": "<string>",
"limit": 50,
"profileIds": [
"<string>"
]
}
'import requests
url = "http://localhost:3001/api/v1/profiles"
payload = {
"search": "<string>",
"segmentFilter": ["<string>"],
"profilePropertyFilter": [
{
"id": "<string>",
"values": ["<string>"]
}
],
"sourceFilter": [],
"deliverySuppressionReasonFilter": [],
"cursor": "<string>",
"limit": 50,
"profileIds": ["<string>"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
search: '<string>',
segmentFilter: ['<string>'],
profilePropertyFilter: [{id: '<string>', values: ['<string>']}],
sourceFilter: [],
deliverySuppressionReasonFilter: [],
cursor: '<string>',
limit: 50,
profileIds: ['<string>']
})
};
fetch('http://localhost:3001/api/v1/profiles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "3001",
CURLOPT_URL => "http://localhost:3001/api/v1/profiles",
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([
'search' => '<string>',
'segmentFilter' => [
'<string>'
],
'profilePropertyFilter' => [
[
'id' => '<string>',
'values' => [
'<string>'
]
]
],
'sourceFilter' => [
],
'deliverySuppressionReasonFilter' => [
],
'cursor' => '<string>',
'limit' => 50,
'profileIds' => [
'<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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 := "http://localhost:3001/api/v1/profiles"
payload := strings.NewReader("{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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("http://localhost:3001/api/v1/profiles")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:3001/api/v1/profiles")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"search\": \"<string>\",\n \"segmentFilter\": [\n \"<string>\"\n ],\n \"profilePropertyFilter\": [\n {\n \"id\": \"<string>\",\n \"values\": [\n \"<string>\"\n ]\n }\n ],\n \"sourceFilter\": [],\n \"deliverySuppressionReasonFilter\": [],\n \"cursor\": \"<string>\",\n \"limit\": 50,\n \"profileIds\": [\n \"<string>\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"profiles": [
{
"id": "<string>",
"email": "<string>",
"phone": "<string>",
"sources": [
"<string>"
],
"properties": {},
"segments": [
{
"id": "<string>",
"name": "<string>",
"type": "<string>"
}
],
"deliverySuppression": {
"suppressed": true,
"email": "<string>",
"suppressedAt": "<string>",
"latestBounceReason": "<string>",
"latestBounceDiagnosticCode": "<string>"
},
"createdAt": "<string>",
"updatedAt": "<string>"
}
],
"profileCount": 4503599627370495,
"previousCursor": "<string>",
"nextCursor": "<string>"
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}{
"errorCode": "TEMPLATE_NAME_EXISTS",
"message": "Template name 'Hello' already exists in this organization.",
"details": {
"issues": [
{
"path": "name",
"code": "duplicate",
"message": "Template name already exists in this organization."
}
]
}
}Authorizations
Unified API key for server-side SDK and API integrations
Body
application/json
POST /api/v1/profiles request body. Filter shape shared with bulk-by-filter endpoints.
Search Profiles by email, phone, or external ID (case-insensitive partial match)
Filter by Segment IDs
Filter by profile properties
Show child attributes
Show child attributes
Filter by ingestion source. Values are the same as the dashboard's Source column.
Available options:
form_submission, csv_import, api_sync, sdk, manual_edit, computed Filter by current Delivery Suppression status.
Available options:
eligible, suppressed Filter by current Delivery Suppression reason. Any reason filter implies suppressed Profiles.
Available options:
HardBounced, Complained, SoftBounceSuppressed Pagination cursor from previous response
Pagination direction (defaults to "after")
Available options:
before, after Number of Profiles to return (defaults to 10)
Required range:
1 <= x <= 100Filter by specific Profile IDs
Response
Default Response
⌘I

