Bid Request Reference
Praevis sends OpenRTB 2.5 bid requests to traditional RTB bidder endpoints. This page documents every field we send, what it contains, and when it’s present.
Endpoint: POST https://rtb.praevis.com/rtb (supply-side sends here; demand endpoint receives from Praevis)
Timeout: 150ms hard cutoff
Content-Type: application/json
Full annotated example — CTV app
{
"id": "auction-3fa85f64-5717-4562-b3fc-2c963f66afa6",
"at": 1,
"tmax": 150,
"app": {
"id": "app-uuid",
"name": "Example Streaming App",
"bundle": "com.example.streamingapp",
"cat": ["IAB1", "IAB1-7"],
"storeurl": "https://apps.apple.com/app/example/id123456",
"publisher": {
"id": "pub-uuid",
"name": "Example Publisher"
},
"content": {
"id": "content-uuid",
"title": "The Crown - Season 5",
"series": "The Crown",
"season": "5",
"episode": 3,
"cat": ["IAB1-7"],
"genre": "drama",
"len": 3600,
"livestream": 0,
"language": "en"
}
},
"imp": [
{
"id": "imp-001",
"video": {
"mimes": ["video/mp4"],
"minduration": 15,
"maxduration": 30,
"protocols": [2, 3, 5, 6],
"w": 1920,
"h": 1080,
"startdelay": 0,
"linearity": 1,
"skip": 0,
"api": []
},
"bidfloor": 3.00,
"bidfloorcur": "USD",
"secure": 1,
"ext": {
"pool_id": "pool-uuid",
"auction_type": "first_price"
}
}
],
"device": {
"ua": "Mozilla/5.0 (SMART-TV; Linux; Tizen 6.0) ...",
"ip": "203.0.113.42",
"geo": {
"country": "AE",
"region": "AE-DU",
"city": "Dubai",
"type": 2
},
"devicetype": 3,
"make": "Samsung",
"model": "QN65Q800T",
"os": "Tizen",
"language": "en",
"dnt": 0
},
"user": {
"id": "user-hashed-id"
},
"ext": {
"partner_id": "partner-uuid",
"praevis_version": "1.0"
}
}Top-level fields
| Field | Type | Always present | Description |
|---|---|---|---|
id | string | ✓ | Unique auction ID (UUID) |
at | int | ✓ | Auction type: always 1 (first-price) |
tmax | int | ✓ | Bid timeout in ms — always 150 |
app | object | App inventory | CTV/mobile app context (see below) |
site | object | Web inventory | Web context (see below) |
imp | array | ✓ | Impression opportunities (always 1 element) |
device | object | ✓ | Device and geo information |
user | object | ✓ | Hashed user ID (GDPR-safe) |
ext | object | ✓ | Praevis extension fields |
app object (CTV / mobile)
| Field | Description |
|---|---|
id | App identifier |
name | App display name |
bundle | App store bundle ID (com.example.app) |
cat | IAB content categories |
publisher.id | Praevis Publisher ID |
content.genre | Content genre (e.g., "drama", "sport", "news") — use for Delegate targeting |
content.title | Episode or show title |
content.series | Series name |
content.livestream | 1 = live, 0 = VOD |
content.language | Content language (ISO 639-1) |
site object (web)
| Field | Description |
|---|---|
id | Site identifier |
domain | Root domain (e.g., example.com) |
page | Current page URL |
cat | IAB content categories |
publisher.id | Praevis Publisher ID |
imp object
| Field | Description |
|---|---|
id | Impression ID |
video | Video impression spec (see below) |
banner | Banner impression spec (mutually exclusive with video) |
bidfloor | Floor price in USD CPM |
bidfloorcur | Always "USD" |
secure | Always 1 — HTTPS required |
ext.pool_id | Pool the publisher belongs to |
ext.auction_type | Always "first_price" |
video spec
| Field | Description |
|---|---|
mimes | Supported MIME types (["video/mp4"]) |
minduration | Min ad duration in seconds |
maxduration | Max ad duration in seconds |
protocols | VAST protocols: 2=VAST 2.0, 3=VAST 3.0, 5=VAST 2.0 Wrapper, 6=VAST 3.0 Wrapper |
w, h | Player dimensions in pixels |
startdelay | 0 = pre-roll, -1 = mid-roll, -2 = post-roll |
linearity | 1 = in-stream linear |
skip | 0 = not skippable, 1 = skippable |
device object
| Field | Description |
|---|---|
ua | User agent string |
ip | IPv4 address of the viewer |
geo.country | ISO 3166-1 alpha-2 ("AE", "GB", "US") |
geo.region | ISO 3166-2 region ("AE-DU", "GB-ENG") |
geo.city | City name |
devicetype | 1=mobile, 2=desktop, 3=CTV/connected TV, 4=tablet |
make | Device manufacturer |
model | Device model |
os | Operating system |
dnt | Do Not Track (0=no preference, 1=opted out) |
ext fields
| Field | Description |
|---|---|
ext.partner_id | Platform partner UUID (if inventory is partner-scoped) |
ext.praevis_version | API version — currently "1.0" |
Bid response format
Return HTTP 200 with a valid bid:
{
"id": "auction-3fa85f64-5717-4562-b3fc-2c963f66afa6",
"seatbid": [
{
"bid": [
{
"id": "your-bid-id",
"impid": "imp-001",
"price": 4.50,
"adid": "your-creative-id",
"adm": "https://your-vast-server.com/vast?params=...",
"crid": "creative-001",
"w": 1920,
"h": 1080
}
],
"seat": "your-dsp-id"
}
],
"cur": "USD"
}No bid: Return HTTP 204 with empty body. Do not return a 200 with an empty seatbid array.
First-price auction: price is the amount you will pay if you win. There is no second-price reduction. Set price to your true willingness to pay.
Field presence rules
| Condition | Fields present |
|---|---|
| CTV / mobile app | app, app.content, device.devicetype=3 |
| Web publisher | site, no app |
| Video inventory | imp[0].video, no banner |
| Banner inventory | imp[0].banner, no video |
| Partner-scoped | ext.partner_id present |
| Geo known | device.geo.country, device.geo.region, device.geo.city |
| Geo unknown | device.geo.country only, region/city absent |
Privacy & Consent
Praevis passes through all privacy signals from publishers to DSPs unchanged.
GDPR (TCF 2.0)
| Field | Type | Description |
|---|---|---|
regs.ext.gdpr | integer | 1 if GDPR applies, 0 otherwise |
user.ext.consent | string | TCF consent string |
CCPA
| Field | Type | Description |
|---|---|---|
regs.ext.us_privacy | string | CCPA consent string (e.g., 1YNN) |
GPP (Global Privacy Platform)
| Field | Type | Description |
|---|---|---|
regs.gpp | string | GPP consent string (consolidates GDPR, CCPA, and US state laws) |
regs.gpp_sid | integer[] | Section IDs that apply (e.g., [7] for US national) |
For VAST GET requests, pass privacy via query params: ?gdpr=1&gdpr_consent=...&us_privacy=1YNN&gpp=...&gpp_sid=7