Preview-evaluate a computed-trait rule
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"facts": {
"ltv": 200,
"lifecycle_stage": "active",
"last_seen_days": 3
}
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate"
payload = { "facts": {
"ltv": 200,
"lifecycle_stage": "active",
"last_seen_days": 3
} }
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({facts: {ltv: 200, lifecycle_stage: 'active', last_seen_days: 3}})
};
fetch('https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate', 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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate",
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([
'facts' => [
'ltv' => 200,
'lifecycle_stage' => 'active',
'last_seen_days' => 3
]
]),
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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate"
payload := strings.NewReader("{\n \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate")
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 \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"rule_id": "ctr_01H9XJKL3456",
"enabled": true,
"matches": true
},
"meta": {
"request_id": "req_01H9XREQ0012",
"timestamp": "2026-08-03T12:00:00.000Z"
}
}CDP
Preview-evaluate a computed-trait rule
Evaluate a persisted computed-trait rule against a set of caller-supplied contact facts and return whether the rule’s predicate matches, without persisting any trait assignment. The rule builder UI uses this for interactive “would this rule match if the LTV were 200?” previews; the predicate is always read from the stored rule so a caller cannot bypass it.
POST
/
api
/
v1
/
cdp
/
computed-traits
/
{id}
/
evaluate
Preview-evaluate a computed-trait rule
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"facts": {
"ltv": 200,
"lifecycle_stage": "active",
"last_seen_days": 3
}
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate"
payload = { "facts": {
"ltv": 200,
"lifecycle_stage": "active",
"last_seen_days": 3
} }
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({facts: {ltv: 200, lifecycle_stage: 'active', last_seen_days: 3}})
};
fetch('https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate', 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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate",
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([
'facts' => [
'ltv' => 200,
'lifecycle_stage' => 'active',
'last_seen_days' => 3
]
]),
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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate"
payload := strings.NewReader("{\n \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\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.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/computed-traits/{id}/evaluate")
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 \"facts\": {\n \"ltv\": 200,\n \"lifecycle_stage\": \"active\",\n \"last_seen_days\": 3\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"rule_id": "ctr_01H9XJKL3456",
"enabled": true,
"matches": true
},
"meta": {
"request_id": "req_01H9XREQ0012",
"timestamp": "2026-08-03T12:00:00.000Z"
}
}Authorizations
BearerApiKey
Dashboard JWT token from Clerk
Path Parameters
Body
application/json
Contact facts to test the rule against (e.g. lifetime value, last-seen, lifecycle). Values may be number, string, boolean, or null.
Show child attributes
Show child attributes
⌘I