RTB Architecture
OpenRTB bid request builder and validator: build, paste and check OpenRTB 2.6 requests
Published · Last updated
Next scheduled review:
This OpenRTB bid request builder creates a valid OpenRTB 2.6 request from six presets: display, outstream video, CTV pod, native, audio and DOOH. It also validates any request you paste. Each finding names the field, the rule broken and the section of the IAB Tech Lab specification behind it. Nothing leaves your browser.
OpenRTB 2.6 bid request builder
Validation runs in your browser. Your request is never sent to a server.
Build fields
imp (1)
site
site.publisher
device
device.geo
user
source
source.schain
source.schain.nodes (1)
regs
0 errors · 0 warnings · 0 notes
HTTP and cURL
POST /bid HTTP/1.1
Content-Type: application/json
x-openrtb-version: 2.6
{
"id": "d0c58cff-0fc6-42dc-b407-569a0e676455",
"imp": [
{
"id": "1",
"tagid": "home-top-1",
"banner": {
"format": [
{
"w": 320,
"h": 50
},
{
"w": 300,
"h": 250
}
],
"pos": 1
},
"bidfloor": 0.4,
"bidfloorcur": "USD",
"secure": 1
}
],
"site": {
"id": "site-1001",
"domain": "news.example.com",
"page": "https://news.example.com/local/weather-update",
"mobile": 1,
"publisher": {
"id": "pub-1001",
"domain": "example.com"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1",
"ip": "203.0.113.17",
"devicetype": 4,
"make": "Apple",
"os": "iOS",
"js": 1,
"language": "en",
"geo": {
"country": "USA",
"region": "CA",
"type": 2
}
},
"user": {
"id": "exch-u-5521"
},
"source": {
"tid": "0307d8fd-f34c-4711-822f-691a13522787",
"schain": {
"complete": 1,
"ver": "1.0",
"nodes": [
{
"asi": "ssp.example",
"sid": "pub-1001",
"hp": 1
}
]
}
},
"regs": {
"gpp": "DBABLA~CAAAVVVVVVRA.QA",
"gpp_sid": [
7
]
},
"at": 1,
"tmax": 250,
"cur": [
"USD"
]
}Paste a request from your exchange logs, a Prebid Server debug response or a partner's integration guide. The validator reads it the way a careful bidder would and tells you what to fix before a partner rejects it. For what each field means, read OpenRTB 2.6 explained alongside the tool.
Contents
Key facts
- 2.6 keeps moving inside one version number. OpenRTB 2.6 has shipped as dated releases since 2.6-202210. The latest, 2.6-202606, was published on 11 June 2026 and added
Content.realtimeandContent.firstbroadcast(openrtb2.x releases, checked 9 November 2026). The version header still says 2.6. - Unknown fields are allowed by design. Since release 2.6-202211, bidders and exchanges "must tolerate" new fields and enumerated values they do not recognise (OpenRTB 2.6, section 2.6). The validator therefore reports an unknown field as a note, not an error.
- The value lists live in AdCOM. OpenRTB 2.6 points every enumerated field to AdCOM 1.0, whose main branch last changed on 23 July 2026 (AdCOM commit history). The video placement list now has nine values, from 1 (Instream) to 9 (In-scene) (AdCOM, List: Plcmt Subtypes - Video).
- DOOH and GPP arrived together. Release 2.6-202211 of 17 November 2022 added the DOOH object,
regs.gppandregs.gpp_sid(2.6-202211 release notes). Release 2.6-202303, published on 5 April 2023, addedplcmtand deprecatedplacement(2.6-202303 release notes). - The official examples are not clean. All five request examples in section 6.2 of the specification use category IDs such as
IAB3-1from Content Taxonomy 1.0, which AdCOM marks deprecated (OpenRTB 2.6, section 6.2). The two DOOH request examples usegeo.long,venuetaxandvenuetypeid, which the object tables do not define (implementation guide, section 7.9.6).
How to use the builder
- Pick a preset. Choose display banner, outstream video, CTV pod, native, audio or DOOH. Each preset loads a complete request that passes every check.
- Edit the form. Change sizes, durations, floors, currency, the site or app, the device and the privacy signals. Drop-downs show the AdCOM label next to each code, so you pick "4 = No Content/Standalone", not a bare 4.
- Watch the findings. The validator runs on every change. A red badge means the request breaks a rule; amber means a bidder may misread it; grey is a note.
- Copy or download. Copy the JSON, download it as
bid-request.json, or copy a cURL command with thex-openrtb-version: 2.6header for your own test endpoint. The tool never sends the request anywhere. - Share the state. The share link stores the whole form in the URL fragment, which browsers do not send to our server.
To validate instead, open the Paste tab, paste a request and press Validate. Findings appear in document order, each with a JSON path, a plain-English message and a link to the section of the spec.
OpenRTB bid request examples: six presets that pass
Every preset uses reserved .example domains, documentation IP ranges and invented IDs. Codes come from AdCOM 1.0 and are labelled in the form. The privacy strings are real test strings from the IAB Tech Lab reference library (iabgpp-es, GppModel tests), so they decode in our GPP consent string decoder.
6 of 6 rows
Display banner | Mobile web, US |
| GPP section 7, US National |
Outstream video | Desktop web, Portugal |
|
|
CTV pod | Connected TV app, US | Dynamic pre-roll pod: | GPP section 7 |
Native | News app, US | Native 1.2 request string: title, main image, icon, sponsor, description, call to action | GPP section 7 |
Audio | Music app, US |
| GPP section 7 |
DOOH | Rail platform screen, UK |
| none (no personal data) |
Display banner
- Context
Mobile web, US
- The fields that define it
banner.format320x50 and 300x250,pos1 (above the fold)- Privacy signal
GPP section 7, US National
Outstream video
- Context
Desktop web, Portugal
- The fields that define it
video.plcmt4 (No Content/Standalone),playbackmethod6 (starts in view, sound off)- Privacy signal
gdpr1, TC String, GPP section 2
CTV pod
- Context
Connected TV app, US
- The fields that define it
Dynamic pre-roll pod:
podid,podseq1,poddur90,maxseq4,rqddurs15 and 30,ssai3- Privacy signal
GPP section 7
Native
- Context
News app, US
- The fields that define it
Native 1.2 request string: title, main image, icon, sponsor, description, call to action
- Privacy signal
GPP section 7
Audio
- Context
Music app, US
- The fields that define it
audio.feed1 (music streaming), 15 to 30 seconds, VAST 4.1 and 4.2- Privacy signal
GPP section 7
DOOH
- Context
Rail platform screen, UK
- The fields that define it
doohobject,qty.multiplier14.2,dtin milliseconds,devicetype8- Privacy signal
none (no personal data)
Table by AdSovereign, CC BY 4.0.
Sources for the codes: AdCOM 1.0, OpenRTB Native Ads 1.2 and the OpenOOH Venue Taxonomy 1.1.
The display and CTV examples are explained field by field in OpenRTB 2.6 explained, so this page prints the two formats that article does not cover. Here is the outstream video preset. The slot sits in an article, below the fold, and the player starts muted when it scrolls into view.
{
"id": "eae2cef7-9be5-49a4-be64-b7272f0b9386",
"imp": [
{
"id": "1",
"tagid": "article-video-1",
"video": {
"mimes": ["video/mp4", "video/webm"],
"minduration": 6,
"maxduration": 30,
"protocols": [7, 8, 11, 12, 13, 14],
"w": 640,
"h": 360,
"plcmt": 4,
"linearity": 1,
"skip": 1,
"skipafter": 5,
"playbackmethod": [6],
"playbackend": 2,
"api": [7],
"pos": 3
},
"bidfloor": 2.5,
"bidfloorcur": "EUR",
"secure": 1
}
],
"site": {
"id": "site-2040",
"domain": "magazine.example",
"page": "https://magazine.example/travel/lisbon-guide",
"publisher": { "id": "pub-2040", "domain": "magazine.example" }
},
"device": {
"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"ip": "192.0.2.0",
"devicetype": 2,
"js": 1,
"language": "pt",
"geo": { "country": "PRT", "type": 2 }
},
"user": {
"id": "exch-u-8812",
"consent": "CPSG_8APSG_8AAAAAAENAAFgAAAAAAAAAAAAAOAAAABAAAAA.IAOABgAB.YAAAAAAAAAAA"
},
"source": {
"tid": "4749b971-b7a4-49ae-a8cf-e9b04f0d1dc3",
"schain": {
"complete": 1,
"ver": "1.0",
"nodes": [{ "asi": "ssp.example", "sid": "pub-2040", "hp": 1 }]
}
},
"regs": {
"gdpr": 1,
"gpp": "DBABMA~CPSG_8APSG_8AAAAAAENAAFgAAAAAAAAAAAAAOAAAABAAAAA.IAOABgAB.YAAAAAAAAAAA",
"gpp_sid": [2]
},
"at": 1,
"tmax": 300,
"cur": ["EUR"]
}Three choices make this outstream rather than instream. A plcmt of 4 tells buyers there is no video content around the ad. A playbackmethod of 6 says the player starts when it enters the viewport, with sound off. A playbackend of 2 says it stops when the player leaves the viewport (AdCOM, Playback Methods and Playback Cessation Modes). The implementation guide maps the old "In-Article" placement to this value (implementation guide, section 7.10.2).
The TC String in user.consent matches section 2 of the GPP string, so both readers see the same consent; you can open it in the TCF consent string decoder.
The DOOH preset shows the fields a screen needs and a phone does not.
{
"id": "8c46efce-3335-432e-a0ed-cb940c6249b5",
"imp": [
{
"id": "1",
"banner": { "w": 1080, "h": 1920, "mimes": ["image/jpeg", "image/png"] },
"bidfloor": 6.0,
"bidfloorcur": "GBP",
"secure": 1,
"exp": 3600,
"dt": 1794229200000,
"qty": { "multiplier": 14.2, "sourcetype": 1, "vendor": "measurement.example" }
}
],
"dooh": {
"id": "screen-group-42",
"name": "Example Central, platform 4",
"venuetype": ["10602"],
"venuetypetax": 5,
"publisher": { "id": "pub-0042", "name": "Example Outdoor Ltd", "domain": "outdoor.example" },
"domain": "outdoor.example"
},
"device": {
"devicetype": 8,
"w": 1080,
"h": 1920,
"ppi": 40,
"ifa": "screen-00042",
"geo": { "lat": 51.5113, "lon": -0.0904, "type": 3, "country": "GBR" },
"ext": { "ifa_type": "ppid" }
},
"source": {
"tid": "d3f1a7c2-5b84-4e19-9c60-7a2e8b4f1d93",
"schain": {
"complete": 1,
"ver": "1.0",
"nodes": [{ "asi": "dooh-ssp.example", "sid": "pub-0042", "hp": 1 }]
}
},
"at": 1,
"tmax": 500,
"cur": ["GBP"]
}One play of this ad counts as 14.2 impressions, so a winning bid of 6.00 GBP CPM costs 6.00 / 1000 x 14.2, or about 0.085 GBP. That is the pricing rule in the implementation guide, section 7.9.4. The dt value is the planned display time in milliseconds: 1794229200000 is 9 November 2026 at 13:00 UTC. Venue 10602 is "Transit, Train Stations, Platform" in the OpenOOH Venue Taxonomy, and venuetypetax 5 names version 1.1 of that list. The ifa_type value sits in device.ext, where the IAB community extension defines it.
Bid request example from the spec, checked line by line
The best test of a validator is the specification itself. We pasted Example 4, the video request in section 6.2.4 of 2.6.md. It parses, it has every required field, and it gets no errors. It still draws two warnings and four notes.
6 of 6 rows
E02 | warning |
|
|
E02 | warning |
| Same problem for the content categories |
U01 | note |
|
|
O12 | note |
| No |
O11 | note |
| Two playback methods; the spec advises using only the first |
O05 | note |
| No |
E02
- Severity
warning
- Path
/site/cat- What the validator says
IAB2-1comes from taxonomy 1 (the default whencattaxis absent), which AdCOM marks deprecated
E02
- Severity
warning
- Path
/site/content/cat- What the validator says
Same problem for the content categories
U01
- Severity
note
- Path
/imp/0/video/apis- What the validator says
apisis not a Video field; did you meanapi?
O12
- Severity
note
- Path
/imp/0/video- What the validator says
No
plcmt, so buyers cannot tell instream from outstream
O11
- Severity
note
- Path
/imp/0/video/playbackmethod- What the validator says
Two playback methods; the spec advises using only the first
O05
- Severity
note
- Path
/imp/0- What the validator says
No
secureflag, so buyers assume non-secure creatives are fine
Table by AdSovereign, CC BY 4.0.
The apis finding is the instructive one. The field apis exists in OpenRTB 2.6, but on the bid object of the response, not on the video object of the request (OpenRTB 2.6, Object: Video). A bidder that follows the versioning rule will silently ignore it, so the VPAID support the example meant to signal never reaches the buyer. Three edits clear both warnings and the two most useful notes: rename apis to api, add "plcmt": 1, and set cattax to a current taxonomy with matching category IDs.
What the validator checks against the OpenRTB 2.6 spec
The validator applies 11 families of checks, in the order a parser meets them. Severity follows one rule. An error means the request breaks a "must" in the specification or cannot be read. A warning means a buyer may misread it or a "should" is broken. A note is information.
11 of 11 rows
Parse | Valid JSON, an object at the top, duplicate keys | Error; duplicate keys warn | |
Required fields |
| Error | Object tables, section 3.2 |
Types | Strings, integers, floats and arrays where the tables say so; 0 or 1 flags | Error | Object tables |
Enumerations | Every coded field against its AdCOM list, with vendor codes of 500 or more | Warning | |
Relationships | One media object per impression, unique | Error or warning | Sections 3.1, 3.2.7, 3.2.32 |
Deprecated and removed |
| Warning | |
Unknown fields | Fields no table defines, with a "did you mean" hint; pre-2.6 | Note | Section 2.6 |
Privacy | GPP header, | Error or warning | |
Supply chain |
| Error or warning | |
Native | The request string parses and carries valid Native 1.2 assets | Error or warning | |
DOOH | No site or app, | Error or warning |
Parse
- Examples of what it checks
Valid JSON, an object at the top, duplicate keys
- Typical severity
Error; duplicate keys warn
- Spec basis
Required fields
- Examples of what it checks
id,imp,Imp.id,Video.mimes,Native.request,Deal.id, SupplyChain fields- Typical severity
Error
- Spec basis
Object tables, section 3.2
Types
- Examples of what it checks
Strings, integers, floats and arrays where the tables say so; 0 or 1 flags
- Typical severity
Error
- Spec basis
Object tables
Enumerations
- Examples of what it checks
Every coded field against its AdCOM list, with vendor codes of 500 or more
- Typical severity
Warning
- Spec basis
Relationships
- Examples of what it checks
One media object per impression, unique
Imp.id, site or app or dooh,rqddursversus min and max duration, pods, deal floors- Typical severity
Error or warning
- Spec basis
Sections 3.1, 3.2.7, 3.2.32
Deprecated and removed
- Examples of what it checks
placement,sequence, hashed device IDs,yob,gender;wmaxandprotocolremoved- Typical severity
Warning
- Spec basis
Unknown fields
- Examples of what it checks
Fields no table defines, with a "did you mean" hint; pre-2.6
extlocations- Typical severity
Note
- Spec basis
Section 2.6
Privacy
- Examples of what it checks
GPP header,
gpp_sidagainst the header,gdprand consent, US Privacy format- Typical severity
Error or warning
- Spec basis
Supply chain
- Examples of what it checks
ver"1.0", node fields,hp1,sidlength, last node againstpublisher.id- Typical severity
Error or warning
- Spec basis
Native
- Examples of what it checks
The request string parses and carries valid Native 1.2 assets
- Typical severity
Error or warning
- Spec basis
DOOH
- Examples of what it checks
No site or app,
devicetype8, latitude and longitude,dtin milliseconds,qty.vendor- Typical severity
Error or warning
- Spec basis
Table by AdSovereign, CC BY 4.0.
Enumerated values outside AdCOM are warnings rather than errors for the same reason unknown fields are notes. A partner may be on a newer AdCOM release than our copy, and the spec tells receivers to cope. For GPP the validator reads the header and compares it with gpp_sid; the GPP consent string decoder reads each section in full.
What the official examples teach
We ran all seven request examples that IAB Tech Lab publishes in the two specification files. None has an error, which is good news for anyone copying them. None is clean either.
7 of 7 rows
Simple banner | 0 | 2 | 3 | Deprecated taxonomy in | |
Expandable creative | 0 | 2 | 4 | As above, plus | |
Mobile | 0 | 2 | 2 |
| |
Video | 0 | 2 | 4 |
| |
PMP with direct deal | 0 | 2 | 2 | Deprecated taxonomy | |
DOOH banner | 0 | 2 | 10 |
| |
DOOH video | 0 | 2 | 9 |
|
Simple banner
- File and section
- Errors
0
- Warnings
2
- Notes
3
Expandable creative
- File and section
- Errors
0
- Warnings
2
- Notes
4
Mobile
- File and section
- Errors
0
- Warnings
2
- Notes
2
Video
- File and section
- Errors
0
- Warnings
2
- Notes
4
PMP with direct deal
- File and section
- Errors
0
- Warnings
2
- Notes
2
DOOH banner
- File and section
- Errors
0
- Warnings
2
- Notes
10
DOOH video
- File and section
- Errors
0
- Warnings
2
- Notes
9
Table by AdSovereign, CC BY 4.0.
The DOOH rows matter most. A bidder that reads only geo.lon sees no longitude at all, and the guide itself says latitude and longitude are required for DOOH. The deal floors in the DOOH banner example are also read as USD while the impression floor is in GBP, because a deal's currency never inherits the impression's (OpenRTB 2.6, Object: Deal). If you copy an official example as a template, run it through the validator first.
Mistakes the validator is built to catch
These patterns break integrations quietly, because JSON parsers accept them and bidders then drop or misprice the request.
- Numbers sent as strings.
"bidfloor": "0.50"is a string. A strict parser rejects it, and a lenient one has to guess. - Booleans for flags.
"secure": trueis not the integer 1 the spec asks for. - A single currency instead of an array.
curis a string array, so"cur": "USD"fails the type check. - Two duration models at once.
rqddursmust not appear withmindurationormaxduration(Object: Video). - Pre-2.6 locations. OpenRTB 2.6 moved
regs.ext.gdpr,user.ext.consentandsource.ext.schaininto the core objects, and a 2.6 bidder may not look inextat all. - A GPP string without
gpp_sid. The buyer then cannot tell which section governs the transaction. - A supply chain that does not end with the seller. The last node's
sidshould equalpublisher.id; the SupplyChain, ads.txt and sellers.json guide explains why buyers check this. - DOOH timestamps in seconds.
dtis milliseconds since 1970. A value in seconds lands in January 1970. - A native request sent as an object. OpenRTB 2.x defines
native.requestas a JSON-encoded string, although some exchanges accept an object. - Site and app together. Only one context object applies to a request, and a DOOH request must carry neither.
Methodology and limits
The checks follow the OpenRTB 2.6 specification and implementation guide at release 2.6-202606, which was still the latest state of the repository on 9 November 2026. Enumerations come from AdCOM 1.0 as of its 23 July 2026 commit. Native checks follow Native Ads 1.2; supply chain checks follow the SupplyChain object 1.0. Each finding links to the section it relies on, so you can disagree with us on the evidence.
The tool checks one bid request at a time. It does not check bid responses, exchange-specific ext rules, or whether a seller ID appears in an exchange's sellers.json; the ads.txt and sellers.json validator does that last job. It reads the GPP header and the shape of a TC String; full consent decoding happens in the two decoders linked above. For how the auction around a request works, see how real-time bidding works. Pod logic is covered in depth in SSAI and CTV ad serving. Other engineering tools and guides sit in the RTB architecture hub.
FAQ
Where is the OpenRTB 2.6 spec?
What is the smallest valid OpenRTB bid request?
id and an imp array holding one impression that has its own id and one media object, such as a banner with w and h. The validator accepts it with no errors, but it warns that no site, app or dooh object says where the ad runs. Real buyers need that context, a device and the privacy signals before they bid.Does the validator reject unknown fields?
lon for long.Can I check an OpenRTB 2.5 request?
user.ext.consent or Video.protocol (OpenRTB 2.6, Appendix B). Treat those findings as a migration list rather than as faults in a 2.5 integration.Does it check bid responses?
impid matching and price against floor, are planned and will be announced in the changelog.Is my bid request stored?
How this works on owned infrastructure
A browser validator catches a broken template once. The harder question is what happens to the millions of requests that follow it. When the exchange belongs to a vendor, its validation rules, its tolerance for unknown fields and its handling of malformed GPP strings are written in that vendor's documentation, and a change may surface only as a drop in bids. AdSovereign is an enterprise RTB stack designed to run on infrastructure you control, so the rule set that screens incoming and outgoing OpenRTB 2.6 requests is configuration you version, test against fixtures like the ones on this page, and roll out on your own schedule. The architecture page shows where request validation sits in the bid path, and integrations lists the protocol versions it supports.
Sources
- IAB Tech Lab, "OpenRTB API Specification Version 2.6" (2.6.md, release 2.6-202606; accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/2.6.md
- IAB Tech Lab, "OpenRTB 2.x Implementation Notes" (implementation.md, accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/blob/main/implementation.md
- IAB Tech Lab, openrtb2.x releases 2.6-202210 (3 November 2022) to 2.6-202606 (11 June 2026), including the 2.6-202211 and 2.6-202303 notes (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb2.x/releases
- IAB Tech Lab, "AdCOM Specification v1.0" (main branch, last commit 23 July 2026; accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md
- IAB Tech Lab, "OpenRTB Dynamic Native Ads API Specification Version 1.2" (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/Native-Ads/blob/main/OpenRTB-Native-Ads-Specification-Final-1.2.md
- IAB Tech Lab, "SupplyChain Object" 1.0 (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/supplychainobject.md
- IAB Tech Lab, "IFA_TYPE" community extension for OpenRTB (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/openrtb/blob/main/extensions/community_extensions/ifa_type.md
- IAB Tech Lab, "Global Privacy Platform: Consent String Specification" and "Section Information" (accessed 9 November 2026). https://github.com/InteractiveAdvertisingBureau/Global-Privacy-Platform/blob/main/Sections/Section%20Information.md
- IAB Tech Lab, iabgpp-es reference library, GppModel.test.ts (accessed 9 November 2026). https://github.com/IABTechLab/iabgpp-es/blob/master/modules/cmpapi/test/GppModel.test.ts
- OpenOOH, "Venue Taxonomy" specification 1.1 (accessed 9 November 2026). https://github.com/openooh/venue-taxonomy/blob/main/specification-1.1.md
Changelog
- 9 November 2026. First edition: builder with six presets, validator with 11 check families, results for the seven official request examples, 32 test cases. Baseline OpenRTB 2.6-202606 and AdCOM 1.0 of 23 July 2026. Next review 9 February 2027.