CTV Homescreen oRTB Integration.
How to integrate with the Teads SSP through OpenRTB for CTV Homescreen native inventory. We are fully compliant with OpenRTB 2.6 and Native Ads API 1.2, combined with the VAST protocol for the video experience.
Supported native asset types.
For a full overview of supported asset types, dimensions, ratios and file-size limits, refer to the dedicated ad-specifications page.
Ad specifications
CTV Homescreen — Ad specifications
Supported image and video asset types, dimensions, ratios and file-size limits.
View the specificationsBid-request details.
A sample OpenRTB 2.6 bid-request with two native impressions — one video experience and one image experience.
JSON · OpenRTB 2.6 · Bid-requestexpandcollapse
{
"id": "bid-request-id-1234",
"at": 1,
"tmax": 1000,
"app": {
"id": "ctv-native-app",
"name": "CTV Native Application",
"bundle": "com.ctv.native.app",
"pagecat": ["IAB1"],
"content": {
"title": "CTV Native Content",
"cat": ["IAB1"],
"genre": "Entertainment",
"contentrating": "G",
"context": 1,
"livestream": 0
}
},
"device": {
"devicetype": 3,
"make": "Generic",
"model": "Smart TV",
"os": "Android TV",
"ua": "Mozilla/5.0 (Linux; Android 9; Android TV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36",
"ifa": "****",
"ip": "****",
"dnt": 0,
"lmt": 0,
"geo": { "city": "Los Angeles", "region": "CA", "country": "USA", "zip": "90210" }
},
"imp": [
{
"id": "impression-id-1234",
"tagid": "****",
"bidfloor": 5.0,
"secure": 1,
"native": {
"ver": "1.2",
"request": {
"ver": "1.2",
"context": 1,
"contextsubtype": 10,
"plcmttype": 1,
"plcmtcnt": 1,
"privacy": 1,
"aurlsupport": 0,
"eventtrackers": [ { "event": 1, "methods": [1] } ],
"assets": [
{ "id": 128, "required": 0, "img": { "type": 3, "wmin": 1920, "hmin": 496 } },
{ "id": 129, "required": 1, "video": {
"mimes": ["video/mp4"],
"minduration": 10,
"maxduration": 60,
"protocols": [1, 2, 3, 4, 5, 6, 7, 8]
} }
]
}
}
},
{
"id": "impression-id-5678",
"tagid": "****",
"bidfloor": 5.0,
"secure": 1,
"native": {
"ver": "1.2",
"request": {
"ver": "1.2",
"context": 1,
"contextsubtype": 10,
"plcmttype": 1,
"plcmtcnt": 1,
"privacy": 1,
"aurlsupport": 0,
"eventtrackers": [ { "event": 1, "methods": [1] } ],
"assets": [
{ "id": 128, "required": 1, "img": { "type": 3, "wmin": 1920, "hmin": 496 } }
]
}
}
}
],
"extension": {
"supportedAdInteractions": [ "ClickToWeb", "ClickToVideo", "ClickToImage", "ClickToDeeplink" ]
},
"regs": { "ext": { "gdpr": 1, "us_privacy": "1---" } },
"user": { "ext": { "consent": "****", "us_privacy": "1---" } },
"source": { "tid": "ctv-native-transaction-id" }
}Multiple impressions
A single bid-request can contain multiple impressions, depending on the number of available slots in a carousel. Here the request covers both video and image experiences, resulting in a separate impression for each asset type in the response.
Placeholder usage
The first impression is designed for a video asset. The secondary image asset serves as a placeholder, displayed while the video is loading to ensure a seamless user experience.
imp.native.request field is shown as readable, unescaped JSON for clarity. In production this field must be a properly stringified JSON object.Bid-response details.
The bid-response returned by Teads for the bid-request above — one bid per impression.
JSON · OpenRTB 2.6 · Bid-responseexpandcollapse
{
"id": "bid-request-id-1234",
"seatbid": [
{
"seat": "teads",
"bid": [
{
"adm": {
"ver": "1.2",
"impid": "impression-id-1234",
"price": 1234,
"assets": [
{ "id": 128, "required": 0, "img": { "w": 1920, "h": 496, "url": "http://masthead.png" } },
{ "id": 129, "required": 1, "video": {
"vasttag": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><VAST version=\"3.0\">[...]</VAST>"
} }
],
"link": {
"url": "https://teads.com",
"clicktrackers": [ "https://t.teads.tv/track?action=click" ]
},
"eventtrackers": []
}
},
{
"adm": {
"ver": "1.2",
"impid": "impression-id-5678",
"price": 1234,
"assets": [
{ "id": 128, "required": 1, "img": { "w": 1920, "h": 496, "url": "http://masthead.png" } }
],
"link": {
"url": "https://teads.com",
"clicktrackers": [ "https://t.teads.tv/track?action=click" ]
},
"eventtrackers": [
{ "event": 1, "method": 1, "url": "https://t.teads.tv/track?action=impression" }
]
}
}
]
}
]
}Video events
The first impression represents a video experience, defined using an embedded VAST object (below). All video-related events, such as impression tracking and progression, are specified within the VAST structure.
Image events
The second impression delivers the requested image experience. Unlike video assets, images are not declared via VAST — their associated events, such as impression tracking, are specified in the eventtrackers field.
seatbid.bid.adm field is shown as readable, unescaped JSON for clarity. In production this field must be a properly stringified JSON object.Embedded VAST for the video experience
XML · VAST 3.0 · Videoexpandcollapse
<?xml version="1.0" encoding="UTF-8"?>
<VAST version="3.0">
<Ad id="****">
<InLine>
<AdSystem>Teads Technology</AdSystem>
<AdTitle><![CDATA[Homescreen Video]]></AdTitle>
<Error><![CDATA[https://t2.teads.tv/track?action=error-vast]]></Error>
<Impression><![CDATA[https://t2.teads.tv/track?action=impression]]></Impression>
<Creatives>
<Creative adId="****" id="****">
<Linear>
<Duration>00:00:30</Duration>
<TrackingEvents>
<Tracking event="start"><![CDATA[https://t2.teads.tv/track?action=start]]></Tracking>
<Tracking event="firstQuartile"><![CDATA[https://t2.teads.tv/track?action=firstQuartile]]></Tracking>
<Tracking event="midpoint"><![CDATA[https://t2.teads.tv/track?action=midpoint]]></Tracking>
<Tracking event="thirdQuartile"><![CDATA[https://t2.teads.tv/track?action=thirdQuartile]]></Tracking>
<Tracking event="complete"><![CDATA[https://t2.teads.tv/track?action=complete]]></Tracking>
</TrackingEvents>
<VideoClicks>
<ClickTracking><![CDATA[https://t2.teads.tv/track?action=click]]></ClickTracking>
</VideoClicks>
<MediaFiles>
<MediaFile bitrate="816192" delivery="progressive" height="496" id="****"
maintainAspectRatio="true" scalable="true" type="video/mp4" width="1920">
<![CDATA[http://masthead.mp4]]>
</MediaFile>
</MediaFiles>
</Linear>
</Creative>
</Creatives>
<Extensions>
<Extension type="****"/>
</Extensions>
</InLine>
</Ad>
</VAST>Ad interactions.
The bid-response contains, in the adm.link.url field, a URL that defines one of the ad-interaction types below. The expected behavior upon a user click is:
Click to Web
Redirects the user to the advertiser's website.
ClickToWebClick to Image
Displays an image on the TV screen.
ClickToImageClick to Video
Displays a video on the TV screen.
ClickToVideoClick to Deeplink
Launches a specific application on the TV.
ClickToDeeplinkDeclaring supported interactions
Platforms that do not support all interaction types must declare their supported interactions within the bid-request extension (root level):
{
"ext": {
"supportedAdInteractions": [
"ClickToWeb",
"ClickToVideo",
"ClickToImage",
"ClickToDeeplink"
]
}
}Creative approval — optional.
Teads offers an optional in-house creative-approval tool for brand-safety compliance. Assets can be reviewed through our proprietary system if required by platform guidelines or advertiser preferences. Creative delivery will not begin until assets have been validated.
Additional questions.
To begin working together, here are some questions we would need to resolve:
- 1How many creative slots does your carousel contain, and what are the standard dimensions/formats supported?What is the display duration for each image experience in the carousel rotation?
- 2What are the technical constraints for video experiences (maximum duration, file-size limits, supported codecs)?
- 3How do you handle carousel rotation — do you cycle through the same content or trigger new bid-requests for fresh inventory?
- 4Do you implement any caching mechanisms on your platform, and if so, what are the cache duration / eviction policies?
- 5Are you VAST compliant? Which VAST events do you support? We support this exhaustive list: impression, start, firstQuartile, midpoint, thirdQuartile, complete, click.
- 6How do you handle video loading states? Do you display a default placeholder or require advertisers to provide loading assets?
- 7What targeting data is available in bid-requests (device.ip and device.geo fields)?
- 8How do you handle user consent management? Are you GDPR/CCPA compliant, and do you respect Do-Not-Track signals (device.dnt field)?
- 9What app-bundle-id will be passed (app.bundle field)?
- 10What are your QPS (Queries Per Second) capabilities and expected response timeouts?
- 11What types of ad interactions do you support?
Integration steps.
The full integration roadmap — from technical alignment to global availability — is detailed in a dedicated document.
Roadmap
Standard integration timeline
Step-by-step onboarding: alignment, technical exchange, setup, device testing, test campaign, production and global availability.
View the integration steps