sequenceDiagram
participant P as Publisher / SSP
participant B as Brand+
participant D as DSP
P->>B: 1. Ad request (OpenRTB 2.5 or 2.6)
B->>D: 2. Bid request (one per DSP, one per pod slot)
D-->>B: 3. Bid response (VAST in adm)
B-->>P: 4. Ad response (winning VAST + Brand+ tracking)
Some partners get a dedicated endpoint instead; your Verve account manager will share it. No token goes in the URL: requests are identified by app.publisher.id and imp.tagid.
Connection requirements
Connection
Requirement
Protocol
HTTPS. All published endpoints use HTTPS.
Compression
gzip-encoded requests are accepted (Content-Encoding: gzip).
QPS
Agreed individually with each partner.
Timeout
Set tmax to the time you allow Verve to respond, in milliseconds.
[!CAUTION]
Requests are rejected with HTTP 422 when regs.coppa = 1; when no usable public IP is available (device.ip, device.ipv6 and the connection’s IP are all missing, private or reserved); or when the user is under 14.
2.2 Ad request
Your player or SSP asks Brand+ for an ad: one HTTPS POST containing an OpenRTB bid request. Send a whole ad pod as one request (see Ad pods).
Required at a glance:BidRequest.id, BidRequest.imp, BidRequest.app, BidRequest.device, BidRequest.at, Imp.id, Imp.video, Imp.tagid, Video.mimes, Video.minduration, Video.maxduration, Publisher.id
BidRequest (10 fields, 5 required)
Field
Type
Requirement
What it is
Brand+ rule
id
string
🔴 Required
ID of the bid request, assigned by the exchange, and unique for the exchange’s subsequent tracking of the responses.
imp
object array
🔴 Required
Array of Imp objects representing the impressions offered.
app
object
🔴 Required
Details via an App object about the publisher’s app.
Rejected if neither app nor site is sent. CTV uses app.
device
object
🔴 Required
Details via a Device object about the user’s device to which the impression will be delivered.
user
object
🔵 Recommended
Details via a User object about the human user of the device; the advertising audience.
at
integer
🔴 Required
Auction type, where 1 = First Price, 2 = Second Price Plus.
Brand+ runs first-price auctions only: send 1.
tmax
integer
🔵 Recommended
Maximum time in milliseconds the exchange allows for bids to be received, including Internet latency.
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.
bcat
string array
⚪ Optional
Blocked advertiser categories using the specified category taxonomy.
badv
string array
⚪ Optional
Block list of advertisers by their domains.
Source (4 fields)
Field
Type
Requirement
What it is
Brand+ rule
fd
integer
🔵 Recommended
Entity responsible for the final impression sale decision, where 0 = exchange, 1 = upstream source.
tid
string
🔵 Recommended
Transaction ID that must be common across all participants in this bid request.
pchain
string
🔵 Recommended
Payment ID chain string containing embedded syntax described in the TAG payment ID Protocol v1.0.
schain
object
⚪ Optional
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 (11 fields, 3 required)
Field
Type
Requirement
What it is
Brand+ rule
id
string
🔴 Required
A unique identifier for this impression within the context of the bid request.
video
object
🔴 Required
A Video object; required if this impression is offered as a video ad opportunity.
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.
bidfloor
float
🔵 Recommended
Minimum bid for this impression expressed in CPM.
bidfloorcur
string
🔵 Recommended
Currency specified using ISO-4217 alpha codes.
Use USD.
secure
integer
🔵 Recommended
Flag to indicate if the impression requires secure HTTPS URL creative assets and markup, where 0 = non-secure, 1 = secure.
displaymanager
string
🔵 Recommended
Name of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps.
displaymanagerver
string
🔵 Recommended
Version of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps.
exp
integer
⚪ Optional
Advisory as to the number of seconds that may elapse between the auction and the actual impression.
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.
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.
OpenRTB 2.6.
Video (25 fields, 3 required)
Field
Type
Requirement
What it is
Brand+ rule
mimes
string array
🔴 Required
Content MIME types supported.
minduration
integer
🔴 Required in 2.5, optional in 2.6
Minimum video ad duration in seconds. Mutually exclusive with rqddurs.
In 2.6, send either min/maxduration or rqddurs.
maxduration
integer
🔴 Required in 2.5, optional in 2.6
Maximum video ad duration in seconds. Mutually exclusive with rqddurs.
In 2.6, send either min/maxduration or rqddurs.
rqddurs
integer array
⚪ Optional
Precise acceptable durations for video creatives in seconds. Targets the Live TV use case.
OpenRTB 2.6. Use instead of min/maxduration.
protocols
integer array
🔵 Recommended
Array of supported video protocols. Refer to List: Creative Subtypes - Audio/Video in AdCOM 1.0.
w
integer
🔵 Recommended
Width of the video player in device-independent pixels (DIPS).
h
integer
🔵 Recommended
Height of the video player in device-independent pixels (DIPS).
startdelay
integer
🔵 Recommended
Indicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements.
plcmt
integer
🔵 Recommended
Video placement type for the impression. Refer to List: Plcmt Subtypes - Video in AdCOM 1.0.
Use 1 (instream) for CTV.
placement
integer
⚪ Optional
Deprecated as of OpenRTB 2.6-202303. Use plcmt instead.
Send plcmt instead; keep placement only for older integrations.
linearity
integer
🔵 Recommended
Indicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed.
skip
integer
🔵 Recommended
Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes.
playbackmethod
integer array
⚪ Optional
Playback methods that may be in use. If none are specified, any method may be used.
delivery
integer array
⚪ Optional
Supported delivery methods. If none specified, assume all are supported.
minbitrate
integer
⚪ Optional
Minimum bit rate in Kbps.
maxbitrate
integer
⚪ Optional
Maximum bit rate in Kbps.
battr
integer array
⚪ Optional
Blocked creative attributes. Refer to List: Creative Attributes in AdCOM 1.0.
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).
podid
string
⚪ Optional
Unique identifier indicating that an impression opportunity belongs to a video ad pod.
OpenRTB 2.6. Required for ad pods.
podseq
integer
🔵 Recommended for pods
The sequence (position) of the video ad pod within a content stream.
OpenRTB 2.6.
poddur
integer
⚪ Optional
Total amount of time in seconds that advertisers may fill for a dynamic video ad pod, or the dynamic portion of a hybrid pod.
OpenRTB 2.6. Required for dynamic or hybrid pods.
maxseq
integer
🔵 Recommended for pods
Maximum number of ads that may be served into a dynamic video ad pod.
OpenRTB 2.6.
poddedupe
enum array
⚪ Optional
Indicates pod deduplication settings that will be applied to bid responses.
OpenRTB 2.6.
slotinpod
integer
⚪ Optional
For video ad pods, indicates that the seller can guarantee delivery against the indicated slot position in the pod.
OpenRTB 2.6.
mincpmpersec
float
⚪ Optional
Minimum CPM per second. A price floor for the dynamic portion of a video ad pod, relative to bid duration.
OpenRTB 2.6.
App (7 fields)
Field
Type
Requirement
What it is
Brand+ rule
id
string
🔵 Recommended
Exchange-specific app ID.
name
string
🔵 Recommended
App name (may be aliased at the publisher’s request).
bundle
string
🔵 Recommended
The store ID of the app in an app store. See the OTT/CTV Store Assigned App Identification Guidelines.
storeurl
string
🔵 Recommended
App store URL for an installed app; for IQG 2.1 compliance.
cat
string array
⚪ Optional
Array of IAB Tech Lab content categories of the app. The taxonomy is defined by the cattax field.
domain
string
⚪ Optional
Domain of the app.
ext.inventorypartnerdomain(Verve ext)
—
🔵 Recommended
Domain of the partner whose app-ads.txt authorises the sale.
Forwarded to DSPs.
Publisher (1 field, 1 required)
Field
Type
Requirement
What it is
Brand+ rule
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 (17 fields)
Field
Type
Requirement
What it is
Brand+ rule
id
string
🔵 Recommended
Publisher-provided ID uniquely identifying the content.
title
string
🔵 Recommended
Content title.
series
string
⚪ Optional
Content series.
season
string
⚪ Optional
Content season.
episode
integer
⚪ Optional
Episode number.
genre
string
🔵 Recommended
Genre that best describes the content.
cat
string array
🔵 Recommended
Array of IAB Tech Lab content categories that describe the content.
cattax
integer
🔵 Recommended
The taxonomy in use. Refer to List: Category Taxonomies in AdCOM 1.0.
contentrating
string
🔵 Recommended
Content rating.
livestream
integer
🔵 Recommended
Method of broadcast of the content: 0 = not scheduled (e.g. VOD or user-initiated), 1 = scheduled (linear viewing).
language
string
🔵 Recommended
Content language using ISO-639-1-alpha-2. Only one of language or langb should be present.
len
integer
🔵 Recommended
Length of content in seconds; appropriate for video or audio.
prodq
integer
⚪ Optional
Production quality. Refer to List: Production Qualities in AdCOM 1.0.
context
integer
⚪ Optional
Type of content (game, video, text, etc.). Refer to List: Content Contexts in AdCOM 1.0.
producer
object
⚪ Optional
Details about the content Producer.
ext.network(Verve ext)
—
🔵 Recommended
Verve extension.
OpenRTB 2.5: network name.
ext.channel(Verve ext)
—
🔵 Recommended
Verve extension.
OpenRTB 2.5: channel name.
Network (1 field)
Field
Type
Requirement
What it is
Brand+ rule
name
string
🔵 Recommended
Network the content is on.
OpenRTB 2.6, as content.network.name.
Channel (1 field)
Field
Type
Requirement
What it is
Brand+ rule
name
string
🔵 Recommended
Channel the content is on.
OpenRTB 2.6, as content.channel.name.
Device (16 fields)
Field
Type
Requirement
What it is
Brand+ rule
ua
string
🔵 Recommended
Browser user agent string. This field represents a raw user agent string from the browser.
sua
object
🔵 Recommended
Structured user agent information defined by a UserAgent object.
OpenRTB 2.6.
ip
string
🔵 Recommended
IPv4 address closest to device.
ipv6
string
⚪ Optional
IP address closest to device as IPv6.
geo
object
🔵 Recommended
Location of the device assumed to be the user’s current location, defined by a Geo object.
devicetype
integer
🔵 Recommended
The general type of device. Refer to List: Device Types in AdCOM 1.0.
3 = connected TV, 7 = set-top box.
make
string
🔵 Recommended
Device make.
model
string
🔵 Recommended
Device model.
os
string
🔵 Recommended
Device operating system.
osv
string
🔵 Recommended
Device operating system version.
ifa
string
🔵 Recommended
ID sanctioned for advertiser use in the clear (not hashed).
ext.ifa_type(Verve ext)
—
🔵 Recommended
Verve extension.
IFA type, for example tifa or rida.
lmt
integer
🔵 Recommended
“Limit Ad Tracking” signal commercially endorsed, where 0 = tracking is unrestricted, 1 = tracking must be limited.
dnt
integer
🔵 Recommended
Standard “Do Not Track” flag, where 0 = tracking is unrestricted, 1 = do not track.
language
string
⚪ Optional
Browser language using ISO-639-1-alpha-2.
connectiontype
integer
⚪ Optional
Network connection type. Refer to List: Connection Types in AdCOM 1.0.
User (4 fields)
Field
Type
Requirement
What it is
Brand+ rule
id
string
🔵 Recommended
Exchange-specific ID for the user.
Send id or buyeruid.
buyeruid
string
🔵 Recommended
Buyer-specific ID for the user as mapped by the exchange for the buyer.
Send id or buyeruid.
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.
consent
string
⚪ Optional
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 (5 fields)
Field
Type
Requirement
What it is
Brand+ rule
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.
gdpr
integer
⚪ Optional
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.
us_privacy
string
⚪ Optional
Communicates signals regarding consumer privacy under US privacy regulation.
Required where US privacy laws apply. On 2.5, send as regs.ext.us_privacy.
gpp
string
⚪ Optional
Contains the Global Privacy Platform’s consent string.
Required where GPP applies.
gpp_sid
integer array
⚪ Optional
Array of the section(s) of the GPP string which should be applied for this transaction.
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.
Checklist. Send these to your Verve account manager; Verve configures the integration on its side.
Your CTV endpoint URLs (test and production) for each region you want traffic from.
Your requested QPS.
Whether your endpoints use HTTPS or HTTP.
Whether you want gzip-compressed bid requests.
[!IMPORTANT]
Verve sends traffic from the US, EU and APAC, and each region sends only to its own registered endpoint. If no endpoint is registered for a region, that region sends you no traffic.
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.
Timeout
Respond within the tmax value in each bid request.
3.2 Bid request
Brand+ turns the publisher’s ad request into a bid request for each DSP. On the way it:
appends its own node to the supply chain, sent as a JSON-encoded string in source.ext.schain and top-level ext.schain;
adds imp.ext.gpid, taken from imp.tagid when the ad request has none;
splits a pod into one OpenRTB 2.5 request per slot, with pod details in imp.video.ext;
A pod is one ad break filled with several ads. Publishers describe the whole break in one ad request; Brand+ auctions each slot separately and returns the winning ads together.
flowchart LR
R["Ad request<br/>one impression<br/>podid, poddur, maxseq"] --> B["Brand+<br/>splits into slots"]
B --> S1["Slot 1<br/>2.5 bid request"]
B --> S2["Slot 2<br/>2.5 bid request"]
B --> S3["Slot 3<br/>2.5 bid request"]
S1 --> D["DSPs"]
S2 --> D
S3 --> D
D -.-> A["Ad response<br/>one Bid per winning ad<br/>with podid and dur"]
How Brand+ reads your pod
You send
Brand+ creates
maxseq
That many slots, up to 20. Larger pods are cut to 20, not rejected.
poddur without maxseq
5 slots
Neither
1 slot
Missing value
Brand+ assumes
Pod duration (poddur)
120 seconds
A slot’s maximum ad duration (maxduration)
31 seconds
Slot floor: Brand+ uses the first of these that you send:
imp.bidfloor
the lowest durfloors band that overlaps the slot’s durations
mincpmpersec × the slot’s shortest ad duration
Where both are sent, native 2.6 pod fields take precedence over their ext equivalents.
Pod fields by version
Pod detail
OpenRTB 2.6
OpenRTB 2.5
Identify the pod
imp.video.podid on every impression in the break
imp.video.ext.podid on every impression in the break
Dynamic pod length and ad count
maxseq and poddur
imp.video.ext.maxseq and imp.video.ext.poddur
Ad durations
minduration and maxduration, or rqddurs for exact durations
minduration and maxduration
Pod position in the content
podseq
imp.video.ext.podseq
Optional
slotinpod, mincpmpersec, durfloors
imp.video.ext.slotinpod, ext.mincpmpersec, ext.durfloors. Use 2.6 for these.
What DSPs receive
One OpenRTB 2.5 bid request per slot, with the slot’s duration limits and floor. 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 sent them. poddur and maxseq are never sent to DSPs. When the request has rqddurs, the outgoing minduration and maxduration narrow to its lowest and highest values.
What publishers get back
Each winning ad is a separate Bid on the impression it fills, carrying podid and dur. In a dynamic pod, all winning ads share that impression’s impid. 2.6 publishers get bid.podid and bid.ext.podid; 2.5 publishers get bid.ext.podid only. dur is also sent as bid.ext.duration; both are left out when neither the bid nor its VAST gives a duration. slotinpod comes back only where the request stated a slot.
[!WARNING] Check dur before placing an ad. Brand+ ranks bids in a slot by price per second rather than total price, and can move a runner-up into a slot that received no bids. It doesn’t reject a bid whose duration is outside the slot’s limits, doesn’t order the ads, and doesn’t keep same-advertiser ads out of adjacent slots. Your ad server places the winning ads in the break.
Brand+ rejects the request when regs.coppa is 1, when there’s no usable public IP (device.ip, device.ipv6 and the connection’s IP are all missing, private or reserved), or when the user is under 14.
My request is rejected and I send cur
If you send cur, it must include USD. Add USD or leave cur out.
My 2.5 or 2.6 fields seem to be ignored
Check the x-openrtb-version header. Without it, the request is processed as OpenRTB 2.3. Also check fields are where your version expects them; see 2.5 vs 2.6.
I sent a pod but get only one ad back
Identify the pod with imp.video.podid (2.6) or imp.video.ext.podid (2.5); sequence doesn’t identify a pod. Send maxseq, poddur or both: with neither, the pod has one slot.
An ad is longer than my slot allows
Brand+ doesn’t reject bids for duration. Check bid.dur (or bid.ext.duration) before placing each ad.
Deal IDs are missing from the ad response
Deal ID pass-back is enabled per account. Ask your Verve account manager.
DSPs
We get no traffic from a region
Each region sends only to its own registered endpoint. Register one for every region you want to buy in.
Our bid won but the ad didn’t render
Brand+ requires VAST in bid.adm. Markup returned on the win notice isn’t used.
We don’t see extended IDs (eids)
user.eids is sent only to DSPs set up to receive extended IDs. Ask your account manager.
Our deal bids are rejected
Include dealid when bidding on a deal, include seat when the deal restricts seats with wseat, and bid at or above the floor in USD CPM.
| Ad pod | One ad break filled with several ads in a row, described in a single ad request. A dynamic pod lets the auction decide how many ads fill the break, up to a total duration (poddur) and ad count (maxseq). |
| AdBreak ID | Your Brand+ (SPX) identifier for an ad placement. Sent in imp.tagid. |
| Brand+ (B+) | Verve’s marketplace for brand and CTV advertising. |
| CPM | Cost per mille: the price for 1,000 impressions. Brand+ prices and floors are USD CPM. |
| CTV | Connected TV: video watched on a TV through an internet-connected device, such as a smart TV, Roku or other streaming player. |
| DSP | Demand-side platform: the system advertisers use to bid on impressions. |
| First-price auction | The highest bidder wins and pays its own bid. Brand+ runs first-price auctions only (at = 1). |
| Floor | The minimum price a bid must meet, set in imp.bidfloor or, for pods, durfloors and mincpmpersec. |
| IFA | Identifier for advertising: the device’s resettable advertising ID, such as Roku’s RIDA or Samsung’s TIFA. Its type goes in device.ext.ifa_type. |
| Inventory partner domain | The domain of the partner whose app-ads.txt authorises selling the app’s inventory. |
| OpenRTB | The IAB Tech Lab protocol for real-time bidding. Brand+ supports versions 2.5 and 2.6. |
| SSAI | Server-side ad insertion: ads are stitched into the video stream on a server rather than played by the device. imp.ssai says where ad events fire. |
| SSP | Supply-side platform: the system publishers use to sell their inventory. |
| Supply chain (schain) | A list of every company that handled the request on its way to the buyer. Brand+ appends its own node before sending to DSPs. |
| tmax | The time, in milliseconds, allowed for a response to a request. |
| VAST | Video Ad Serving Template: the XML format that carries a video ad’s media files and tracking URLs. |
| VAST InLine and Wrapper | An InLine VAST contains the ad itself. A Wrapper VAST points to another VAST elsewhere, adding its own tracking along the way. |