Get placements for a slot
Returns the active placements to render in a named slot on a marketplace storefront (for example a hero banner, a category strip, or search results). Requires a marketplace operator key.
A slot can return two kinds of placement. Sponsored placements (sponsored: true) are
paid advertising and must be rendered with their disclosure_label (for example
“Sponsored”) so shoppers can tell them apart from organic results. Curated fallback
placements (curated: true, sponsored: false) are hand-picked by the marketplace operator
to fill the slot when no paid placement is available; they are not labelled as sponsored.
Only sponsored placements require the disclosure label.
Blend placements with your organic listings or recommendations as appropriate for the slot.
Use the optional context parameter to request placements scoped to a category or a search
term, and limit to cap how many placements come back.
After rendering, log a beacon with POST /v1/marketplace/ad-events: one impression per
placement when it becomes visible, and a click when the shopper clicks it.
curl --request GET \
--url https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}', 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/marketplace/ad-slots/{slot_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"slot": "home_hero",
"context": null,
"placements": [
{
"booking_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"merchant_store_id": "3f1a2b4c-1111-2222-3333-444455556666",
"placement_kind": "product",
"product_ids": [
"715b8c10-eb11-4289-8c0e-2966e78cf9a5",
"9cd6e472-de84-435c-be43-957b56682f43"
],
"creative": {
"headline": "Summer audio sale",
"image_url": "https://cdn.example.com/ads/acme-hero.png",
"cta": "Shop now"
},
"sponsored": true,
"disclosure_label": "Sponsored"
}
]
}{
"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": "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.
Path Parameters
The slot to fill, for example home_hero or category_top.
Query Parameters
Optional context for context-scoped slots — a category identifier or a search term — used to pick placements relevant to what the shopper is viewing.
Maximum number of placements to return.
1 <= x <= 50Response
The active placements for the slot.
The active sponsored placements to render in a named marketplace storefront slot. Blend these with your organic listings or recommendations, each shown with its disclosure label.
curl --request GET \
--url https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}', 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/marketplace/ad-slots/{slot_key}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tybritelabs.com/v1/marketplace/ad-slots/{slot_key}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"slot": "home_hero",
"context": null,
"placements": [
{
"booking_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"merchant_store_id": "3f1a2b4c-1111-2222-3333-444455556666",
"placement_kind": "product",
"product_ids": [
"715b8c10-eb11-4289-8c0e-2966e78cf9a5",
"9cd6e472-de84-435c-be43-957b56682f43"
],
"creative": {
"headline": "Summer audio sale",
"image_url": "https://cdn.example.com/ads/acme-hero.png",
"cta": "Shop now"
},
"sponsored": true,
"disclosure_label": "Sponsored"
}
]
}{
"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": "server_error",
"message": "An unexpected error occurred"
}
}
