Brand+ CTV OpenRTB Integration Guide
How supply partners and DSPs integrate CTV with Verve's Brand+ marketplace over OpenRTB 2.5 and 2.6: endpoints, ad pods, field requirements and samples.
Section 2 is for supply partners that send CTV ad requests to Brand+.
Section 3 is for demand partners (DSPs) that receive CTV bid requests from Brand+.
Sections 4 to 6 apply to both.
Table of Contents
1. Overview
1.1 Who this guide is for
This guide covers OpenRTB CTV integration on Verve's B+ (Brand+) marketplace. Section 2 is for supply partners that send CTV ad requests to Brand+. Section 3 is for demand partners (DSPs) that receive CTV bid requests from Brand+. Sections 4 to 6 apply to both.
1.2 Transaction flow
1.3 Supported standards
at = 1)1.4 Field status definitions
Brand+ statuses describe what Brand+ needs, which is sometimes stricter than the IAB specification. The ad request and bid response tables use Required, Conditional, Recommended and Optional; the bid request and ad response tables use Required and When available.
Brand+ rejects the request, or ignores the bid, without it.
Required in the situation described, for example GDPR or ad pods.
Not required, but improves fill, pricing or compliance.
Supported; send it if you have it.
Brand+ includes the field in every message.
Brand+ includes the field when the source data exists or the feature applies.
1.5 Best practices
Provide accurate device and platform metadata.
Send device.devicetype, make, model, os and osv, the full device.ua, and device.sua on OpenRTB 2.6.
Provide user information.
Within regional privacy rules, send the IP address, device.ifa with device.ext.ifa_type, user.id, and external IDs in user.eids (2.6) or user.ext.eids (2.5).
Pass privacy signals.
Send every signal that applies to the viewer's region. On OpenRTB 2.6, Brand+ reads the top-level fields (regs.gdpr, user.consent, regs.us_privacy) first and falls back to the ext versions.
Provide detailed content metadata.
Content metadata matters especially for CTV pricing. Use standard OpenRTB values. On 2.5, send network and channel as content.ext.network and content.ext.channel.
Describe ad pods.
For a pod, send video.podid on every impression of the break. For dynamic pods, also send poddur and maxseq. On 2.5, send the pod fields in imp.video.ext (for example imp.video.ext.podid); video.sequence does not identify a pod. See 4.1.
Upgrade to OpenRTB 2.6.
2.6 standardises the fields CTV relies on: ad pods, structured user agents, external IDs, and the Network and Channel objects.
2. Supply partners (publisher to Brand+)
2.1 Setup
2.1.1 Quick-start checklist
2.1.2 Endpoints
https://ortb26-us-east-1.ad.smaato.net/oapi/exchange/ortb26https://ortb26-eu-west-1.ad.smaato.net/oapi/exchange/ortb26https://ortb26-ap-southeast-1.ad.smaato.net/oapi/exchange/ortb26Some integrations use a dedicated endpoint instead, for example accounts using the SEM feature, Prebid Server, or partner-specific integrations. Your Verve account manager will give you the endpoint for your configuration. No token is passed in the URL; requests are identified by app.publisher.id and imp.tagid.
2.1.3 Connection requirements
- Protocol
- HTTPS. All published endpoints use HTTPS.
- Compression
- gzip-encoded requests are accepted (
Content-Encoding: gzip). - QPS
- QPS limits are agreed individually with each partner.
- Timeout
- Set
tmaxto the time you allow Verve to respond, in milliseconds.
Rejected requests
Requests are rejected (HTTP 422)
2.2 Ad request (publisher → Brand+)
2.2.1 Sample
{
: "a1b2c3d4-0000-4000-8000-000000000001",
: [
{
: "a1b2c3d4-0000-4000-8000-000000000002",
: {
: ["video/mp4"],
: 1,
: 1,
: 120,
: [2, 3, 5, 6],
: -1,
"pos": 7,
: [3, 8, 9, 10, 12, 14, 17],
: 1,
: 100000,
: [1],
"boxingallowed": 1,
: 1,
: 0,
: 1,
: 1920,
: 1080
},
: "<BRAND_PLUS_ADBREAK_ID>",
: 8.0,
: "USD",
"instl": 0,
: 1,
"metric": [
{
"type": "video_completion_rate",
"value": 0.95,
"vendor": "EXCHANGE"
}
],
: 3,
"ext": {},
: 3600
}
],
: {
: "<APP_ID>",
: "Example CTV App",
: "<STORE_APP_ID>",
: "https://channelstore.example.com/apps/example-ctv-app",
: [],
"pagecat": [],
: "example-ctv-app.com",
"publisher": {
: "<BRAND_PLUS_PUBLISHER_ID>",
"name": "Example Publisher"
},
"content": {
: "",
: "",
: "0",
: "news",
: {
"id": "",
"name": "",
"cattax": 1
},
: [],
: "",
"keywords": "",
: "",
: 1,
"ext": {
: "Example Network",
: ""
},
: 1
},
"ext": {
: "example-publisher.com"
},
"cattax": 1
},
: {
: 0,
: "Roku/DVP-16.0 (16.0.4.842-51)",
: "192.0.2.1",
: {
"country": "USA",
"region": "CA",
"city": "<CITY>",
"zip": "<ZIP>",
"type": 2,
"lat": 0.0,
"lon": 0.0,
"ipservice": 3,
"accuracy": 10000,
"metro": "<DMA>"
},
"dpidsha1": "<SHA1_OF_DEVICE_ID>",
"dpidmd5": "<MD5_OF_DEVICE_ID>",
: "Roku",
: "Digital Video player",
: "Roku OS",
: "16.0",
: 7,
: "",
: "00000000-0000-0000-0000-000000000000",
: 0,
"ext": {
"is_app": 1,
: "rida"
}
},
: {
: "<USER_ID>",
"ext": {
: [
{
"source": "example-id.com",
"uids": [
{
"id": "<EID_UID>",
"atype": 3,
"ext": {
"rtiPartner": "idl"
}
}
]
}
]
}
},
: 1,
: 250,
: ["USD"],
: ["IAB23-1", "IAB25-1", "IAB25-2", "IAB25-3", "IAB25-4", "IAB25-5", "IAB25-6", "IAB25-7", "IAB26", "IAB26-1", "IAB26-2", "IAB26-3", "IAB26-4"],
: ["blocked-advertiser.example"],
"source": {
: 0,
: "c1b2c3d4-0000-4000-8000-000000000003",
"ext": {
: {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "example-ssp.com",
"sid": "<SELLER_ID>",
"hp": 1
}
]
}
}
},
"regs": {
: 0,
: 0,
"ext": {
: 0,
: "1YNN"
}
},
"cattax": 1
}2.2.2 Sample: dynamic ad pod (OpenRTB 2.6)
An illustrative OpenRTB 2.6 request for a dynamic pod of up to 4 ads filling 120 seconds. See the IAB OpenRTB 2.6 specification.
{
: "ckvvbteojs4lovcb9rfg",
: [
{
: "1",
: {
: ["video/mp4"],
: 5,
: 30,
: [2, 3, 5, 6, 7, 8],
: 1920,
: 1080,
: 0,
: 1,
: 1,
: 0,
: [1],
: [1, 2],
: "pod-1",
: 1,
: 120,
: 4,
: [1, 2]
},
: "<BRAND_PLUS_ADBREAK_ID>",
: 10.0,
: "USD",
: 1,
: 3600,
: 3,
"rwdd": 0
}
],
: {
: "123456",
: "Example CTV App",
: "com.example.ctvapp",
: "https://www.example.com/apps/ctvapp",
: ["IAB1"],
"publisher": {
: "<BRAND_PLUS_PUBLISHER_ID>",
"name": "Example Publisher"
},
"content": {
: "ep-0001",
: "Example Episode",
: "Example Series",
: "Comedy",
: ["IAB1"],
: "TV-PG",
: 0,
: 1800,
: "en",
: 1,
: 1,
: 1,
"network": {
"id": "net-1",
: "Example Network",
"domain": "examplenetwork.com"
},
"channel": {
"id": "chan-1",
: "Example Channel",
"domain": "examplechannel.com"
}
}
},
: {
: "Mozilla/5.0 (SMART-TV; Linux; Tizen 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/6.0 TV Safari/537.36",
: "192.0.2.1",
: {
"country": "USA",
"region": "CA",
"metro": "803",
"type": 2
},
: 3,
: "Samsung",
: "Tizen TV",
: "Tizen",
: "6.0",
: "00000000-0000-0000-0000-000000000000",
: 0,
: 0,
: "en",
: 2,
"ext": {
: "tifa"
},
: {
"source": 2,
"platform": {
"brand": "Tizen",
"version": ["6", "0"]
},
"mobile": 0,
"model": "Example TV Model"
}
},
: {
: "user-0001",
: [
{
"source": "example-id.com",
"uids": [
{
"id": "EXAMPLE_UID",
"atype": 3
}
]
}
]
},
: 1,
: 500,
: ["USD"],
: ["IAB25", "IAB26"],
"source": {
: 1,
: "ckvvbteojs4lovcb9rg0",
: {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "example-ssp.com",
"sid": "1234",
"rid": "ckvvbteojs4lovcb9rfg",
"hp": 1
}
]
}
},
"regs": {
: 0,
: 0,
: "1YNN",
: "DBABTA~1YNN",
: [6]
}
}2.2.3 Field reference
| Object | Attribute | Type | Status | Description | Note |
|---|---|---|---|---|---|
| BidRequest | id | string | Required | ID of the bid request, assigned by the exchange, and unique for the exchange's subsequent tracking of the responses. | Rejected if missing. |
| BidRequest | imp | object array | Required | Array of Imp objects representing the impressions offered. | Rejected if missing. |
| BidRequest | app | object | Required | Details via an App object about the publisher's app. | Rejected if neither app nor site is sent. CTV uses app. |
| BidRequest | device | object | Required | Details via a Device object about the user's device to which the impression will be delivered. | Rejected if missing. |
| BidRequest | user | object | Recommended | Details via a User object about the human user of the device; the advertising audience. | |
| BidRequest | at | integer | Required | Auction type, where 1 = First Price, 2 = Second Price Plus. | Brand+ runs first-price auctions only: send 1. |
| BidRequest | tmax | integer | Recommended | Maximum time in milliseconds the exchange allows for bids to be received, including Internet latency. | |
| BidRequest | cur | string array | Optional | Array of allowed currencies for bids on this bid request using ISO-4217 alpha codes. | If sent, must include USD, otherwise the request is rejected. |
| BidRequest | bcat | string array | Optional | Blocked advertiser categories using the specified category taxonomy. | |
| BidRequest | badv | string array | Optional | Block list of advertisers by their domains. | |
| Source | fd | integer | Recommended | Entity responsible for the final impression sale decision, where 0 = exchange, 1 = upstream source. | |
| Source | tid | string | Recommended | Transaction ID that must be common across all participants in this bid request. | |
| Source | pchain | string | Recommended | Payment ID chain string containing embedded syntax described in the TAG payment ID Protocol v1.0. | |
| Source | schain | object | Conditional | The links in the supply chain, and an indicator of whether the supply chain is complete. | Required if you are not direct to Brand+. On 2.5, send as source.ext.schain. |
| Imp | id | string | Required | A unique identifier for this impression within the context of the bid request. | |
| Imp | video | object | Required | A Video object; required if this impression is offered as a video ad opportunity. | |
| Imp | tagid | string | Required | Identifier for specific ad placement or ad tag that was used to initiate the auction. | Your Brand+ (SPX) AdBreakId. Prebid Server integrations use imp.ext.bidder.adSpace. |
| Imp | bidfloor | float | Recommended | Minimum bid for this impression expressed in CPM. | |
| Imp | bidfloorcur | string | Recommended | Currency specified using ISO-4217 alpha codes. | Use USD. |
| Imp | secure | integer | Recommended | Flag to indicate if the impression requires secure HTTPS URL creative assets and markup, where 0 = non-secure, 1 = secure. | |
| Imp | displaymanager | string | Recommended | Name of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps. | |
| Imp | displaymanagerver | string | Recommended | Version of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps. | |
| Imp | exp | integer | Optional | Advisory as to the number of seconds that may elapse between the auction and the actual impression. | |
| Imp | pmp | object | Optional | A Pmp object containing any private marketplace deals in effect for this impression. | Deal IDs are returned in the ad response only when enabled for your account. |
| Imp | ssai | integer | Recommended | Indicates if server-side ad insertion is in use: 0 = unknown, 1 = all client-side, 2 = assets stitched server-side but tracking fired client-side, 3 = all server-side. | 2.6. |
| Video | mimes | string array | Required | Content MIME types supported. | |
| Video | minduration | integer | Required (2.5) Conditional (2.6) | Minimum video ad duration in seconds. Mutually exclusive with rqddurs. | In 2.6, send either min/maxduration or rqddurs. |
| Video | maxduration | integer | Required (2.5) Conditional (2.6) | Maximum video ad duration in seconds. Mutually exclusive with rqddurs. | In 2.6, send either min/maxduration or rqddurs. |
| Video | rqddurs | integer array | Conditional | Precise acceptable durations for video creatives in seconds. Targets the Live TV use case. | 2.6: use instead of min/maxduration. On 2.5, send as imp.video.ext.rqddurs alongside minduration and maxduration. Brand+ narrows the outbound minduration and maxduration to the lowest and highest rqddurs values. Works on any video impression, not only ad pods |
| Video | protocols | integer array | Recommended | Array of supported video protocols. Refer to List: Creative Subtypes - Audio/Video in AdCOM 1.0. | |
| Video | w | integer | Recommended | Width of the video player in device-independent pixels (DIPS). | |
| Video | h | integer | Recommended | Height of the video player in device-independent pixels (DIPS). | |
| Video | startdelay | integer | Recommended | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | |
| Video | plcmt | integer | Recommended | Video placement type for the impression. Refer to List: Plcmt Subtypes - Video in AdCOM 1.0. | Use 1 (instream) for CTV. |
| Video | placement | integer | Optional | Deprecated as of OpenRTB 2.6-202303. Use plcmt instead. | Send plcmt instead; keep placement only for older integrations. |
| Video | linearity | integer | Recommended | Indicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed. | |
| Video | skip | integer | Recommended | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. | |
| Video | playbackmethod | integer array | Optional | Playback methods that may be in use. If none are specified, any method may be used. | |
| Video | delivery | integer array | Optional | Supported delivery methods. If none specified, assume all are supported. | |
| Video | minbitrate | integer | Optional | Minimum bit rate in Kbps. | |
| Video | maxbitrate | integer | Optional | Maximum bit rate in Kbps. | |
| Video | battr | integer array | Optional | Blocked creative attributes. Refer to List: Creative Attributes in AdCOM 1.0. | |
| Video | sequence | integer | Optional | Deprecated as of OpenRTB 2.6. Use slotinpod. | Not used to identify ad pods. To send a pod, use imp.video.podid (2.6) or imp.video.ext.podid (2.5). See 4.1. |
| Video | podid | string | Conditional | Unique identifier indicating that an impression opportunity belongs to a video ad pod. | 2.6. On 2.5, send as imp.video.ext.podid. Required for ad pods. |
| Video | podseq | integer | Recommended (pods) | The sequence (position) of the video ad pod within a content stream. | 2.6. On 2.5, send as imp.video.ext.podseq. 1 = first pod in the content, −1 = last pod, 0 = any. If you don't know the position, leave it out rather than sending 0: Brand+ forwards podseq to DSPs only when you send it. |
| Video | poddur | integer | Conditional | Total amount of time in seconds that advertisers may fill for a dynamic video ad pod, or the dynamic portion of a hybrid pod. | 2.6. On 2.5, send as imp.video.ext.poddur. Required for dynamic or hybrid pods. |
| Video | maxseq | integer | Recommended (pods) | Maximum number of ads that may be served into a dynamic video ad pod. | 2.6. On 2.5, send as imp.video.ext.maxseq. See 4.1. |
| Video | poddedupe | enum array | Optional | Indicates pod deduplication settings that will be applied to bid responses. | 2.6. Not applied by Brand+: your ad server handles ad separation (see 4.1). |
| Video | slotinpod | integer | Optional | For video ad pods, indicates that the seller can guarantee delivery against the indicated slot position in the pod. | 2.6. On 2.5, send as imp.video.ext.slotinpod (imp.video.ext.slot_in_pod is also accepted). |
| Video | mincpmpersec | float | Optional | Minimum CPM per second. A price floor for the dynamic portion of a video ad pod, relative to bid duration. | 2.6. On 2.5, send as imp.video.ext.mincpmpersec. See 4.1. |
| Video | durfloors | object array | Optional | Floors by creative duration: a list of duration bands, each with its own floor (mindur, maxdur, bidfloor). | 2.6. On 2.5, send as imp.video.ext.durfloors. See 4.1 for how the slot floor is chosen. |
| App | id | string | Recommended | Exchange-specific app ID. | |
| App | name | string | Recommended | App name (may be aliased at the publisher's request). | |
| App | bundle | string | Recommended | The store ID of the app in an app store. See the OTT/CTV Store Assigned App Identification Guidelines. | |
| App | storeurl | string | Recommended | App store URL for an installed app; for IQG 2.1 compliance. | |
| App | cat | string array | Optional | Array of IAB Tech Lab content categories of the app. The taxonomy is defined by the cattax field. | |
| App | domain | string | Optional | Domain of the app. | |
| App | inventorypartnerdomain / ext.inventorypartnerdomain | — | Conditional | Domain of the content owner (inventory partner) whose ads.txt authorises the sale. IAB field on 2.6; Verve extension on 2.5. | 2.6. Send when the inventory is sold under an inventory-sharing agreement: the content owner's domain. The app's app-ads.txt must list it as an inventorypartnerdomain, and the content owner's ads.txt authorises the sale. On 2.5, send as app.ext.inventorypartnerdomain. Forwarded to DSPs as app.ext.inventorypartnerdomain. |
| Publisher | id | string | Required | Exchange-specific seller ID. Corresponds to a seller_id in the exchange's sellers.json file. | Your Brand+ (SPX) publisher ID. Prebid Server integrations use imp.ext.bidder.publisherId. |
| Content | id | string | Recommended | Publisher-provided ID uniquely identifying the content. | |
| Content | title | string | Recommended | Content title. | |
| Content | series | string | Optional | Content series. | |
| Content | season | string | Optional | Content season. | |
| Content | episode | integer | Optional | Episode number. | |
| Content | genre | string | Recommended | Genre that best describes the content. | |
| Content | cat | string array | Recommended | Array of IAB Tech Lab content categories that describe the content. | |
| Content | cattax | integer | Recommended | The taxonomy in use. Refer to List: Category Taxonomies in AdCOM 1.0. | |
| Content | contentrating | string | Recommended | Content rating. | |
| Content | livestream | integer | Recommended | Method of broadcast of the content: 0 = not scheduled (e.g. VOD or user-initiated), 1 = scheduled (linear viewing). | 0 = VOD or user-initiated, 1 = scheduled (linear) broadcast. |
| Content | language | string | Recommended | Content language using ISO-639-1-alpha-2. Only one of language or langb should be present. | |
| Content | len | integer | Recommended | Length of content in seconds; appropriate for video or audio. | |
| Content | prodq | integer | Optional | Production quality. Refer to List: Production Qualities in AdCOM 1.0. | |
| Content | context | integer | Optional | Type of content (game, video, text, etc.). Refer to List: Content Contexts in AdCOM 1.0. | |
| Content | producer | object | Optional | Details about the content Producer. | |
| Network | name | string | Recommended | Network the content is on. | 2.6, as content.network.name. |
| Channel | name | string | Recommended | Channel the content is on. | 2.6, as content.channel.name. |
| Content | ext.network | — | Recommended | Verve extension. | 2.5: network name. |
| Content | ext.channel | — | Recommended | Verve extension. | 2.5: channel name. |
| Device | ua | string | Recommended | Browser user agent string. This field represents a raw user agent string from the browser. | |
| Device | sua | object | Recommended | Structured user agent information defined by a UserAgent object. | 2.6. |
| Device | ip | string | Recommended | IPv4 address closest to device. | |
| Device | ipv6 | string | Optional | IP address closest to device as IPv6. | |
| Device | geo | object | Recommended | Location of the device assumed to be the user's current location, defined by a Geo object. | |
| Device | devicetype | integer | Recommended | The general type of device. Refer to List: Device Types in AdCOM 1.0. | 3 = connected TV, 7 = set-top box. |
| Device | make | string | Recommended | Device make. | |
| Device | model | string | Recommended | Device model. | |
| Device | os | string | Recommended | Device operating system. | |
| Device | osv | string | Recommended | Device operating system version. | |
| Device | ifa | string | Recommended | ID sanctioned for advertiser use in the clear (not hashed). | |
| Device | ext.ifa_type | — | Recommended | Verve extension. | IFA type, for example tifa or rida. |
| Device | lmt | integer | Recommended | "Limit Ad Tracking" signal commercially endorsed, where 0 = tracking is unrestricted, 1 = tracking must be limited. | |
| Device | dnt | integer | Recommended | Standard "Do Not Track" flag, where 0 = tracking is unrestricted, 1 = do not track. | |
| Device | language | string | Optional | Browser language using ISO-639-1-alpha-2. | |
| Device | connectiontype | integer | Optional | Network connection type. Refer to List: Connection Types in AdCOM 1.0. | |
| User | id | string | Recommended | Exchange-specific ID for the user. | Send id or buyeruid. |
| User | buyeruid | string | Recommended | Buyer-specific ID for the user as mapped by the exchange for the buyer. | Send id or buyeruid. |
| User | eids | object array | Recommended | Details for support of a standard protocol for multiple third party identity providers. | On 2.5, send as user.ext.eids. |
| User | consent | string | Conditional | When GDPR regulations are in effect, contains the Transparency and Consent Framework's Consent String. | Required where GDPR applies. On 2.5, send as user.ext.consent. |
| Regs | coppa | integer | Optional | Flag indicating if this request is subject to the COPPA regulations established by the USA FTC, where 0 = no, 1 = yes. | Brand+ does not accept child-directed traffic: requests with coppa = 1 are rejected. |
| Regs | gdpr | integer | Conditional | Whether the request is subject to GDPR regulations: 0 = No, 1 = Yes, omission indicates unknown. | Required where GDPR applies. On 2.5, send as regs.ext.gdpr. |
| Regs | us_privacy | string | Conditional | Communicates signals regarding consumer privacy under US privacy regulation. | Required where US privacy laws apply. On 2.5, send as regs.ext.us_privacy. |
| Regs | gpp | string | Conditional | Contains the Global Privacy Platform's consent string. | Required where GPP applies. |
| Regs | gpp_sid | integer array | Conditional | Array of the section(s) of the GPP string which should be applied for this transaction. | Required where GPP applies. |
2.3 Ad response (Brand+ → publisher)
2.3.1 Sample
Verve returns the winning ad using your request and impression IDs. The ad is a VAST file containing the advertiser's video, plus Verve's tracking URLs for impressions, errors, video progress and clicks.
{
: "a1b2c3d4-0000-4000-8000-000000000001",
"seatbid": [
{
"bid": [
{
: "d1b2c3d4-0000-0000-0000-000000000004",
: "a1b2c3d4-0000-4000-8000-000000000002",
: 11.0,
: "<CREATIVE_ID>",
: "https://tracking.brandplus.example/winnotice?ap=${AUCTION_PRICE}",
: "https://tracking.brandplus.example/lossnotice?ap=${AUCTION_PRICE}&al=${AUCTION_LOSS}",
: "<VAST version=\"3.0\"><Ad id=\"dsp-bid-0001\"><InLine><AdTitle>Example Ad</AdTitle><Error><![CDATA[https://tracking.brandplus.example/error?code=[ERRORCODE]]]></Error><AdSystem version=\"1.0\">Verve</AdSystem><Impression><![CDATA[https://tracking.brandplus.example/impression]]></Impression><Impression><![CDATA[https://dsp.example/imp]]></Impression><Creatives><Creative><Linear><Duration>00:00:30.000</Duration><TrackingEvents><Tracking event=\"start\"><![CDATA[https://tracking.brandplus.example/start]]></Tracking><Tracking event=\"firstQuartile\"><![CDATA[https://tracking.brandplus.example/q1]]></Tracking><Tracking event=\"midpoint\"><![CDATA[https://tracking.brandplus.example/mid]]></Tracking><Tracking event=\"thirdQuartile\"><![CDATA[https://tracking.brandplus.example/q3]]></Tracking><Tracking event=\"complete\"><![CDATA[https://tracking.brandplus.example/complete]]></Tracking></TrackingEvents><MediaFiles><MediaFile delivery=\"progressive\" type=\"video/mp4\" bitrate=\"3500\" width=\"1920\" height=\"1080\"><![CDATA[https://cdn.dsp.example/ad_1920x1080.mp4]]></MediaFile></MediaFiles></Linear></Creative></Creatives></InLine></Ad></VAST>",
: ["advertiser.example"],
: "<ADVERTISER_APP_BUNDLE>",
: "https://cdn.dsp.example/companion_1280x720.jpeg",
: "<CAMPAIGN_ID>",
: "https://tracking.brandplus.example/impression?ap=${AUCTION_PRICE}",
: "<CREATIVE_ID>",
: ["IAB9-30"],
: 1280,
: 720,
: 30,
"ext": {
: 30
}
}
]
}
],
: "e1b2c3d4-0000-4000-8000-000000000005",
: "USD"
}2.3.2 Field reference
| Object | Attribute | Type | Status | Description | Notes |
|---|---|---|---|---|---|
| BidResponse | id | string | Required | ID of the bid request to which this is a response. | Echoes your request ID. |
| BidResponse | bidid | string | Required | Bidder generated response ID to assist with logging/tracking. | — |
| BidResponse | cur | string | Required | Bid currency using ISO-4217 alpha codes. | USD. |
| Bid | id | string | Required | Bidder generated bid ID to assist with logging/tracking. | Unique per winning ad, including each ad in a pod. |
| Bid | impid | string | Required | ID of the Imp object in the related bid request. | — |
| Bid | price | float | Required | Bid price expressed as CPM although the actual transaction is for a unit impression only. | USD CPM. |
| Bid | adm | string | Required | Optional means of conveying ad markup in case the bid wins; supersedes the win notice if markup is included in both. | VAST. Brand+ returns the winning DSP's VAST with its own impression, error and tracking events added. |
| Bid | nurl | string | Required | Win notice URL called by the exchange if the bid wins (not necessarily indicative of a delivered, viewed, or billable ad). | — |
| Bid | burl | string | When available | Billing notice URL called by the exchange when a winning bid becomes billable based on exchange-specific business policy. | When configured for your account. |
| Bid | lurl | string | When available | Loss notice URL called by the exchange when a bid is known to have been lost. | When configured for your account. |
| Bid | adid | string | Required | ID of a preloaded ad to be served if the bid wins. | Falls back to crid. |
| Bid | crid | string | Required | Creative ID to assist with ad quality checking. | — |
| Bid | cid | string | When available | Campaign ID to assist with ad quality checking. | From the winning DSP bid. |
| Bid | adomain | string array | When available | Advertiser domain for block list checking. | From the winning DSP bid. |
| Bid | cat | string array | When available | IAB Tech Lab content categories of the creative. The taxonomy is defined by the cattax field. | From the winning DSP bid. |
| Bid | iurl | string | When available | URL without cache-busting to an image that is representative of the content of the campaign, for ad quality/safety checking. | — |
| Bid | bundle | string | When available | The store ID of the app in an app store. | — |
| Bid | attr | integer array | When available | Set of attributes describing the creative. Refer to List: Creative Attributes in AdCOM 1.0. | — |
| Bid | w / h | integer | When available | Width and height of the creative in device-independent pixels (DIPS). | — |
| Bid | dur | integer | When available | Duration of the video or audio creative in seconds. | Also sent as ext.duration. Left out when neither the bid nor its VAST gives a duration. |
| Bid | ext.duration | — | When available | Verve extension. | Creative duration, mirroring dur. |
| Bid | podid | — | When available | Verve extension. The IAB defines podid on the Video object of the request, not on the Bid. | Pod the ad fills; sent for pod requests. OpenRTB 2.6 publishers get podid and ext.podid; 2.5 publishers get ext.podid only. |
| Bid | dealid | string | When available | Reference to the deal.id from the bid request if this bid pertains to a private marketplace direct deal. | Only when deal ID pass-back is enabled for your account. |
| Bid | apis | integer array | When available | List of supported APIs for the markup. If an API is not explicitly listed, it is assumed to be unsupported. | Also sent as ext.apis. |
| Bid | ext.imptrackers | — | When available | Verve extension. | When configured. |
3. Demand partners (Brand+ to DSP)
3.1 Setup
3.1.1 Quick-start checklist
Send these details to your Verve account manager. Verve configures the integration on its side.
3.1.2 Endpoints and regions
Verve sends traffic from the US, EU and APAC. Each DSP can register a separate endpoint per region, and each region sends only to its own endpoint. If no endpoint is registered for a region, that region sends no traffic, so provide an endpoint for every region you want to buy in.
3.1.3 Connection details
Protocol
HTTPS is recommended. HTTP endpoints can also be configured.
Compression
gzip compression of bid requests is available on request.
QPS
Configured individually for each DSP and agreed with Verve. Each publisher ad pod produces one bid request per slot, so request volume scales with pod size.
Timeout
Respond within the tmax value in each bid request.
3.2 Bid request (Brand+ → DSP)
3.2.1 Sample
Brand+ sends the supply chain in source.ext.schain and ext.schain as a JSON-encoded string, with its own node appended.
{
"app": {
: "<STORE_APP_ID>",
: ["IAB24"],
"content": {
: 1,
: "<CONTENT_ID>",
: "TV-PG",
: "en",
"channel": {
: "Example Channel"
},
"ext": {
: "Example Channel",
: "Example Network"
},
: "News",
"network": {
: "Example Network"
},
: {},
: "0",
: 1
},
: "example-ctv-app.com",
"ext": {
: "example-publisher.com"
},
: "<APP_ID>",
"keywords": "App",
: "Example CTV App",
"publisher": {
: "<BRAND_PLUS_PUBLISHER_ID>",
: "Example Publisher"
},
: "https://channelstore.example.com/apps/example-ctv-app"
},
: 1,
: ["IAB23-1", "IAB25-1", "IAB25-2", "IAB25-3", "IAB25-4", "IAB25-5", "IAB25-6", "IAB25-7", "IAB26", "IAB26-1", "IAB26-2", "IAB26-3", "IAB26-4"],
: ["USD"],
"device": {
"carrier": "<ISP>",
: 2,
: 3,
: 0,
: "<MD5_OF_DEVICE_ID>",
: "<SHA1_OF_DEVICE_ID>",
"ext": {
: "rida"
},
: {
"accuracy": 10000,
"city": "<CITY>",
"country": "USA",
"ext": {
"isp": "<ISP>",
"org": "<ISP>"
},
"lat": 0.0,
"lon": 0.0,
"region": "CA",
"type": 2,
"zip": "<ZIP>",
"metro": "<DMA>",
"ipservice": 3
},
"h": 720,
: "00000000-0000-0000-0000-000000000000",
: "192.0.2.1",
"js": 1,
: "en",
: 0,
: "Roku",
: "DVP",
: "Roku OS",
: "16.0",
"pxratio": 0,
: "Roku/DVP-16.0 (16.0.4.842-51)",
"w": 1280
},
"ext": {
"pchain": "<PAYMENT_ID_CHAIN>",
"schain": "{\n \"ver\": \"1.0\",\n \"complete\": 1,\n \"nodes\": [\n {\n \"asi\": \"example-ssp.com\",\n \"sid\": \"<SELLER_ID>\",\n \"hp\": 1\n },\n {\n \"asi\": \"lkqd.net\",\n \"sid\": \"<BRAND_PLUS_PUBLISHER_ID>\",\n \"rid\": \"b1b2c3d4000000000000000000000001\",\n \"hp\": 1\n }\n ]\n}"
},
: "b1b2c3d4000000000000000000000001",
"imp": [
{
: "9.0",
: "USD",
: 6300,
"ext": {
: "<BRAND_PLUS_ADBREAK_ID>",
"hb": 1,
"is_rewarded_inventory": false,
"metric": [
{
"type": "click_through_rate",
"value": 0.01687,
"vendor": "EXCHANGE"
}
]
},
: "b1b2c3d4-0000-0000-0000-000000000002",
: 0,
: [
{
"type": "click_through_rate",
"value": 0.01687,
"vendor": "EXCHANGE"
}
],
: 0,
: 1,
: 3,
: "<BRAND_PLUS_ADBREAK_ID>",
"video": {
: [3, 8, 9, 10, 12, 14, 17],
: 1,
"ext": {
"orientation": "0"
},
: 1,
: 100000,
: 120,
: ["video/mp4", "video/3gpp", "video/H264"],
: 1,
: 1,
: 1,
: 1,
: [1],
: 1,
: 7,
: [2, 3, 5, 6],
: 0,
: -1,
: 1920,
: 1080,
: 1
},
: {
"deals": [
{
: "<DEAL_ID>",
: "9.0",
: 1
}
]
}
}
],
"regs": {
: 0,
"ext": {
"agerange": "0",
: "",
: "0",
: "1YNN"
}
},
"source": {
"ext": {
: "{\n \"ver\": \"1.0\",\n \"complete\": 1,\n \"nodes\": [\n {\n \"asi\": \"example-ssp.com\",\n \"sid\": \"<SELLER_ID>\",\n \"hp\": 1\n },\n {\n \"asi\": \"lkqd.net\",\n \"sid\": \"<BRAND_PLUS_PUBLISHER_ID>\",\n \"rid\": \"b1b2c3d4000000000000000000000001\",\n \"hp\": 1\n }\n ]\n}"
},
: 1,
: "<PAYMENT_ID_CHAIN>",
: "c1b2c3d4-0000-4000-8000-000000000003"
},
: 0,
: 235,
"user": {
"ext": {
: [
{
"source": "example-id.com",
"uids": [
{
"id": "<EID_UID>",
"atype": 3
}
]
}
]
},
: "<USER_ID>",
: [
{
"source": "example-id.com",
"uids": [
{
"id": "<EID_UID>",
"atype": 3
}
]
}
]
}
}3.2.2 Field reference
| Object | Attribute | Type | Status | Description | Notes |
|---|---|---|---|---|---|
| BidRequest | id | string | Required | ID of the bid request, assigned by the exchange, and unique for the exchange's subsequent tracking of the responses. | |
| BidRequest | at | integer | Required | Auction type, where 1 = First Price, 2 = Second Price Plus. | Auction type configured for the DSP (1 = first price). |
| BidRequest | tmax | integer | Required | Maximum time in milliseconds the exchange allows for bids to be received, including Internet latency. | |
| BidRequest | cur | string array | Required | Array of allowed currencies for bids on this bid request using ISO-4217 alpha codes. | Always USD. |
| BidRequest | test | integer | Required | Indicator of test mode in which auctions are not billable, where 0 = live mode, 1 = test mode. | |
| BidRequest | bcat | string array | When available | Blocked advertiser categories using the specified category taxonomy. | Publisher and Brand+ blocks. |
| BidRequest | badv | string array | When available | Block list of advertisers by their domains. | |
| BidRequest | wseat | string array | When available | Allowed list of buyer seats allowed to bid on this impression. | |
| Imp | id | string | Required | A unique identifier for this impression within the context of the bid request. | |
| Imp | tagid | string | Required | Identifier for specific ad placement or ad tag that was used to initiate the auction. | |
| Imp | bidfloor | float | Required | Minimum bid for this impression expressed in CPM. | USD CPM. |
| Imp | bidfloorcur | string | Required | Currency specified using ISO-4217 alpha codes. | |
| Imp | secure | integer | Required | Flag to indicate if the impression requires secure HTTPS URL creative assets and markup, where 0 = non-secure, 1 = secure. | |
| Imp | exp | integer | Required | Advisory as to the number of seconds that may elapse between the auction and the actual impression. | |
| Imp | instl | integer | Required | 1 = the ad is interstitial or full screen, 0 = not interstitial. | |
| Imp | rwdd | integer | Required | Indicates whether the user receives a reward for viewing the ad, where 0 = no, 1 = yes. | |
| Imp | metric | object array | Required | An array of Metric objects. | Exchange-provided metrics, for example estimated CTR. |
| Imp | ssai | integer | When available | Indicates if server-side ad insertion is in use: 0 = unknown, 1 = all client-side, 2 = assets stitched server-side but tracking fired client-side, 3 = all server-side. | Passed through from the publisher's ad request. |
| Imp | pmp | object | When available | A Pmp object containing any private marketplace deals in effect for this impression. | Deals the DSP is eligible for. |
| Deal | id | string | When available | A unique identifier for the direct deal. | |
| Deal | bidfloor | float | When available | Minimum bid for this impression expressed in CPM. | |
| Deal | at | integer | When available | Optional override of the overall auction type of the bid request, where 1 = First Price, 2 = Second Price Plus. | |
| Deal | wseat | string array | When available | Allowed list of buyer seats allowed to bid on this deal. | |
| Imp | ext.gpid | — | Required | Verve extension. | Global placement ID. Sent by default; taken from imp.tagid when the ad request has none. |
| Imp | ext.tid / ext.tidt | — | When available | Verve extension. | Impression-level transaction ID and its type. Sent to DSPs set up for transaction ID enrichment, on long-form video traffic. |
| Video | mimes | string array | Required | Content MIME types supported. | |
| Video | minduration | integer | Required | Minimum video ad duration in seconds. Mutually exclusive with rqddurs. | |
| Video | maxduration | integer | Required | Maximum video ad duration in seconds. Mutually exclusive with rqddurs. | |
| Video | protocols | integer array | Required | Array of supported video protocols. Refer to List: Creative Subtypes - Audio/Video in AdCOM 1.0. | |
| Video | startdelay | integer | Required | Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements. | |
| Video | linearity | integer | Required | Indicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed. | |
| Video | skip | integer | Required | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. | |
| Video | plcmt | integer | Required | Video placement type for the impression. Refer to List: Plcmt Subtypes - Video in AdCOM 1.0. | |
| Video | pos | integer | Required | Ad position on screen. Refer to List: Placement Positions in AdCOM 1.0. | 7 (full screen) for CTV. |
| Video | playbackend | integer | Required | The event that causes playback to end. Refer to List: Playback Cessation Modes in AdCOM 1.0. | |
| Video | w | integer | When available | Width of the video player in device-independent pixels (DIPS). | |
| Video | h | integer | When available | Height of the video player in device-independent pixels (DIPS). | |
| Video | placement | integer | When available | Deprecated as of OpenRTB 2.6-202303. Use plcmt instead. | |
| Video | playbackmethod | integer array | When available | Playback methods that may be in use. If none are specified, any method may be used. | |
| Video | delivery | integer array | When available | Supported delivery methods. If none is specified, assume all are supported. | |
| Video | minbitrate | integer | When available | Minimum bit rate in Kbps. | |
| Video | maxbitrate | integer | When available | Maximum bit rate in Kbps. | |
| Video | battr | integer array | When available | Blocked creative attributes. Refer to List: Creative Attributes in AdCOM 1.0. | |
| Video | boxingallowed | integer | When available | Indicates if letter-boxing of 4:3 content into a 16:9 window is allowed, where 0 = no, 1 = yes. | |
| Video | sequence | integer | When available | Deprecated as of OpenRTB 2.6. Use slotinpod. | Sent for ad pods. |
| Video | ext.podid / ext.podseq / ext.sequence | — | When available | Verve extension. | podid and sequence are sent on every pod slot; podseq only when the publisher sends it. Every slot request built from one pod carries the same imp.video.ext.podid and the same source.tid as the publisher's ad request. |
| Video | ext.slotinpod | — | When available | Verve extension. The position in the pod that this slot's bid is eligible for, from the publisher's `imp.video.slotinpod`. | Sent only when the publisher's ad request states a slot. |
| Video | ext.rqddurs | — | When available | Verve extension. The exact creative durations the publisher accepts, from the publisher's `imp.video.rqddurs`. | Sent only when the publisher sends rqddurs. minduration and maxduration are then narrowed to the lowest and highest rqddurs values. |
| Video | ext.mincpmpersec | — | When available | Verve extension. Minimum CPM per second of ad duration, from the publisher's `imp.video.mincpmpersec`. | Sent only when the publisher sends it. Adjusted by Brand+ in the same way as imp.bidfloor. |
| Video | ext.durfloors | — | When available | Verve extension. Floors by creative duration, from the publisher's `imp.video.durfloors`: a list of duration bands, each with its own floor. | Sent only when the publisher sends them. Adjusted by Brand+ in the same way as imp.bidfloor. |
| App | id | string | Required | Exchange-specific app ID. | |
| App | name | string | Required | App name (may be aliased at the publisher's request). | |
| App | bundle | string | Required | The store ID of the app in an app store. See the OTT/CTV Store Assigned App Identification Guidelines. | |
| App | storeurl | string | Required | App store URL for an installed app; for IQG 2.1 compliance. | |
| App | cat | string array | Required | Array of IAB Tech Lab content categories of the app. The taxonomy is defined by the cattax field. | |
| App | domain | string | When available | Domain of the app. | |
| App | ext.inventorypartnerdomain | — | When available | Verve extension. Domain of the content owner (inventory partner) whose ads.txt authorises the sale. | Sent when the publisher sends it, from app.inventorypartnerdomain (2.6) or app.ext.inventorypartnerdomain (2.5). |
| Publisher | id | string | Required | Exchange-specific seller ID. Corresponds to a seller_id in the exchange's sellers.json file. | Brand+ publisher ID. |
| Publisher | name | string | Required | Seller name (may be aliased at the seller's request). | |
| Publisher | domain | string | When available | Highest level domain of the seller. | |
| Content | id / title / series / season | string | When available | Content ID, title, series and season. | Passed through from the publisher. |
| Content | genre | string | When available | Genre that best describes the content. | |
| Content | cat / cattax | string array / integer | When available | Array of IAB Tech Lab content categories that describe the content, and the taxonomy in use. | |
| Content | contentrating | string | When available | Content rating. | |
| Content | language | string | When available | Content language using ISO-639-1-alpha-2. | |
| Content | len | integer | When available | Length of content in seconds; appropriate for video or audio. | |
| Content | livestream | integer | When available | Method of broadcast of the content: 0 = not scheduled (e.g. VOD or user-initiated), 1 = scheduled (linear viewing). | |
| Content | prodq / context / producer | integer / object | When available | Production quality, type of content, and content producer. | |
| Network | name | string | When available | Network the content is on. | Filled from the publisher's 2.5 ext.network when needed. |
| Channel | name | string | When available | Channel the content is on. | Filled from the publisher's 2.5 ext.channel when needed. |
| Content | ext.network / ext.channel | — | When available | Verve extension. | Kept for DSPs that read the 2.5 extensions. |
| Device | ua | string | Required | Browser user agent string. This field represents a raw user agent string from the browser. | Privacy signals may remove or truncate device data. |
| Device | ifa | string | Required | ID sanctioned for advertiser use in the clear (not hashed). | |
| Device | ext.ifa_type | — | When available | Verve extension. | Passed through when the publisher sends it. For CTV requests without it, Brand+ sets a value based on the platform. |
| Device | devicetype | integer | Required | The general type of device. Refer to List: Device Types in AdCOM 1.0. | |
| Device | make / model / os / osv | string | Required | Device make, model, operating system and operating system version. | |
| Device | lmt | integer | Required | "Limit Ad Tracking" signal commercially endorsed, where 0 = tracking is unrestricted, 1 = tracking must be limited. | |
| Device | dnt | integer | Required | Standard "Do Not Track" flag, where 0 = tracking is unrestricted, 1 = do not track. | |
| Device | language | string | Required | Browser language using ISO-639-1-alpha-2. | |
| Device | connectiontype | integer | When available | Network connection type. Refer to List: Connection Types in AdCOM 1.0. | Sent when present in the ad request or available from an IP lookup. |
| Device | ip | string | When available | IPv4 address closest to device. | |
| Device | ipv6 | string | When available | IP address closest to device as IPv6. | |
| Device | dpidmd5 / dpidsha1 | string | When available | Deprecated as of OpenRTB 2.6. | Sent when present in the ad request. Kept for DSPs that still read them. |
| Device | didmd5 / didsha1 | string | When available | Deprecated as of OpenRTB 2.6. | |
| Device | geo | object | Required | Location of the device assumed to be the user's current location, defined by a Geo object. | country, region, city, zip, lat, lon, type always; metro, accuracy, ipservice, utcoffset when available. |
| User | id | string | Required | Exchange-specific ID for the user. | Brand+ user ID. |
| User | eids | object array | When available | Details for support of a standard protocol for multiple third party identity providers. | Sent only to DSPs set up to receive extended IDs. Also sent as user.ext.eids. |
| Source | fd | integer | Required | Entity responsible for the final impression sale decision, where 0 = exchange, 1 = upstream source. | |
| Source | tid | string | Required | Transaction ID that must be common across all participants in this bid request. | |
| Source | pchain | string | Required | Payment ID chain string containing embedded syntax described in the TAG payment ID Protocol v1.0. | |
| Source | ext.schain | — | Required | 2.5 location of the IAB SupplyChain object (2.6: `source.schain`). | Supply chain with the Brand+ node appended, sent as a JSON-encoded string. Also sent as ext.schain at the top level. |
| Regs | coppa | integer | Required | Flag indicating if this request is subject to the COPPA regulations established by the USA FTC, where 0 = no, 1 = yes. | |
| Regs | gpp / gpp_sid | string / integer array | When available | The Global Privacy Platform's consent string, and the section(s) that apply. | |
| Regs | ext.gdpr / ext.consent / ext.us_privacy | — | Required | 2.5 locations of the IAB `regs.gdpr`, `user.consent` and `regs.us_privacy` fields. | gdpr and consent always; us_privacy when available. |
3.3 Bid response (DSP → Brand+)
3.3.1 Sample
{
: "b1b2c3d4000000000000000000000001",
: "dsp-response-0001",
: [
{
: "<DSP_SEAT_ID>",
: [
{
: "dsp-bid-0001",
: "b1b2c3d4-0000-0000-0000-000000000002",
: 12.5,
: "<CREATIVE_ID>",
: "https://dsp.example/win?price=${AUCTION_PRICE}",
: "https://dsp.example/bill?price=${AUCTION_PRICE}",
: "<VAST version=\"3.0\"><Ad id=\"dsp-bid-0001\"><InLine><AdSystem>Example DSP</AdSystem><AdTitle><![CDATA[Example Ad]]></AdTitle><Impression><![CDATA[https://dsp.example/imp]]></Impression><Creatives><Creative><Linear><Duration>00:00:30.000</Duration><MediaFiles><MediaFile delivery=\"progressive\" width=\"1920\" height=\"1080\" type=\"video/mp4\" bitrate=\"3500\"><![CDATA[https://cdn.dsp.example/ad_1920x1080.mp4]]></MediaFile></MediaFiles></Linear></Creative></Creatives></InLine></Ad></VAST>",
: ["advertiser.example"],
: "<ADVERTISER_APP_BUNDLE>",
: "https://cdn.dsp.example/companion_1280x720.jpeg",
: "<CAMPAIGN_ID>",
: "<CREATIVE_ID>",
: ["IAB9-30"],
: 1280,
: 720,
: 2,
"ext": {}
}
]
}
],
: "USD"
}3.3.2 Field reference
| Object | Attribute | Type | Status | Definition | Notes |
|---|---|---|---|---|---|
| BidResponse | id | string | Required | ID of the bid request to which this is a response. | Echo the bid request id. |
| BidResponse | seatbid | object array | Required to bid | Array of seatbid objects; 1+ required if a bid is to be made. | For no bid, omit or return HTTP 204. |
| BidResponse | bidid | string | Recommended | Bidder generated response ID to assist with logging/tracking. | |
| BidResponse | cur | string | Optional | Bid currency using ISO-4217 alpha codes. | Use USD. |
| BidResponse | nbr | integer | Optional | Reason for not bidding. Refer to List: No-Bid Reason Codes in OpenRTB 3.0. | |
| SeatBid | bid | object array | Required | Array of 1+ Bid objects, each related to an impression. | |
| SeatBid | seat | string | Conditional | ID of the buyer seat on whose behalf this bid is made. | Required when the deal restricts seats (wseat). |
| SeatBid | group | integer | Optional | 0 = impressions can be won individually; 1 = impressions must be won or lost as a group. | |
| Bid | id | string | Required | Bidder generated bid ID to assist with logging/tracking. | |
| Bid | impid | string | Required | ID of the Imp object in the related bid request. | |
| Bid | price | float | Required | Bid price expressed as CPM although the actual transaction is for a unit impression only. | USD CPM, at or above the floor. |
| Bid | adm | string | Required | Optional means of conveying ad markup in case the bid wins; supersedes the win notice if markup is included in both. | Brand+ requires VAST in adm; markup on the win notice is not used. Brand+ reads VAST version, companions and duration from it. |
| Bid | dealid | string | Conditional | Reference to the deal.id from the bid request if this bid pertains to a private marketplace direct deal. | Required when bidding on a deal. |
| Bid | adomain | string array | Recommended | Advertiser domain for block list checking. | Used for advertiser blocking. |
| Bid | crid | string | Recommended | Creative ID to assist with ad quality checking. | |
| Bid | cid | string | Recommended | Campaign ID to assist with ad quality checking. | |
| Bid | cat | string array | Recommended | IAB Tech Lab content categories of the creative. The taxonomy is defined by the cattax field. | |
| Bid | cattax | integer | Recommended | The taxonomy in use. Refer to List: Category Taxonomies. | |
| Bid | nurl | string | Recommended | Win notice URL called by the exchange if the bid wins (not necessarily indicative of a delivered, viewed, or billable ad). | |
| Bid | burl | string | Recommended | Billing notice URL called by the exchange when a winning bid becomes billable based on exchange-specific business policy. | |
| Bid | lurl | string | Optional | Loss notice URL called by the exchange when a bid is known to have been lost. | |
| Bid | dur | integer | Recommended | Duration of the video or audio creative in seconds. | Used when the VAST has no duration, and for pods. |
| Bid | mtype | integer | Recommended | Type of the creative markup: 1 = Banner, 2 = Video, 3 = Audio, 4 = Native. | Use 2 for video. |
| Bid | slotinpod | integer | Optional | Indicates that the bid response is only eligible for a specific position within a video or audio ad pod. | |
| Bid | adid | string | Optional | ID of a preloaded ad to be served if the bid wins. | |
| Bid | iurl | string | Optional | URL without cache-busting to an image that is representative of the content of the campaign, for ad quality/safety checking. | |
| Bid | bundle | string | Optional | The store ID of the app in an app store. | |
| Bid | attr | integer array | Optional | Set of attributes describing the creative. Refer to List: Creative Attributes in AdCOM 1.0. | |
| Bid | apis | integer array | Optional | List of supported APIs for the markup. If an API is not explicitly listed, it is assumed to be unsupported. | |
| Bid | w / h | integer | Optional | Width and height of the creative in device-independent pixels (DIPS). | |
| Bid | exp | integer | Optional | Advisory as to the number of seconds the bidder is willing to wait between the auction and the actual impression. | |
| Bid | ext.imptrackers | — | Optional | Verve extension. | Brand+ fires these on impression. |
4. CTV signals and ad pods
This section covers the signals specific to CTV: what publishers should send for each, and what Brand+ does with it. For individual fields, see the field references in section 2.2.3 (ad request) and section 3.2.2 (bid request).
4.1 Ad pods
A pod is one ad break filled with several ads. Publishers describe the pod in the ad request; Brand+ auctions each slot separately and returns the winning ads together.
| Pod detail | OpenRTB 2.6 |
|---|---|
| Identify the pod | imp.video.podid on every impression in the break. Use one podid per request, and send each ad break in its own request. |
| Dynamic pod length and ad count | maxseq and poddur. maxseq sets the number of ads, up to 20; with poddur but no maxseq, Brand+ allows 5. maxseq alone is enough; with neither, the pod has one slot. Pods larger than 20 ads are cut to 20, not rejected. |
| Ad durations | minduration and maxduration, or rqddurs for exact durations. See 2.2.3 for details. |
| Pod position in the content | podseq. See 2.2.3 for values. |
| Optional | slotinpod, mincpmpersec, durfloors |
| Pod detail | OpenRTB 2.5 |
|---|---|
| Identify the pod | imp.video.ext.podid on every impression in the break. Use one podid per request, and send each ad break in its own request. |
| Dynamic pod length and ad count | imp.video.ext.maxseq and imp.video.ext.poddur |
| Ad durations | minduration and maxduration, plus imp.video.ext.rqddurs for exact durations |
| Pod position in the content | imp.video.ext.podseq |
| Optional | imp.video.ext.slotinpod, imp.video.ext.mincpmpersec and imp.video.ext.durfloors |
Currently, Brand+ sends each slot as its own bid request, with the slot's duration limits and floor. Every slot request is sent in OpenRTB 2.5 form, so by default the pod fields are in imp.video.ext: podid and sequence on every slot (sequence also as imp.video.sequence), and slotinpod, podseq, rqddurs, mincpmpersec and durfloors only when the publisher's request included them. poddur and maxseq are not currently sent to DSPs. When the request has rqddurs, the outgoing minduration and maxduration are narrowed to the lowest and highest rqddurs values. Every slot request built from one pod carries the same imp.video.ext.podid and the same source.tid as the publisher's ad request, so DSPs can link the slots of a pod.
On every slot
podidsequenceOnly when the publisher's request included them
slotinpodpodseqrqddursmincpmpersecdurfloorsNot currently sent to DSPs
poddurmaxseqSamples: 2.2.2 shows an OpenRTB 2.6 dynamic pod request.
5. Macros and tracking
${AUCTION_PRICE}Clearing price, in the response currency
${AUCTION_MIN_TO_WIN}Estimated minimum price to win. Sent in the DSP's lurl when loss notices are enabled for the account.
${AUCTION_LOSS}OpenRTB loss reason code
[ERRORCODE]VAST error code, in VAST Error URLs
6. Enum reference
| Field | Values |
|---|---|
device.devicetype | 1Mobile/Tablet2PC3Connected TV4Phone5Tablet6Connected device7Set-top box8Out-of-home |
imp.video.plcmt | 1In-stream2Accompanying content3Interstitial4No content / standalone |
imp.video.protocols | 1VAST 1.02VAST 2.03VAST 3.04VAST 1.0 Wrapper5VAST 2.0 Wrapper6VAST 3.0 Wrapper7VAST 4.08VAST 4.0 Wrapper |
imp.video.startdelay | Greater than 0mid-roll at that many seconds0pre-roll-1generic mid-roll-2generic post-roll |
imp.ssai | 0Unknown1All client-side2Assets stitched server-side, tracking client-side3All server-side |
device.connectiontype | 0Unknown1Ethernet2Wi-Fi3Cellular (unknown generation)42G53G64G75G |
bid.mtype | 1Banner2Video3Audio4Native |
Updated 2 days ago

