Find the best promotion for a cart
Return the single highest-value eligible promotion for a cart — what to auto-apply at checkout. Galactic Core evaluates every active promotion against the cart server-side and returns the one that saves the customer the most, along with its discount amount.
Send the cart you intend to charge — each line is the product, its quantity, and
the unit price you’re charging. When no promotion applies, promotion is
null and discount is 0.
Marketplace storefronts: pass store_id (the merchant_store_id you
received with the promotion or collection) to evaluate that merchant’s
promotions.
curl --request POST \
--url https://api.tybritelabs.com/v1/promotions/calculate-best \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cart": [
{
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"quantity": 1,
"price": 349.99
}
]
}
'import requests
url = "https://api.tybritelabs.com/v1/promotions/calculate-best"
payload = { "cart": [
{
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"quantity": 1,
"price": 349.99
}
] }
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({
cart: [
{product_id: '7d425c0a-50e7-4e39-af79-6f7945f9dfa8', quantity: 1, price: 349.99}
]
})
};
fetch('https://api.tybritelabs.com/v1/promotions/calculate-best', 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.tybritelabs.com/v1/promotions/calculate-best",
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([
'cart' => [
[
'product_id' => '7d425c0a-50e7-4e39-af79-6f7945f9dfa8',
'quantity' => 1,
'price' => 349.99
]
]
]),
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.tybritelabs.com/v1/promotions/calculate-best"
payload := strings.NewReader("{\n \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\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.tybritelabs.com/v1/promotions/calculate-best")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/promotions/calculate-best")
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 \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"promotion": {
"id": "46e746e2-6ef3-4091-ae4e-6bc8d405a1a2",
"name": "Audio + Wearable Bundle",
"type": "bundle"
},
"discount": 100
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}Authorizations
API Key Authentication
Use your API key in the Authorization header:
Authorization: Bearer tybrite_sk_live_YOUR_KEY
Key Types:
Secret Keys (Server-Side Only):
- Format:
tybrite_sk_live_*(production) ortybrite_sk_test_*(sandbox) - Full read/write access to all endpoints
- ⚠️ NEVER expose in client-side code or public repositories
- Required for: every write a shopper does not make for themselves, authentication, payment verification, AI recommendations
Publishable Keys (Client-Safe):
- Format:
tybrite_pk_live_*(production) ortybrite_pk_test_*(sandbox) - Catalogue reads, plus the actions a shopper takes for themselves
- ✅ Safe for client-side JavaScript, mobile apps, and public code
- Allowed for: browsing products, search, CMS content, pricing queries, cart and wishlist, reviews, storefront events, and the Agent API's quotes, cart drafts and checkout intents
Endpoint-Specific Requirements:
- Authentication endpoints (
/v1/auth/*): Secret key required - Payment verification (
POST /v1/payments/verify): Secret key required - AI Recommendations (
POST /v1/recommendations): Secret key required - Semantic Search (
POST /v1/search): Both key types allowed (read-only operation) - Shopper actions (cart, wishlist, reviews, storefront events, Agent API quotes, cart drafts and checkout intents): Both key types allowed
- All other write operations: Secret key required
- All read operations: Both key types allowed
Using a publishable key for restricted operations returns 403 Forbidden.
Query Parameters
The merchant whose promotions to evaluate. Required for marketplace
storefronts — pass the merchant_store_id you received with the promotion
or collection. Ignored for single-store keys.
Body
The cart lines to evaluate promotions against. Also accepted under the name items, which behaves identically; send whichever matches your storefront's own cart shape, and cart when both are present.
Show child attributes
Show child attributes
The shopper's country as an ISO 3166-1 alpha-2 code, used to decide whether a market-targeted promotion applies. Optional: when omitted the country is taken from the request's own network origin, so a storefront served through Galactic Core needs to send nothing. Pass it explicitly when your storefront resolves the destination itself, or to preview another market.
2"US"
The shopper's region or state, for a promotion narrowed within a market. Optional, and taken from the request's origin when omitted.
"California"
Alias of cart. Send one or the other, not both.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.tybritelabs.com/v1/promotions/calculate-best \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"cart": [
{
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"quantity": 1,
"price": 349.99
}
]
}
'import requests
url = "https://api.tybritelabs.com/v1/promotions/calculate-best"
payload = { "cart": [
{
"product_id": "7d425c0a-50e7-4e39-af79-6f7945f9dfa8",
"quantity": 1,
"price": 349.99
}
] }
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({
cart: [
{product_id: '7d425c0a-50e7-4e39-af79-6f7945f9dfa8', quantity: 1, price: 349.99}
]
})
};
fetch('https://api.tybritelabs.com/v1/promotions/calculate-best', 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.tybritelabs.com/v1/promotions/calculate-best",
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([
'cart' => [
[
'product_id' => '7d425c0a-50e7-4e39-af79-6f7945f9dfa8',
'quantity' => 1,
'price' => 349.99
]
]
]),
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.tybritelabs.com/v1/promotions/calculate-best"
payload := strings.NewReader("{\n \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\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.tybritelabs.com/v1/promotions/calculate-best")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/promotions/calculate-best")
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 \"cart\": [\n {\n \"product_id\": \"7d425c0a-50e7-4e39-af79-6f7945f9dfa8\",\n \"quantity\": 1,\n \"price\": 349.99\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"promotion": {
"id": "46e746e2-6ef3-4091-ae4e-6bc8d405a1a2",
"name": "Audio + Wearable Bundle",
"type": "bundle"
},
"discount": 100
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"details": "The 'email' field is required"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing or invalid Authorization header"
}
}{
"error": {
"code": "forbidden",
"message": "This operation requires a secret key. Publishable keys cover catalogue reads and the actions a shopper takes for themselves."
}
}{
"error": {
"code": "rate_limited",
"message": "Too many requests for this API key. Please slow down and try again shortly.",
"remaining": 0,
"reset": 1706198400
}
}{
"error": {
"code": "server_error",
"message": "An unexpected error occurred"
}
}
