Reading this matrix
This is the current integration boundary, not a complete OpenRTB schema. Types describe what partners should send. Fields marked Forwarded do not receive full local type or semantic validation: forwarding does not make a wrong type valid or establish enforcement of media or privacy constraints.
| Label | Meaning |
|---|---|
| Validated | ADX checks type, bounds, or correlation |
| Matched | Used for routing, targeting, floors, or creative / seat filtering; may also be validated and forwarded |
| Forwarded | Preserved as JSON values to the DSP, or within a bid to the SSP; not byte-for-byte preservation |
| Rewritten | Changed when creating a downstream request or winning SSP response |
| Rejected | Presence causes rejection, including explicit null, unless otherwise stated |
Duplicate keys at every level, including escaped equivalents, invalid JSON, and reserved internal parser keys are rejected. Unknown fields are generally retained, but empty values cannot bypass explicitly rejected fields. Omission is different from null: validated optional fields generally reject explicit null or incorrect types.
Validated text has a UTF-8 byte limit, cannot consist entirely of whitespace, and cannot contain control characters; valid text is not automatically trimmed. Bounded string lists allow at most 64 entries of at most 512 bytes each; bad entries are not silently discarded. Attribute lists allow at most 64 integers in 1..4294967295. For prices, see DSP pricing.
Request root
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
request |
object / yes | Validated | Raw SSP and rewritten downstream bodies are each at most 256 KiB |
id |
string / yes | Validated, forwarded | 1–128 bytes; response correlation |
at |
integer / yes | Validated, rewritten | Exactly 1, explicit first price |
tmax |
integer / no | Validated, rewritten | 1–60000 ms; downstream receives remaining budget |
cur |
string[] / no | Validated, rewritten | Omission means USD; otherwise exactly ["USD"]; set downstream |
imp |
object[] / yes | Validated, matched | Exactly one object |
app / site |
object / choose one | Validated, matched, forwarded | Exactly one; establishes source type |
device |
object / no | Validated, matched, forwarded | Must be an object if present; see below |
bcat |
string[] / no | Validated, matched, forwarded | Bounded list; exact comparison with bid.cat |
badv |
string[] / no | Validated, matched, forwarded | Bounded list; ASCII case-insensitive comparison with bid.adomain |
bapp |
string[] / no | Validated, matched, forwarded | Bounded list; exact comparison with bid.bundle |
wseat / bseat |
string[] / no | Validated, matched, forwarded | Bounded lists; cannot both be nonempty; match original DSP seat, not DSP ID |
cattax |
integer / no | Validated, forwarded | Only 1 |
wlang / wlangb / acat / durfloors |
any / forbidden | Rejected | Corresponding enforceable constraints are not implemented |
test / allimps |
integer / no | Forwarded | Do not switch execution mode or allow multiple impressions |
| Other unlisted fields | as agreed / no | Forwarded | No promise of associated auction semantics; agree before use |
Device, app, and site
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
device.os |
string / no | Validated, matched, forwarded | At most 512 bytes; matching uses ASCII lowercase |
device.geo |
object / no | Validated, forwarded | Must be an object if present |
device.geo.country |
string / no | Validated, matched, forwarded | Valid ISO alpha-2 / alpha-3. Country codes must be uppercase; matching uses alpha-2 |
device.geo.lat / lon |
number / no | Forwarded | Not used for local coordinate targeting |
device.geo.region / city / zip |
string / no | Forwarded | No full geographical validation |
device.ua / ip / ipv6 / ifa / make / model / osv / language |
string / no | Forwarded | Not local matching dimensions; send only within lawful data-use scope |
device.dnt / lmt / devicetype / connectiontype / js |
integer / no | Forwarded | Does not establish local privacy or device-capability enforcement |
device.sua / ext / other fields |
object or standard-defined type / no | Forwarded | Agree the relevant semantics separately |
app.bundle |
string / no | Validated, matched, forwarded | At most 512 bytes; exact string, no case conversion |
app.id / name / domain / storeurl / ver |
string / no | Forwarded | Do not replace SSP identity in the path |
app.cat / sectioncat / pagecat |
string[] / no | Forwarded | Distinct from the locally enforced request.bcat restriction |
app.publisher / content / ext / other fields |
object or standard-defined type / no | Forwarded | No guarantee of nested field validation |
site.id / name / domain / page / ref / search |
string / no | Forwarded | Do not provide an App Bundle matching dimension |
site.cat / sectioncat / pagecat |
string[] / no | Forwarded | Not used for local media-category blocking |
site.publisher / content / ext / other fields |
object or standard-defined type / no | Forwarded | No guarantee of nested field validation |
Country, OS, and App Bundle may be missing. Invalid present dimensions cannot turn into “missing” values to bypass matching. Matching normalization does not rewrite the original OS / country / bundle sent to a DSP.
Imp and media objects
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
imp.id |
string / yes | Validated, forwarded | 1–128 bytes; bid.impid correlation |
imp.banner / video / native |
object / choose one | Validated, matched, forwarded | Exactly one object, selecting format; null invalid |
imp.bidfloor |
number / no | Validated, rewritten | Nonnegative USD CPM; omission means 0; rounds up to micro-units; downstream becomes gross floor |
imp.bidfloorcur |
string / no | Validated, rewritten | Omission means USD; only explicit USD allowed; set downstream |
imp.secure / instl / clickbrowser / exp |
integer / no | Forwarded | No independent secure-creative or rendering validation |
imp.tagid / displaymanager / displaymanagerver |
string / no | Forwarded | Not local rule-matching dimensions |
imp.metric |
object[] / no | Forwarded | Metric authenticity is not validated |
imp.ext / other fields |
object or standard-defined type / no | Forwarded | No promise of extension auction semantics |
imp.pmp / audio / qty / rwdd / durfloors |
any / forbidden | Rejected | These PMP, audio, quantity, and extension fields are unsupported |
banner.battr / video.battr / native.battr |
integer[] / no | Validated, matched, forwarded | Bounded positive integer list; compared with bid.attr |
Media btype / podid / podseq / poddur / maxseq / mincpmpersec / rqddurs / durfloors |
any / forbidden | Rejected | Rejected in each of the three media objects |
banner.w / h / wmin / wmax / hmin / hmax / pos / topframe |
integer / no | Forwarded | Dimensions and placement are not fully checked; partners must validate |
banner.format |
object[] / no | Forwarded | No full validation of candidate dimensions |
banner.mimes |
string[] / no | Forwarded | DSP must honor media-type constraints |
banner.api / expdir |
integer[] / no | Forwarded | No independent API / expansion validation |
banner.id / ext / other fields |
standard-defined type / no | Forwarded | Full Banner schema not enforced |
video.mimes |
string[] / per media agreement | Forwarded | Supply according to IAB and player capabilities; not fully validated by ADX |
video.protocols / api / playbackmethod / delivery / companiontype |
integer[] / no | Forwarded | No independent VAST or player-capability verification |
video.minduration / maxduration / w / h / linearity / placement / plcmt / startdelay / skip / skipmin / skipafter / minbitrate / maxbitrate / pos |
integer / no | Forwarded | Full media restrictions not enforced; does not imply POD support |
video.companionad |
object[] / no | Forwarded | No recursive guarantee of full Banner support |
video.ext / other fields |
standard-defined type / no | Forwarded | VAST contents are not independently validated |
native.request |
string (serialized Native JSON) / per media agreement | Forwarded | Inner asset request is not parsed; partners validate Native version and assets |
native.ver |
string / no | Forwarded | Example uses 1.2; not a claim of full Native 1.2 validation |
native.api / ext / other fields |
standard-defined type / no | Forwarded | Full Native schema not enforced |
User, regs, source, and extensions
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
user |
object / no | Forwarded | Not used for local user matching; object and child fields not fully validated |
user.id / buyeruid / keywords / customdata |
string / no | Forwarded | Send only within authorized data-use scope |
user.geo / ext, user.data |
object / object[] / no | Forwarded | Includes consent extensions; not a compliance decision |
regs |
object / no | Forwarded | Regulatory semantics are not fully validated |
regs.coppa / gdpr, regs.gpp / gpp_sid / ext |
integer / string / integer[] / object, by field / no | Forwarded | Partners must honor applicable restrictions; no automatic legality guarantee |
source |
object / no | Forwarded | Not the authenticated identity source |
source.fd / tid / pchain / schain / ext |
integer / string / object, by field / no | Forwarded | No independent endorsement of supply-chain authenticity |
ext |
object / no | Forwarded | Root and otherwise unhandled nested extensions are generally retained, without implicit new support |
For full standard semantics, see IAB OpenRTB and Native Ads. Forwarding privacy fields does not independently validate regulatory compliance. Partners must establish lawful collection, transmission, use, and creative rendering.
DSP response and seatbid
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
response |
object / for a 200 bid response | Validated, rebuilt | At most 512 KiB; root errors reject the entire DSP response |
response.id |
string / yes | Validated, rebuilt | 1–128 bytes; must equal request.id |
response.cur |
string / no | Validated, rewritten | Omission means USD; only explicit USD allowed; set in SSP response |
response.seatbid |
object[] / no | Validated, rebuilt | Omitted or empty means no bid; at most 64 seats; SSP receives only the winner |
response.bidid / nbr / customdata / ext / other fields |
standard-defined type / no | Not retained | SSP response root rebuilt as id, cur, seatbid |
seatbid.seat |
string / conditional | Validated, matched, retained | At most 512 bytes; a seat allow/block list requires a determinable identity |
seatbid.group |
integer / no | Validated, filtered | Unsigned integer; nonzero excludes the entire seat; grouped acceptance unsupported |
seatbid.bid |
object[] / yes | Validated, rebuilt | At most 64 per seat and 64 total; empty array means no bid |
seatbid.ext / other fields |
standard-defined type / no | Not retained | Output seat contains only seat (if present) and the winning bid |
An invalid seat object, seat type, group type, bid array, or overall count rejects the entire DSP response. A failed individual bid check below only drops that bid and does not hide a valid sibling bid.
Bid fields
| Field | Type / required | Handling | Limit or purpose |
|---|---|---|---|
bid.id |
string / yes | Validated, retained | 1–128 bytes; also used for stable equal-price ordering |
bid.impid |
string / yes | Validated, retained | 1–128 bytes; must match the single imp.id |
bid.price |
number / yes | Validated, auctioned, rewritten | DSP gross must remain positive after rounding down and meet floor; SSP output is net |
bid.cur |
string / no | Validated, retained | USD only; cannot override an invalid response currency |
bid.adm |
string / yes | Validated, macro-replaced, retained | Not whitespace-only, at most 256 KiB, no NUL; newlines allowed; full creative contents not parsed |
bid.nurl / burl / lurl |
string / no | Validated, macro-replaced, retained | At most 8192 bytes each, general text rules; not full URL validation; ADX does not call them |
bid.adomain / cat |
string[] / conditional | Validated, matched, retained | Bounded lists; badv / bcat require a nonempty corresponding identity list |
bid.attr |
integer[] / conditional | Validated, matched, retained | Bounded positive integer list; battr requires the field to exist, but an empty array is allowed |
bid.crid |
string / no | Validated, matched, retained | At most 512 bytes; supplied to creative-blocking rules |
bid.bundle |
string / conditional | Validated, matched, retained | At most 512 bytes; required when bapp is nonempty |
bid.cattax |
integer / no | Validated, retained | Only 1 |
bid.dealid / podid / slotinpod |
any / forbidden | Bid rejected | Deals and PODs unsupported |
bid.adid / cid / iurl / language |
string / no | Retained | Does not establish independent identity or creative verification |
bid.w / h / api / protocol / qagmediarating / exp |
integer / no | Retained | Full media response validation is not performed |
bid.ext / other fields |
object or standard-defined type / no | Retained | Preserved in the winning bid without promising support for unknown constraints |
Creative adomain, category, crid, and advertised Bundle also participate in configured creative blocking. If the rewritten winning response exceeds 512 KiB, that bid is dropped and a valid lower bid may still win; no remaining winner yields 204. See DSP integration for the distinction between bid price and ${AUCTION_PRICE}.
Protocol and implementation checked: 2026-09-19.