curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank \
--header 'Content-Type: application/json' \
--data '
{
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"catalog": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"tags": [
"trail",
"running",
"outdoor"
],
"popularity": 0.82,
"in_stock": true
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"tags": [
"hydration",
"running"
],
"popularity": 0.41,
"in_stock": true
}
],
"signals": [
{
"product_id": "sku_1042",
"category": "footwear",
"type": "view",
"age_days": 2
},
{
"category": "footwear",
"type": "purchase",
"age_days": 40,
"value": 1
}
],
"traits": {
"category_affinity": {
"footwear": 0.9,
"accessories": 0.4
},
"preferred_tags": [
"trail"
]
},
"limit": 2
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank"
payload = {
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"catalog": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"tags": ["trail", "running", "outdoor"],
"popularity": 0.82,
"in_stock": True
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"tags": ["hydration", "running"],
"popularity": 0.41,
"in_stock": True
}
],
"signals": [
{
"product_id": "sku_1042",
"category": "footwear",
"type": "view",
"age_days": 2
},
{
"category": "footwear",
"type": "purchase",
"age_days": 40,
"value": 1
}
],
"traits": {
"category_affinity": {
"footwear": 0.9,
"accessories": 0.4
},
"preferred_tags": ["trail"]
},
"limit": 2
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
profile_id: 'cnt_01J8XF3T4W5Q6N7V8R9M0K1P',
catalog: [
{
product_id: 'sku_1042',
title: 'Trail Running Shoes',
category: 'footwear',
brand: 'North Peak',
price: 129.99,
tags: ['trail', 'running', 'outdoor'],
popularity: 0.82,
in_stock: true
},
{
product_id: 'sku_2150',
title: 'Hydration Vest 5L',
category: 'accessories',
brand: 'HydraPak',
price: 59,
tags: ['hydration', 'running'],
popularity: 0.41,
in_stock: true
}
],
signals: [
{product_id: 'sku_1042', category: 'footwear', type: 'view', age_days: 2},
{category: 'footwear', type: 'purchase', age_days: 40, value: 1}
],
traits: {
category_affinity: {footwear: 0.9, accessories: 0.4},
preferred_tags: ['trail']
},
limit: 2
})
};
fetch('https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank', 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/recommendations/rank",
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([
'profile_id' => 'cnt_01J8XF3T4W5Q6N7V8R9M0K1P',
'catalog' => [
[
'product_id' => 'sku_1042',
'title' => 'Trail Running Shoes',
'category' => 'footwear',
'brand' => 'North Peak',
'price' => 129.99,
'tags' => [
'trail',
'running',
'outdoor'
],
'popularity' => 0.82,
'in_stock' => true
],
[
'product_id' => 'sku_2150',
'title' => 'Hydration Vest 5L',
'category' => 'accessories',
'brand' => 'HydraPak',
'price' => 59,
'tags' => [
'hydration',
'running'
],
'popularity' => 0.41,
'in_stock' => true
]
],
'signals' => [
[
'product_id' => 'sku_1042',
'category' => 'footwear',
'type' => 'view',
'age_days' => 2
],
[
'category' => 'footwear',
'type' => 'purchase',
'age_days' => 40,
'value' => 1
]
],
'traits' => [
'category_affinity' => [
'footwear' => 0.9,
'accessories' => 0.4
],
'preferred_tags' => [
'trail'
]
],
'limit' => 2
]),
CURLOPT_HTTPHEADER => [
"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/recommendations/rank"
payload := strings.NewReader("{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}")
req, _ := http.NewRequest("POST", url, payload)
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/recommendations/rank")
.header("Content-Type", "application/json")
.body("{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"experiment": null,
"recommendations": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"score": 0.87,
"rank": 1,
"factors": {
"category": 0.9,
"brand": 0,
"tag": 0.66,
"price_fit": 0.5,
"popularity": 0.82
}
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"score": 0.51,
"rank": 2,
"factors": {
"category": 0.4,
"brand": 0,
"tag": 0.33,
"price_fit": 0.9,
"popularity": 0.41
}
}
],
"considered_count": 2,
"excluded_count": 0,
"weights": {
"category": 30,
"brand": 15,
"tag": 15,
"price_fit": 20,
"popularity": 20
},
"half_life_days": 30,
"limit": 2
},
"meta": {
"request_id": "req_01J8Z9K3P4Q5R6S7T8U9V0W1X2",
"timestamp": "2026-08-19T12:00:00.000Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Rank next-best products for a profile
Stateless next-best-product ranking: given ONE profile’s affinity traits + purchase/browse signals and your candidate catalog, returns the products that profile is most likely to buy next, each with a per-factor affinity breakdown (category / brand / tag / price-fit / popularity). Feed it from your CDP computed traits and event stream, then render the ranked list into an in-thread RCS / WhatsApp catalog carousel or a campaign. Pass an experiment with per-variant weights for deterministic A/B bucketing — the assigned variant is echoed back for attribution. Ranks only; it never dispatches a message. Requires owner/admin/developer.
curl --request POST \
--url https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank \
--header 'Content-Type: application/json' \
--data '
{
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"catalog": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"tags": [
"trail",
"running",
"outdoor"
],
"popularity": 0.82,
"in_stock": true
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"tags": [
"hydration",
"running"
],
"popularity": 0.41,
"in_stock": true
}
],
"signals": [
{
"product_id": "sku_1042",
"category": "footwear",
"type": "view",
"age_days": 2
},
{
"category": "footwear",
"type": "purchase",
"age_days": 40,
"value": 1
}
],
"traits": {
"category_affinity": {
"footwear": 0.9,
"accessories": 0.4
},
"preferred_tags": [
"trail"
]
},
"limit": 2
}
'import requests
url = "https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank"
payload = {
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"catalog": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"tags": ["trail", "running", "outdoor"],
"popularity": 0.82,
"in_stock": True
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"tags": ["hydration", "running"],
"popularity": 0.41,
"in_stock": True
}
],
"signals": [
{
"product_id": "sku_1042",
"category": "footwear",
"type": "view",
"age_days": 2
},
{
"category": "footwear",
"type": "purchase",
"age_days": 40,
"value": 1
}
],
"traits": {
"category_affinity": {
"footwear": 0.9,
"accessories": 0.4
},
"preferred_tags": ["trail"]
},
"limit": 2
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
profile_id: 'cnt_01J8XF3T4W5Q6N7V8R9M0K1P',
catalog: [
{
product_id: 'sku_1042',
title: 'Trail Running Shoes',
category: 'footwear',
brand: 'North Peak',
price: 129.99,
tags: ['trail', 'running', 'outdoor'],
popularity: 0.82,
in_stock: true
},
{
product_id: 'sku_2150',
title: 'Hydration Vest 5L',
category: 'accessories',
brand: 'HydraPak',
price: 59,
tags: ['hydration', 'running'],
popularity: 0.41,
in_stock: true
}
],
signals: [
{product_id: 'sku_1042', category: 'footwear', type: 'view', age_days: 2},
{category: 'footwear', type: 'purchase', age_days: 40, value: 1}
],
traits: {
category_affinity: {footwear: 0.9, accessories: 0.4},
preferred_tags: ['trail']
},
limit: 2
})
};
fetch('https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank', 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/recommendations/rank",
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([
'profile_id' => 'cnt_01J8XF3T4W5Q6N7V8R9M0K1P',
'catalog' => [
[
'product_id' => 'sku_1042',
'title' => 'Trail Running Shoes',
'category' => 'footwear',
'brand' => 'North Peak',
'price' => 129.99,
'tags' => [
'trail',
'running',
'outdoor'
],
'popularity' => 0.82,
'in_stock' => true
],
[
'product_id' => 'sku_2150',
'title' => 'Hydration Vest 5L',
'category' => 'accessories',
'brand' => 'HydraPak',
'price' => 59,
'tags' => [
'hydration',
'running'
],
'popularity' => 0.41,
'in_stock' => true
]
],
'signals' => [
[
'product_id' => 'sku_1042',
'category' => 'footwear',
'type' => 'view',
'age_days' => 2
],
[
'category' => 'footwear',
'type' => 'purchase',
'age_days' => 40,
'value' => 1
]
],
'traits' => [
'category_affinity' => [
'footwear' => 0.9,
'accessories' => 0.4
],
'preferred_tags' => [
'trail'
]
],
'limit' => 2
]),
CURLOPT_HTTPHEADER => [
"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/recommendations/rank"
payload := strings.NewReader("{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}")
req, _ := http.NewRequest("POST", url, payload)
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/recommendations/rank")
.header("Content-Type", "application/json")
.body("{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.orbit.devotel.io/api/v1/cdp/recommendations/rank")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"profile_id\": \"cnt_01J8XF3T4W5Q6N7V8R9M0K1P\",\n \"catalog\": [\n {\n \"product_id\": \"sku_1042\",\n \"title\": \"Trail Running Shoes\",\n \"category\": \"footwear\",\n \"brand\": \"North Peak\",\n \"price\": 129.99,\n \"tags\": [\n \"trail\",\n \"running\",\n \"outdoor\"\n ],\n \"popularity\": 0.82,\n \"in_stock\": true\n },\n {\n \"product_id\": \"sku_2150\",\n \"title\": \"Hydration Vest 5L\",\n \"category\": \"accessories\",\n \"brand\": \"HydraPak\",\n \"price\": 59,\n \"tags\": [\n \"hydration\",\n \"running\"\n ],\n \"popularity\": 0.41,\n \"in_stock\": true\n }\n ],\n \"signals\": [\n {\n \"product_id\": \"sku_1042\",\n \"category\": \"footwear\",\n \"type\": \"view\",\n \"age_days\": 2\n },\n {\n \"category\": \"footwear\",\n \"type\": \"purchase\",\n \"age_days\": 40,\n \"value\": 1\n }\n ],\n \"traits\": {\n \"category_affinity\": {\n \"footwear\": 0.9,\n \"accessories\": 0.4\n },\n \"preferred_tags\": [\n \"trail\"\n ]\n },\n \"limit\": 2\n}"
response = http.request(request)
puts response.read_body{
"data": {
"profile_id": "cnt_01J8XF3T4W5Q6N7V8R9M0K1P",
"experiment": null,
"recommendations": [
{
"product_id": "sku_1042",
"title": "Trail Running Shoes",
"category": "footwear",
"brand": "North Peak",
"price": 129.99,
"score": 0.87,
"rank": 1,
"factors": {
"category": 0.9,
"brand": 0,
"tag": 0.66,
"price_fit": 0.5,
"popularity": 0.82
}
},
{
"product_id": "sku_2150",
"title": "Hydration Vest 5L",
"category": "accessories",
"brand": "HydraPak",
"price": 59,
"score": 0.51,
"rank": 2,
"factors": {
"category": 0.4,
"brand": 0,
"tag": 0.33,
"price_fit": 0.9,
"popularity": 0.41
}
}
],
"considered_count": 2,
"excluded_count": 0,
"weights": {
"category": 30,
"brand": 15,
"tag": 15,
"price_fit": 20,
"popularity": 20
},
"half_life_days": 30,
"limit": 2
},
"meta": {
"request_id": "req_01J8Z9K3P4Q5R6S7T8U9V0W1X2",
"timestamp": "2026-08-19T12:00:00.000Z"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "<string>",
"status": 429,
"retry_after": 2
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"status": 123,
"details": {}
},
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"docs_url": "<string>"
}
}Body
Candidate products to rank (1-2000).
The profile the ranking is for (contact id or external CDP profile id) — used to bucket A/B experiments deterministically.
The profile's purchase/browse/view signals (up to 5000).
The profile's affinity traits: category_affinity / brand_affinity maps and preferred_tags.
How many recommendations to return.
Optional A/B experiment: a key plus named variants, each with its own factor weights.
Response
Ranked recommendations with per-factor score breakdown and the applied weights.
Ranked recommendations with per-factor score breakdown and the applied weights.