curl --request POST \
--url https://api.tented.ai/v1/contacts/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rules": {
"conditions": [
"<unknown>"
],
"kind": "group",
"operator": "and"
},
"page": 1,
"limit": 25,
"search": "<string>",
"sort": "updated_at",
"order": "desc"
}
'import requests
url = "https://api.tented.ai/v1/contacts/search"
payload = {
"rules": {
"conditions": ["<unknown>"],
"kind": "group",
"operator": "and"
},
"page": 1,
"limit": 25,
"search": "<string>",
"sort": "updated_at",
"order": "desc"
}
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({
rules: {conditions: ['<unknown>'], kind: 'group', operator: 'and'},
page: 1,
limit: 25,
search: '<string>',
sort: 'updated_at',
order: 'desc'
})
};
fetch('https://api.tented.ai/v1/contacts/search', 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.tented.ai/v1/contacts/search",
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([
'rules' => [
'conditions' => [
'<unknown>'
],
'kind' => 'group',
'operator' => 'and'
],
'page' => 1,
'limit' => 25,
'search' => '<string>',
'sort' => 'updated_at',
'order' => 'desc'
]),
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.tented.ai/v1/contacts/search"
payload := strings.NewReader("{\n \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\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.tented.ai/v1/contacts/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tented.ai/v1/contacts/search")
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 \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"contact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"display_name": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"phone": "<string>",
"email_domain": "<string>",
"company": "<string>",
"job_title": "<string>",
"address": "<string>",
"address2": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"zip_code": "<string>",
"original_source": "<string>",
"original_source_detail": "<string>",
"lead_status": "<string>",
"lifecycle_stage": "<string>",
"tented_score": 123,
"unsubscribed": true,
"marketing_email_subscribed": true,
"marketing_sms_subscribed": true,
"marketing_email_invalid": true,
"marketing_sms_invalid": true,
"last_activity_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"pagination": {
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123
}
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}Search contacts by rules
Return the contacts matching a segment rule tree — the same rule DSL used for dynamic lists, blast audiences, and flow rules. Rule trees use camelCase keys (fieldDefinitionId, listId, timeWindow), unlike the rest of the API. Trees may nest at most 5 levels deep and contain at most 100 nodes; email_step conditions are rejected here (they are only legal inside flow condition steps). Results can be additionally narrowed with search and are paginated. Items do not include custom_fields — fetch a single contact for those.
curl --request POST \
--url https://api.tented.ai/v1/contacts/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"rules": {
"conditions": [
"<unknown>"
],
"kind": "group",
"operator": "and"
},
"page": 1,
"limit": 25,
"search": "<string>",
"sort": "updated_at",
"order": "desc"
}
'import requests
url = "https://api.tented.ai/v1/contacts/search"
payload = {
"rules": {
"conditions": ["<unknown>"],
"kind": "group",
"operator": "and"
},
"page": 1,
"limit": 25,
"search": "<string>",
"sort": "updated_at",
"order": "desc"
}
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({
rules: {conditions: ['<unknown>'], kind: 'group', operator: 'and'},
page: 1,
limit: 25,
search: '<string>',
sort: 'updated_at',
order: 'desc'
})
};
fetch('https://api.tented.ai/v1/contacts/search', 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.tented.ai/v1/contacts/search",
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([
'rules' => [
'conditions' => [
'<unknown>'
],
'kind' => 'group',
'operator' => 'and'
],
'page' => 1,
'limit' => 25,
'search' => '<string>',
'sort' => 'updated_at',
'order' => 'desc'
]),
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.tented.ai/v1/contacts/search"
payload := strings.NewReader("{\n \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\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.tented.ai/v1/contacts/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tented.ai/v1/contacts/search")
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 \"rules\": {\n \"conditions\": [\n \"<unknown>\"\n ],\n \"kind\": \"group\",\n \"operator\": \"and\"\n },\n \"page\": 1,\n \"limit\": 25,\n \"search\": \"<string>\",\n \"sort\": \"updated_at\",\n \"order\": \"desc\"\n}"
response = http.request(request)
puts response.read_body{
"items": [
{
"contact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"display_name": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>",
"phone": "<string>",
"email_domain": "<string>",
"company": "<string>",
"job_title": "<string>",
"address": "<string>",
"address2": "<string>",
"city": "<string>",
"state": "<string>",
"country": "<string>",
"zip_code": "<string>",
"original_source": "<string>",
"original_source_detail": "<string>",
"lead_status": "<string>",
"lifecycle_stage": "<string>",
"tented_score": 123,
"unsubscribed": true,
"marketing_email_subscribed": true,
"marketing_sms_subscribed": true,
"marketing_email_invalid": true,
"marketing_sms_invalid": true,
"last_activity_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
],
"pagination": {
"page": 123,
"limit": 123,
"total": 123,
"totalPages": 123
}
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}{
"error": "<string>",
"error_code": "<string>",
"message": "<string>",
"code": "<string>",
"details": {},
"limit": 123,
"current": 123
}Authorizations
Workspace API key, e.g. Authorization: Bearer tented_.... Create keys in Workspace Settings → API Keys.
Body
Segment rule tree evaluated against the contact base, e.g. {"kind": "group", "operator": "and", "conditions": [{"kind": "condition", "source": "contact", "field": "state", "operator": "equals", "value": "CA"}]}.
Show child attributes
Show child attributes
Page number, starting at 1.
x >= 1Results per page (1–100).
1 <= x <= 100Case-insensitive substring match against display name, email, phone, company, first name, and last name, applied on top of rules.
255Sort key.
created_at, updated_at, last_activity_at, display_name, first_name, last_name, normalized_email, original_source Sort direction.
asc, desc