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.

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

ItemSupport
OpenRTB2.5 and 2.6
Ad markupVAST InLine and Wrapper (protocols as listed in each request)
AuctionFirst price only (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.

Required

Brand+ rejects the request, or ignores the bid, without it.

Conditional

Required in the situation described, for example GDPR or ad pods.

Recommended

Not required, but improves fill, pricing or compliance.

Optional

Supported; send it if you have it.

Required

Brand+ includes the field in every message.

When available

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

ItemWhat to do
0 of 5 done

2.1.2 Endpoints

RegionEndpoint
US Easthttps://ortb26-us-east-1.ad.smaato.net/oapi/exchange/ortb26
EU Westhttps://ortb26-eu-west-1.ad.smaato.net/oapi/exchange/ortb26
APAChttps://ortb26-ap-southeast-1.ad.smaato.net/oapi/exchange/ortb26

Some 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 tmax to the time you allow Verve to respond, in milliseconds.
HTTP 422
Rejected requests

Requests are rejected (HTTP 422)

Tick what applies to a requestNone of these apply

2.2 Ad request (publisher → Brand+)

2.2.1 Sample

JSONHover an underlined field for details. Click it to open its row in the field reference.Field reference (2.2.3)
{
  : "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.

JSONHover an underlined field for details. Click it to open its row in the field reference.Field reference (2.2.3)
{
  : "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

Showing 103 of 103 fields
StatusWhat the statuses mean (1.4)
ObjectAttributeTypeStatusDescriptionNote
BidRequestidstringRequiredID of the bid request, assigned by the exchange, and unique for the exchange's subsequent tracking of the responses.Rejected if missing.
BidRequestimpobject arrayRequiredArray of Imp objects representing the impressions offered.Rejected if missing.
BidRequestappobjectRequiredDetails via an App object about the publisher's app.Rejected if neither app nor site is sent. CTV uses app.
BidRequestdeviceobjectRequiredDetails via a Device object about the user's device to which the impression will be delivered.Rejected if missing.
BidRequestuserobjectRecommendedDetails via a User object about the human user of the device; the advertising audience.
BidRequestatintegerRequiredAuction type, where 1 = First Price, 2 = Second Price Plus.Brand+ runs first-price auctions only: send 1.
BidRequesttmaxintegerRecommendedMaximum time in milliseconds the exchange allows for bids to be received, including Internet latency.
BidRequestcurstring arrayOptionalArray of allowed currencies for bids on this bid request using ISO-4217 alpha codes.If sent, must include USD, otherwise the request is rejected.
BidRequestbcatstring arrayOptionalBlocked advertiser categories using the specified category taxonomy.
BidRequestbadvstring arrayOptionalBlock list of advertisers by their domains.
SourcefdintegerRecommendedEntity responsible for the final impression sale decision, where 0 = exchange, 1 = upstream source.
SourcetidstringRecommendedTransaction ID that must be common across all participants in this bid request.
SourcepchainstringRecommendedPayment ID chain string containing embedded syntax described in the TAG payment ID Protocol v1.0.
SourceschainobjectConditionalThe 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.
ImpidstringRequiredA unique identifier for this impression within the context of the bid request.
ImpvideoobjectRequiredA Video object; required if this impression is offered as a video ad opportunity.
ImptagidstringRequiredIdentifier 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.
ImpbidfloorfloatRecommendedMinimum bid for this impression expressed in CPM.
ImpbidfloorcurstringRecommendedCurrency specified using ISO-4217 alpha codes.Use USD.
ImpsecureintegerRecommendedFlag to indicate if the impression requires secure HTTPS URL creative assets and markup, where 0 = non-secure, 1 = secure.
ImpdisplaymanagerstringRecommendedName of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps.
ImpdisplaymanagerverstringRecommendedVersion of ad mediation partner, SDK technology, or player responsible for rendering ad. Recommended for video and/or apps.
ImpexpintegerOptionalAdvisory as to the number of seconds that may elapse between the auction and the actual impression.
ImppmpobjectOptionalA 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.
ImpssaiintegerRecommendedIndicates 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.
Videomimesstring arrayRequiredContent MIME types supported.
VideomindurationintegerRequired (2.5)
Conditional (2.6)
Minimum video ad duration in seconds. Mutually exclusive with rqddurs.In 2.6, send either min/maxduration or rqddurs.
VideomaxdurationintegerRequired (2.5)
Conditional (2.6)
Maximum video ad duration in seconds. Mutually exclusive with rqddurs.In 2.6, send either min/maxduration or rqddurs.
Videorqddursinteger arrayConditionalPrecise 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
Videoprotocolsinteger arrayRecommendedArray of supported video protocols. Refer to List: Creative Subtypes - Audio/Video in AdCOM 1.0.
VideowintegerRecommendedWidth of the video player in device-independent pixels (DIPS).
VideohintegerRecommendedHeight of the video player in device-independent pixels (DIPS).
VideostartdelayintegerRecommendedIndicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements.
VideoplcmtintegerRecommendedVideo placement type for the impression. Refer to List: Plcmt Subtypes - Video in AdCOM 1.0.Use 1 (instream) for CTV.
VideoplacementintegerOptionalDeprecated as of OpenRTB 2.6-202303. Use plcmt instead.Send plcmt instead; keep placement only for older integrations.
VideolinearityintegerRecommendedIndicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed.
VideoskipintegerRecommendedIndicates if the player will allow the video to be skipped, where 0 = no, 1 = yes.
Videoplaybackmethodinteger arrayOptionalPlayback methods that may be in use. If none are specified, any method may be used.
Videodeliveryinteger arrayOptionalSupported delivery methods. If none specified, assume all are supported.
VideominbitrateintegerOptionalMinimum bit rate in Kbps.
VideomaxbitrateintegerOptionalMaximum bit rate in Kbps.
Videobattrinteger arrayOptionalBlocked creative attributes. Refer to List: Creative Attributes in AdCOM 1.0.
VideosequenceintegerOptionalDeprecated 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.
VideopodidstringConditionalUnique 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.
VideopodseqintegerRecommended (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.
VideopoddurintegerConditionalTotal 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.
VideomaxseqintegerRecommended (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.
Videopoddedupeenum arrayOptionalIndicates 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).
VideoslotinpodintegerOptionalFor 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).
VideomincpmpersecfloatOptionalMinimum 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.
Videodurfloorsobject arrayOptionalFloors 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.
AppidstringRecommendedExchange-specific app ID.
AppnamestringRecommendedApp name (may be aliased at the publisher's request).
AppbundlestringRecommendedThe store ID of the app in an app store. See the OTT/CTV Store Assigned App Identification Guidelines.
AppstoreurlstringRecommendedApp store URL for an installed app; for IQG 2.1 compliance.
Appcatstring arrayOptionalArray of IAB Tech Lab content categories of the app. The taxonomy is defined by the cattax field.
AppdomainstringOptionalDomain of the app.
Appinventorypartnerdomain / ext.inventorypartnerdomain—ConditionalDomain 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.
PublisheridstringRequiredExchange-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.
ContentidstringRecommendedPublisher-provided ID uniquely identifying the content.
ContenttitlestringRecommendedContent title.
ContentseriesstringOptionalContent series.
ContentseasonstringOptionalContent season.
ContentepisodeintegerOptionalEpisode number.
ContentgenrestringRecommendedGenre that best describes the content.
Contentcatstring arrayRecommendedArray of IAB Tech Lab content categories that describe the content.
ContentcattaxintegerRecommendedThe taxonomy in use. Refer to List: Category Taxonomies in AdCOM 1.0.
ContentcontentratingstringRecommendedContent rating.
ContentlivestreamintegerRecommendedMethod 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.
ContentlanguagestringRecommendedContent language using ISO-639-1-alpha-2. Only one of language or langb should be present.
ContentlenintegerRecommendedLength of content in seconds; appropriate for video or audio.
ContentprodqintegerOptionalProduction quality. Refer to List: Production Qualities in AdCOM 1.0.
ContentcontextintegerOptionalType of content (game, video, text, etc.). Refer to List: Content Contexts in AdCOM 1.0.
ContentproducerobjectOptionalDetails about the content Producer.
NetworknamestringRecommendedNetwork the content is on.2.6, as content.network.name.
ChannelnamestringRecommendedChannel the content is on.2.6, as content.channel.name.
Contentext.network—RecommendedVerve extension.2.5: network name.
Contentext.channel—RecommendedVerve extension.2.5: channel name.
DeviceuastringRecommendedBrowser user agent string. This field represents a raw user agent string from the browser.
DevicesuaobjectRecommendedStructured user agent information defined by a UserAgent object.2.6.
DeviceipstringRecommendedIPv4 address closest to device.
Deviceipv6stringOptionalIP address closest to device as IPv6.
DevicegeoobjectRecommendedLocation of the device assumed to be the user's current location, defined by a Geo object.
DevicedevicetypeintegerRecommendedThe general type of device. Refer to List: Device Types in AdCOM 1.0.3 = connected TV, 7 = set-top box.
DevicemakestringRecommendedDevice make.
DevicemodelstringRecommendedDevice model.
DeviceosstringRecommendedDevice operating system.
DeviceosvstringRecommendedDevice operating system version.
DeviceifastringRecommendedID sanctioned for advertiser use in the clear (not hashed).
Deviceext.ifa_type—RecommendedVerve extension.IFA type, for example tifa or rida.
DevicelmtintegerRecommended"Limit Ad Tracking" signal commercially endorsed, where 0 = tracking is unrestricted, 1 = tracking must be limited.
DevicedntintegerRecommendedStandard "Do Not Track" flag, where 0 = tracking is unrestricted, 1 = do not track.
DevicelanguagestringOptionalBrowser language using ISO-639-1-alpha-2.
DeviceconnectiontypeintegerOptionalNetwork connection type. Refer to List: Connection Types in AdCOM 1.0.
UseridstringRecommendedExchange-specific ID for the user.Send id or buyeruid.
UserbuyeruidstringRecommendedBuyer-specific ID for the user as mapped by the exchange for the buyer.Send id or buyeruid.
Usereidsobject arrayRecommendedDetails for support of a standard protocol for multiple third party identity providers.On 2.5, send as user.ext.eids.
RegscoppaintegerOptionalFlag 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.
RegsgdprintegerConditionalWhether 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.
Regsus_privacystringConditionalCommunicates signals regarding consumer privacy under US privacy regulation.Required where US privacy laws apply. On 2.5, send as regs.ext.us_privacy.
RegsgppstringConditionalContains the Global Privacy Platform's consent string.Required where GPP applies.
Regsgpp_sidinteger arrayConditionalArray 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.

JSONHover an underlined field for details. Click it to open its row in the field reference.Field reference (2.3.2)
{
  : "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

Showing 25 of 25 fields
StatusWhat the statuses mean (1.4)
ObjectAttributeTypeStatusDescriptionNotes
BidResponseidstringRequiredID of the bid request to which this is a response.Echoes your request ID.
BidResponsebididstringRequiredBidder generated response ID to assist with logging/tracking.—
BidResponsecurstringRequiredBid currency using ISO-4217 alpha codes.USD.
BididstringRequiredBidder generated bid ID to assist with logging/tracking.Unique per winning ad, including each ad in a pod.
BidimpidstringRequiredID of the Imp object in the related bid request.—
BidpricefloatRequiredBid price expressed as CPM although the actual transaction is for a unit impression only.USD CPM.
BidadmstringRequiredOptional 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.
BidnurlstringRequiredWin notice URL called by the exchange if the bid wins (not necessarily indicative of a delivered, viewed, or billable ad).—
BidburlstringWhen availableBilling notice URL called by the exchange when a winning bid becomes billable based on exchange-specific business policy.When configured for your account.
BidlurlstringWhen availableLoss notice URL called by the exchange when a bid is known to have been lost.When configured for your account.
BidadidstringRequiredID of a preloaded ad to be served if the bid wins.Falls back to crid.
BidcridstringRequiredCreative ID to assist with ad quality checking.—
BidcidstringWhen availableCampaign ID to assist with ad quality checking.From the winning DSP bid.
Bidadomainstring arrayWhen availableAdvertiser domain for block list checking.From the winning DSP bid.
Bidcatstring arrayWhen availableIAB Tech Lab content categories of the creative. The taxonomy is defined by the cattax field.From the winning DSP bid.
BidiurlstringWhen availableURL without cache-busting to an image that is representative of the content of the campaign, for ad quality/safety checking.—
BidbundlestringWhen availableThe store ID of the app in an app store.—
Bidattrinteger arrayWhen availableSet of attributes describing the creative. Refer to List: Creative Attributes in AdCOM 1.0.—
Bidw / hintegerWhen availableWidth and height of the creative in device-independent pixels (DIPS).—
BiddurintegerWhen availableDuration 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.
Bidext.duration—When availableVerve extension.Creative duration, mirroring dur.
Bidpodid—When availableVerve 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.
BiddealidstringWhen availableReference 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.
Bidapisinteger arrayWhen availableList of supported APIs for the markup. If an API is not explicitly listed, it is assumed to be unsupported.Also sent as ext.apis.
Bidext.imptrackers—When availableVerve extension.When configured.

3. Demand partners (Brand+ to DSP)

3.1 Setup

3.1.1 Quick-start checklist

ItemWhat to do
0 of 4 done

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.

USSends only to its own endpoint
EUSends only to its own endpoint
APACSends only to its own endpoint

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.

JSONHover an underlined field for details. Click it to open its row in the field reference.Field reference (3.2.2)
{
  "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

Showing 94 of 94 fields
StatusWhat the statuses mean (1.4)
ObjectAttributeTypeStatusDescriptionNotes
BidRequestidstringRequiredID of the bid request, assigned by the exchange, and unique for the exchange's subsequent tracking of the responses.
BidRequestatintegerRequiredAuction type, where 1 = First Price, 2 = Second Price Plus.Auction type configured for the DSP (1 = first price).
BidRequesttmaxintegerRequiredMaximum time in milliseconds the exchange allows for bids to be received, including Internet latency.
BidRequestcurstring arrayRequiredArray of allowed currencies for bids on this bid request using ISO-4217 alpha codes.Always USD.
BidRequesttestintegerRequiredIndicator of test mode in which auctions are not billable, where 0 = live mode, 1 = test mode.
BidRequestbcatstring arrayWhen availableBlocked advertiser categories using the specified category taxonomy.Publisher and Brand+ blocks.
BidRequestbadvstring arrayWhen availableBlock list of advertisers by their domains.
BidRequestwseatstring arrayWhen availableAllowed list of buyer seats allowed to bid on this impression.
ImpidstringRequiredA unique identifier for this impression within the context of the bid request.
ImptagidstringRequiredIdentifier for specific ad placement or ad tag that was used to initiate the auction.
ImpbidfloorfloatRequiredMinimum bid for this impression expressed in CPM.USD CPM.
ImpbidfloorcurstringRequiredCurrency specified using ISO-4217 alpha codes.
ImpsecureintegerRequiredFlag to indicate if the impression requires secure HTTPS URL creative assets and markup, where 0 = non-secure, 1 = secure.
ImpexpintegerRequiredAdvisory as to the number of seconds that may elapse between the auction and the actual impression.
ImpinstlintegerRequired1 = the ad is interstitial or full screen, 0 = not interstitial.
ImprwddintegerRequiredIndicates whether the user receives a reward for viewing the ad, where 0 = no, 1 = yes.
Impmetricobject arrayRequiredAn array of Metric objects.Exchange-provided metrics, for example estimated CTR.
ImpssaiintegerWhen availableIndicates 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.
ImppmpobjectWhen availableA Pmp object containing any private marketplace deals in effect for this impression.Deals the DSP is eligible for.
DealidstringWhen availableA unique identifier for the direct deal.
DealbidfloorfloatWhen availableMinimum bid for this impression expressed in CPM.
DealatintegerWhen availableOptional override of the overall auction type of the bid request, where 1 = First Price, 2 = Second Price Plus.
Dealwseatstring arrayWhen availableAllowed list of buyer seats allowed to bid on this deal.
Impext.gpid—RequiredVerve extension.Global placement ID. Sent by default; taken from imp.tagid when the ad request has none.
Impext.tid / ext.tidt—When availableVerve extension.Impression-level transaction ID and its type. Sent to DSPs set up for transaction ID enrichment, on long-form video traffic.
Videomimesstring arrayRequiredContent MIME types supported.
VideomindurationintegerRequiredMinimum video ad duration in seconds. Mutually exclusive with rqddurs.
VideomaxdurationintegerRequiredMaximum video ad duration in seconds. Mutually exclusive with rqddurs.
Videoprotocolsinteger arrayRequiredArray of supported video protocols. Refer to List: Creative Subtypes - Audio/Video in AdCOM 1.0.
VideostartdelayintegerRequiredIndicates the start delay in seconds for pre-roll, mid-roll, or post-roll ad placements.
VideolinearityintegerRequiredIndicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed.
VideoskipintegerRequiredIndicates if the player will allow the video to be skipped, where 0 = no, 1 = yes.
VideoplcmtintegerRequiredVideo placement type for the impression. Refer to List: Plcmt Subtypes - Video in AdCOM 1.0.
VideoposintegerRequiredAd position on screen. Refer to List: Placement Positions in AdCOM 1.0.7 (full screen) for CTV.
VideoplaybackendintegerRequiredThe event that causes playback to end. Refer to List: Playback Cessation Modes in AdCOM 1.0.
VideowintegerWhen availableWidth of the video player in device-independent pixels (DIPS).
VideohintegerWhen availableHeight of the video player in device-independent pixels (DIPS).
VideoplacementintegerWhen availableDeprecated as of OpenRTB 2.6-202303. Use plcmt instead.
Videoplaybackmethodinteger arrayWhen availablePlayback methods that may be in use. If none are specified, any method may be used.
Videodeliveryinteger arrayWhen availableSupported delivery methods. If none is specified, assume all are supported.
VideominbitrateintegerWhen availableMinimum bit rate in Kbps.
VideomaxbitrateintegerWhen availableMaximum bit rate in Kbps.
Videobattrinteger arrayWhen availableBlocked creative attributes. Refer to List: Creative Attributes in AdCOM 1.0.
VideoboxingallowedintegerWhen availableIndicates if letter-boxing of 4:3 content into a 16:9 window is allowed, where 0 = no, 1 = yes.
VideosequenceintegerWhen availableDeprecated as of OpenRTB 2.6. Use slotinpod.Sent for ad pods.
Videoext.podid / ext.podseq / ext.sequence—When availableVerve 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.
Videoext.slotinpod—When availableVerve 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.
Videoext.rqddurs—When availableVerve 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.
Videoext.mincpmpersec—When availableVerve 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.
Videoext.durfloors—When availableVerve 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.
AppidstringRequiredExchange-specific app ID.
AppnamestringRequiredApp name (may be aliased at the publisher's request).
AppbundlestringRequiredThe store ID of the app in an app store. See the OTT/CTV Store Assigned App Identification Guidelines.
AppstoreurlstringRequiredApp store URL for an installed app; for IQG 2.1 compliance.
Appcatstring arrayRequiredArray of IAB Tech Lab content categories of the app. The taxonomy is defined by the cattax field.
AppdomainstringWhen availableDomain of the app.
Appext.inventorypartnerdomain—When availableVerve 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).
PublisheridstringRequiredExchange-specific seller ID. Corresponds to a seller_id in the exchange's sellers.json file.Brand+ publisher ID.
PublishernamestringRequiredSeller name (may be aliased at the seller's request).
PublisherdomainstringWhen availableHighest level domain of the seller.
Contentid / title / series / seasonstringWhen availableContent ID, title, series and season.Passed through from the publisher.
ContentgenrestringWhen availableGenre that best describes the content.
Contentcat / cattaxstring array / integerWhen availableArray of IAB Tech Lab content categories that describe the content, and the taxonomy in use.
ContentcontentratingstringWhen availableContent rating.
ContentlanguagestringWhen availableContent language using ISO-639-1-alpha-2.
ContentlenintegerWhen availableLength of content in seconds; appropriate for video or audio.
ContentlivestreamintegerWhen availableMethod of broadcast of the content: 0 = not scheduled (e.g. VOD or user-initiated), 1 = scheduled (linear viewing).
Contentprodq / context / producerinteger / objectWhen availableProduction quality, type of content, and content producer.
NetworknamestringWhen availableNetwork the content is on.Filled from the publisher's 2.5 ext.network when needed.
ChannelnamestringWhen availableChannel the content is on.Filled from the publisher's 2.5 ext.channel when needed.
Contentext.network / ext.channel—When availableVerve extension.Kept for DSPs that read the 2.5 extensions.
DeviceuastringRequiredBrowser user agent string. This field represents a raw user agent string from the browser.Privacy signals may remove or truncate device data.
DeviceifastringRequiredID sanctioned for advertiser use in the clear (not hashed).
Deviceext.ifa_type—When availableVerve extension.Passed through when the publisher sends it. For CTV requests without it, Brand+ sets a value based on the platform.
DevicedevicetypeintegerRequiredThe general type of device. Refer to List: Device Types in AdCOM 1.0.
Devicemake / model / os / osvstringRequiredDevice make, model, operating system and operating system version.
DevicelmtintegerRequired"Limit Ad Tracking" signal commercially endorsed, where 0 = tracking is unrestricted, 1 = tracking must be limited.
DevicedntintegerRequiredStandard "Do Not Track" flag, where 0 = tracking is unrestricted, 1 = do not track.
DevicelanguagestringRequiredBrowser language using ISO-639-1-alpha-2.
DeviceconnectiontypeintegerWhen availableNetwork connection type. Refer to List: Connection Types in AdCOM 1.0.Sent when present in the ad request or available from an IP lookup.
DeviceipstringWhen availableIPv4 address closest to device.
Deviceipv6stringWhen availableIP address closest to device as IPv6.
Devicedpidmd5 / dpidsha1stringWhen availableDeprecated as of OpenRTB 2.6.Sent when present in the ad request. Kept for DSPs that still read them.
Devicedidmd5 / didsha1stringWhen availableDeprecated as of OpenRTB 2.6.
DevicegeoobjectRequiredLocation 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.
UseridstringRequiredExchange-specific ID for the user.Brand+ user ID.
Usereidsobject arrayWhen availableDetails 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.
SourcefdintegerRequiredEntity responsible for the final impression sale decision, where 0 = exchange, 1 = upstream source.
SourcetidstringRequiredTransaction ID that must be common across all participants in this bid request.
SourcepchainstringRequiredPayment ID chain string containing embedded syntax described in the TAG payment ID Protocol v1.0.
Sourceext.schain—Required2.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.
RegscoppaintegerRequiredFlag indicating if this request is subject to the COPPA regulations established by the USA FTC, where 0 = no, 1 = yes.
Regsgpp / gpp_sidstring / integer arrayWhen availableThe Global Privacy Platform's consent string, and the section(s) that apply.
Regsext.gdpr / ext.consent / ext.us_privacy—Required2.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

JSONHover an underlined field for details. Click it to open its row in the field reference.Field reference (3.3.2)
{
  : "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

Showing 32 of 32 fields
StatusWhat the statuses mean (1.4)
ObjectAttributeTypeStatusDefinitionNotes
BidResponseidstringRequiredID of the bid request to which this is a response.Echo the bid request id.
BidResponseseatbidobject arrayRequired to bidArray of seatbid objects; 1+ required if a bid is to be made.For no bid, omit or return HTTP 204.
BidResponsebididstringRecommendedBidder generated response ID to assist with logging/tracking.
BidResponsecurstringOptionalBid currency using ISO-4217 alpha codes.Use USD.
BidResponsenbrintegerOptionalReason for not bidding. Refer to List: No-Bid Reason Codes in OpenRTB 3.0.
SeatBidbidobject arrayRequiredArray of 1+ Bid objects, each related to an impression.
SeatBidseatstringConditionalID of the buyer seat on whose behalf this bid is made.Required when the deal restricts seats (wseat).
SeatBidgroupintegerOptional0 = impressions can be won individually; 1 = impressions must be won or lost as a group.
BididstringRequiredBidder generated bid ID to assist with logging/tracking.
BidimpidstringRequiredID of the Imp object in the related bid request.
BidpricefloatRequiredBid price expressed as CPM although the actual transaction is for a unit impression only.USD CPM, at or above the floor.
BidadmstringRequiredOptional 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.
BiddealidstringConditionalReference to the deal.id from the bid request if this bid pertains to a private marketplace direct deal.Required when bidding on a deal.
Bidadomainstring arrayRecommendedAdvertiser domain for block list checking.Used for advertiser blocking.
BidcridstringRecommendedCreative ID to assist with ad quality checking.
BidcidstringRecommendedCampaign ID to assist with ad quality checking.
Bidcatstring arrayRecommendedIAB Tech Lab content categories of the creative. The taxonomy is defined by the cattax field.
BidcattaxintegerRecommendedThe taxonomy in use. Refer to List: Category Taxonomies.
BidnurlstringRecommendedWin notice URL called by the exchange if the bid wins (not necessarily indicative of a delivered, viewed, or billable ad).
BidburlstringRecommendedBilling notice URL called by the exchange when a winning bid becomes billable based on exchange-specific business policy.
BidlurlstringOptionalLoss notice URL called by the exchange when a bid is known to have been lost.
BiddurintegerRecommendedDuration of the video or audio creative in seconds.Used when the VAST has no duration, and for pods.
BidmtypeintegerRecommendedType of the creative markup: 1 = Banner, 2 = Video, 3 = Audio, 4 = Native.Use 2 for video.
BidslotinpodintegerOptionalIndicates that the bid response is only eligible for a specific position within a video or audio ad pod.
BidadidstringOptionalID of a preloaded ad to be served if the bid wins.
BidiurlstringOptionalURL without cache-busting to an image that is representative of the content of the campaign, for ad quality/safety checking.
BidbundlestringOptionalThe store ID of the app in an app store.
Bidattrinteger arrayOptionalSet of attributes describing the creative. Refer to List: Creative Attributes in AdCOM 1.0.
Bidapisinteger arrayOptionalList of supported APIs for the markup. If an API is not explicitly listed, it is assumed to be unsupported.
Bidw / hintegerOptionalWidth and height of the creative in device-independent pixels (DIPS).
BidexpintegerOptionalAdvisory as to the number of seconds the bidder is willing to wait between the auction and the actual impression.
Bidext.imptrackers—OptionalVerve 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).

What publishers send

A whole ad break in one request. See 4.1.

What Brand+ does

Sends each slot to DSPs as its own single-impression request, and returns each winning ad with its pod ID and duration. A slot can return more than one bid.

Details in: See 4.1, 2.2.2

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 detailOpenRTB 2.6
Identify the podimp.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 countmaxseq 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 durationsminduration and maxduration, or rqddurs for exact durations. See 2.2.3 for details.
Pod position in the contentpodseq. See 2.2.3 for values.
Optionalslotinpod, mincpmpersec, 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
podidsequence
Only when the publisher's request included them
slotinpodpodseqrqddursmincpmpersecdurfloors
Not currently sent to DSPs
poddurmaxseq

Samples: 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

URLWhen to fire
nurlWhen the bid wins the auction
burlSupply partners fire it from the ad response when the ad renders; with server-side ad insertion, the SSAI server fires it.
lurlWhen the bid loses
VAST Impression, Error and tracking URLsAs the video plays, per the VAST standard

6. Enum reference

Showing 7 of 7 fields
FieldValues
device.devicetype1Mobile/Tablet2PC3Connected TV4Phone5Tablet6Connected device7Set-top box8Out-of-home
imp.video.plcmt1In-stream2Accompanying content3Interstitial4No content / standalone
imp.video.protocols1VAST 1.02VAST 2.03VAST 3.04VAST 1.0 Wrapper5VAST 2.0 Wrapper6VAST 3.0 Wrapper7VAST 4.08VAST 4.0 Wrapper
imp.video.startdelayGreater than 0mid-roll at that many seconds0pre-roll-1generic mid-roll-2generic post-roll
imp.ssai0Unknown1All client-side2Assets stitched server-side, tracking client-side3All server-side
device.connectiontype0Unknown1Ethernet2Wi-Fi3Cellular (unknown generation)42G53G64G75G
bid.mtype1Banner2Video3Audio4Native

Did this page help you?