# rtblint.org · full content
RTBlint is a free, open-source OpenRTB validator. This file contains the
full text of every page on the site, one section per URL, for AI
crawlers that ingest llms-full.txt. The compact index is at /llms.txt.
---
# RTBlint · The open-source OpenRTB validator
URL: https://rtblint.org/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
## Validate OpenRTB before it bids.
Check bid requests and responses against a selected OpenRTB version and exchange profile. Get a rule ID and JSON path for each finding, then run the same Rust core in your application or CI.
Open the tester Read the docs
Validation runs in your browser. Entered payloads may be stored; choose whether to share them before pasting. See privacy details.
cargo install rtblint npm install rtblint-core rtblint validate request.json
Open source · Apache 2.0 · OpenRTB 2.0–3.0
RTBlint · bid_request.json 2.6-202606
{
"id": "req-banner-example",
"at": "1",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Invalid 1 error · 0 warnings · 0 info
error
at expects integer but received string.
openrtb.type.mismatch at
Change the string to an integer: "at": 1 .
The corrected request has no findings against 2.6-202606 .
Try this example → Open the corrected request →
Built-in example · spec profile · no sample upload
## Start with the task you need to finish.
## Find why a payload fails.
Load a failing request, inspect its rule and field, and compare the correction. Share findings with your integration partner. Debug a payload →
## Catch invalid fixtures in CI.
Add the GitHub Action, select a specification snapshot, and fail a build on validation errors. Set up CI →
## Choose where validation runs.
Compare a library, gRPC sidecar, and captured-stream checks. Trace where payloads and findings go. Compare deployment options →
Check the specification or a partner's documented requirements: Google Authorized Buyers , Prebid Server , Xandr , or Magnite .
Need help integrating RTBlint?
Leave your email and a note about your setup. I'll reply personally. Your email What are you integrating? Optional Add a note (optional) What are you integrating? Optional Website Ask for help Send
Your details are used to reply. Privacy
## Inspect captured traffic without blocking the auction.
Explore a separate consumer that reads captured bid requests and emits validation findings. Select a message to inspect the payload, then open the same example in the tester.
Captured traffic → Separate consumer → Local validator → Findings and summaries
Interactive illustration. Kafka metrics and traffic are synthetic; payload findings are generated by the browser engine against OpenRTB 2.6-202606 , spec profile. Your infrastructure captures traffic; RTBlint reads NDJSON. This is not a packaged Kafka connector.
Kowl
Synthetic bidstream Overview
Topics
Consumers
Schema Registry
OpenRTB 2.6-202606 spec profile
Topics / openrtb.bid-request
Topic openrtb.bid-request rtblint.findings
4 partitions · 12.4M messages · 8.4k/s
Overview Messages Consumers Configuration
Start Offset Newest Partition All Max Results 8 Filter Start stream
Offset Partition Timestamp Key Value Size
1842908 3 2026-09-11 04:08:11.329 req-app {"id":"req-app","imp":[{"id":"1","banner":{"w":300,"h":250}}],"app":{"bundle":"org.example.demo"}} 98 B
1842907 2 2026-09-11 04:08:11.282 req-gdpr openrtb.field.moved {"id":"req-gdpr","imp":[{"id":"1","banner":{"w":300,"h":250}}],"regs":{"ext":{"gdpr":1}}} 89 B
1842906 1 2026-09-11 04:08:11.235 req-enum openrtb.value.invalid {"id":"req-enum","at":99,"imp":[{"id":"1","banner":{"w":300,"h":250}}]} 71 B
1842905 0 2026-09-11 04:08:11.188 req-wide-banner {"id":"req-wide-banner","imp":[{"id":"1","banner":{"w":728,"h":90}}]} 69 B
1842904 3 2026-09-11 04:08:11.141 req-device openrtb.field.deprecated {"id":"req-device","imp":[{"id":"1","banner":{"w":300,"h":250}}],"device":{"didsha1":"synthetic-device-id"}} 108 B
1842903 2 2026-09-11 04:08:11.094 req-missing-imp openrtb.field.required {"id":"req-missing-imp"} 24 B
1842902 1 2026-09-11 04:08:11.047 req-auction-type openrtb.type.mismatch {"id":"req-auction-type","at":"1","imp":[{"id":"1","banner":{"w":300,"h":250}}]} 80 B
Key Value Headers
Offset 1842902
Partition 1
Timestamp 2026-09-11 04:08:11.047
Key req-auction-type
Value encoding JSON
Size 80 B
{
"id" : "req-auction-type" ,
"at" : "1" ,
"imp" : [
{
"id" : "1" ,
"banner" : {
"w" : 300 ,
"h" : 250
}
}
]
}
error openrtb.type.mismatch at at expects integer but received string.
Check this payload in the tester → Explain this rule → 1 total findings · strongest finding shown
1842901 0 2026-09-11 04:08:11.000 req-banner {"id":"req-banner","imp":[{"id":"1","banner":{"w":300,"h":250}}]} 65 B
Design a capture or sidecar workflow → Copy a captured-stream command →
Versioned changes cataloged
64
Versions covered
2.0 → 3.0
Runs
On your stack
License
Apache 2.0
## See which specification changes affect your integration.
Each square represents a change in RTBlint's versioned rule catalog. Follow a row to inspect its fields and migration notes before choosing a snapshot for validation.
Added Moved, corrected, or restructured Deprecated or removed
2.0
2012
4
Shared request objects for display, mobile, and video. Inspect 2.0 →
2.1
2012
3
More content categories and location provenance. Inspect 2.1 →
2.2
2014
4
Private marketplace deals, secure inventory, and COPPA. Inspect 2.2 →
2.3
2015
5
Native request assets, followed by 2.3.1 corrections. Inspect 2.3.1 →
2.4
2016
4
Audio inventory and video skippability. Inspect 2.4 →
2.5
2016
6
Source, metrics, video placement, and loss notices. Inspect 2.5 →
2.6
2022–2026
31
Dated snapshots for CTV, privacy, identity, and video placement. Inspect 2.6-202606 →
3.0
2018
7
A layered transport envelope with AdCOM domain objects. Inspect 3.0 →
Source: RTBlint's generated rule catalog ( 64 entries). The 2.6 row groups dated snapshots; counts describe cataloged changes, not complete validation coverage. Compare all snapshots and coverage notes.
## Find the field that needs attention.
Use the finding type to choose your next step. These examples open in the tester or reference docs so you can investigate the rule in context.
## Find missing request data. imp: []
Check JSON syntax, the request ID, and the impressions needed to describe the opportunity. Inspect the check →
## Spot fields your snapshot cannot use. device.didsha1
Unknown, deprecated, and removed fields are reported at their JSON paths, with findings specific to the selected version. Inspect the check →
## Follow a field to its new path. regs.ext.gdpr → regs.gdpr
For a moved field, inspect its replacement path. Video placement and plcmt need a separate enum migration. Inspect the check →
## Correct a value's JSON type. "at": "1" → "at": 1
An auction type should be an integer. A string that looks like a number still produces a type mismatch. Inspect the check →
## Check documented enum values. "at": 99
A well-typed integer can still be outside the allowed set. Exchange profiles may add documented values. Inspect the check →
## Reproduce your partner's checks. version + profile
Select the exact snapshot and exchange profile before comparing reports. Rule depth varies by version and protocol. Inspect the check →
## Read a finding and reproduce its correction.
This is the same auction-type error shown above. Its rule ID identifies the check, its path identifies the field, and the selected snapshot makes the report reproducible.
error
at expects integer but received string.
openrtb.type.mismatch at
Rule ID Look up the diagnostic ID and use it to group recurring failures in reports.
JSON path The field to change. Here, at contains a string and needs the integer 1.
Validation context OpenRTB 2.6-202606 · spec profile · same engine as the tester.
"at": "1" → "at": 1 No findings against 2.6-202606 Verify the correction →
## Make the validation boundary clear.
## Trace the check to the specification.
Review versioned changes and diagnostic references before changing a payload. A valid report does not guarantee a bid or partner acceptance. Check coverage and limits →
## Keep validation close to your application.
The local CLI, library, and gRPC service do not upload payloads. The browser tester and hosted MCP have separate sharing and storage behavior. Compare data flow →
## Turn a finding into an actionable report.
Share the rule ID, field path, selected version, and profile. Use the same context in fixtures and CI to make a failure reproducible. Add a fixture to CI →
## Run the same checks where you need them.
## Validate a local fixture.
Read a file or stdin, choose the snapshot and profile, and return JSON findings. Validation errors can fail a CI job. CLI reference →
## Give your agent a validation tool.
Connect through hosted rtblint.org/mcp or local stdio. Hosted payloads may be stored; local rtblint-mcp does not upload them. MCP setup →
## Inspect a payload in the browser.
Check a request or response locally through WebAssembly. Choose your sharing preference before entering a payload, then inspect its findings. Open the tester →
## Start with a command you can run.
Copy a local, CI, or captured-stream example. Each selects the same specification snapshot as the visual examples above.
Local CLI GitHub Action Captured stream
Install the CLI, save your payload as request.json, and return a machine-readable report. Validation errors produce a failing exit code.
Local CLI · OpenRTB 2.6-202606 Copy example
cargo install rtblint
rtblint validate request.json --version 2.6-202606 --format json
CLI flags and library setup →
## Prepare for protocol changes before you deploy.
Read the release context and integration implications behind specification and ecosystem changes.
## DecryptAds mapped more than 2,100 AI recipe domains through ads.txt footprints, and the OpenRTB request still looks like food inventory.
The Oct 20 DecryptAds study expanded roughly 400 manually confirmed AI recipe sites into more than 2,100 MFA domains using ads.txt account IDs and 190 technical footprints. Buyers who validate only site.domain and category fields never see authorship or seller vetting on the bid. Read the post →
## Google Ad Manager now sends site.pagecat on Ad Exchange requests, and Prebid bidders on the same page still get whatever you put in ortb2.site.
Starting October 15, 2026, Google populates site.cat, site.pagecat, app.cat, and app.pagecat on Authorized Buyers, Open Bidding, and SDK bid requests outside the EEA, UK, and Switzerland. Prebid demand still receives only the publisher ortb2.site object, which is often empty, so contextual models split by path on one URL. Read the post →
## Prebid wants ad servers to bid into the header auction so AdX can compete without GAM seeing the winning price first.
At the October 2026 Prebid Summit, a working group proposed reversing the flow so GAM bids into Prebid instead of Prebid feeding GAM. That would functionally unbundle AdX from the ad server and collapse two auction calls into one, but the framework is built for Prebid Server and Google has not committed to that path. Read the post →
## See what you can use today and what is planned.
Shipped
Validate requests and responses across OpenRTB 2.x.
Versioned catalogs, field checks, and paired response validation. Explore this capability →
Shipped
Run the same core in your preferred environment.
CLI, Rust and Node libraries, gRPC, browser tester, and MCP. Explore this capability →
Shipped
Inspect the OpenRTB 3.0 envelope and AdCOM objects.
Check the transport layer and the domain objects it references. Explore this capability →
Shipped
Resolve supply-chain references against your local cache.
Opt-in checks join schain with sellers.json and ads.txt or app-ads.txt. Explore this capability →
Shipped
Find recurring issues in captured traffic.
NDJSON batch reports and rule-frequency summaries run locally. Explore this capability →
Shipped
Apply a partner's documented protocol requirements.
26 vendor and integration-direction profiles, including documented supplier and bidder contracts. Explore this capability →
Shipped
Fail CI when a fixture produces validation errors.
The GitHub Action returns machine-readable findings and a failing exit code. Explore this capability →
Planned
Embed native bindings in Go and Python services.
Planned bindings. Use the CLI or gRPC service today. Follow the project →
## Know what a validation result means.
What does a valid result guarantee?
It means no error-level findings were produced by the selected version and profile. It does not guarantee a bid, exchange acceptance, legal compliance, or compliance with a partner's business rules. Warnings and informational findings still need review. Check validation scope → Where does my payload go?
Browser validation runs locally through WebAssembly. Entered tester payloads may be stored with identifiers stripped if sharing is enabled; choose before pasting. Built-in examples are not uploaded. Hosted MCP has separate storage terms. The local CLI, library, and gRPC sidecar do not upload payloads. Read the data handling policy → How do I make checks repeatable?
Pin both the RTBlint release and the OpenRTB snapshot. Select the same exchange profile across environments, keep representative fixtures in your repository, and use JSON reports to track rule IDs and field paths. Error-level findings fail validation; warnings do not. Set up CI checks → Is RTBlint free and official?
RTBlint is independent of IAB Tech Lab and open source under Apache 2.0. You can use the browser tester without an account and run the validator on your own infrastructure. Read the project documentation →
## Try a request and inspect its findings.
Start with a built-in example, then bring the check into your workflow.
Open the tester GitHub
Tester ARTF simulator Docs OpenRTB spec guide Version history Rule reference What RTBlint checks CLI & library MCP server Bid request anatomy Enum reference Guides Answers FAQ Blog placement vs plcmt No-bid reason codes Privacy Stop session recording Terms GitHub
RTBlint · open-source OpenRTB validator · Apache 2.0 · independent of IAB Tech Lab
---
# OpenRTB Bid Request & Response Tester · RTBlint · RTBlint
URL: https://rtblint.org/tester/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
## OpenRTB bid request & response tester
Paste JSON or load a scenario. Findings appear as you type. Validation runs in your browser. Choose whether to share entered payloads below; see the terms and privacy pages. Stop session recording . For a simulated exchange hop, open the ARTF simulator .
Checking your sharing preference… Share entered payloads to improve RTBlint
Validation runs in your browser. When sharing is on, entered payloads may be stored after known identifiers, IPs, and consent strings are stripped. Built-in examples contribute validation metadata without their JSON. Per-run validation metadata is retained for 30 days. Turning sharing off also stops session recording and tester activity logs in this browser. This preference applies to this browser's tester.
Privacy details · Terms
Bid request Bid response ARTF envelope ARTF mutations
Scenario Minimal banner
Dialect Spec JSON Protobuf JSON Profile OpenRTB specification Google Authorized Buyers Prebid Server Microsoft Monetize bidder Magnite DV+ xAPI Display & Video 360 Index Exchange DSP Index Exchange supplier ingest (request only) Unity Exchange Vungle Exchange BidSwitch buyer 5.7 BidSwitch supplier 1.1 InMobi DSP InMobi supplier ingest MobileFuse in-app bidding MobileFuse SDK bidding AppLovin ALX DSP response (response only) Commerce Grid supplier ingest (request only) Digital Turbine Exchange Sovrn request (request only) Equativ bidder contract Equativ supplier ingest TripleLift supplier ingest Adform OpenRTB handler Yandex SDK bidding PubMatic OpenWrap wire contract PubMatic OpenWrap CTV middleware Version Latest
Format Upload Clear Copy link Anyone with the link can open the saved input for 90 days.
The smallest realistic display request: one banner imp with primary and fallback sizes, a site with publisher, secure flag set, and an explicit USD floor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 {
"id": "req-banner-1",
"at": 1,
"cur": ["USD"],
"tmax": 300,
"site": {
"id": "site-1",
"domain": "news.example.com",
"page": "https://news.example.com/article/123",
"publisher": { "id": "pub-9" }
},
"device": {
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"devicetype": 2,
"ip": "203.0.113.7"
},
"imp": [
{
"id": "1",
"secure": 1,
"bidfloor": 0.85,
"bidfloorcur": "USD",
"banner": {
"w": 300,
"h": 250,
"format": [{ "w": 300, "h": 250 }, { "w": 336, "h": 280 }],
"pos": 1
}
}
]
}
⌘/Ctrl+Enter revalidates · click a finding path to jump
Validating… What this checks
Bid request and bid response validation, standalone or a response against the request it answers, plus ARTF envelopes and mutation sets. Object catalogs cover OpenRTB 2.0–3.0; rule depth is richest on the 2.6 snapshots, and 3.0 validates its envelope and transport objects, including the AdCOM 1.0 catalog under item.spec, bid.media, and request.context. The dialect selects how flag fields such as imp.secure and regs.coppa are read: integers in spec JSON, booleans in protobuf JSON . The profile applies an exchange's documented extras on top of the spec: google-ab requires Imp.ext.billing_id ; prebid-server requires a bidder or stored request per Imp ; xandr requires seller_member_id and video context; magnite requires xAPI zone/site/account ids.
---
# ARTF lab
URL: https://rtblint.org/demo/artf/
ARTF lab
Skip to content
Replay Build Play Step Reset
SSP sidecar is plugged in beside the exchange. Toggle agents or autoplay a hop.
AdCP minutes MCP / JSON · Plan, negotiate, transact.
ARTF milliseconds gRPC GetMutations · Patch this auction, and propose without owning it.
OpenRTB the object bid request / response · What DSPs actually parse.
## SSP / exchange host
GetMutations runs on the publisher bid request for curator, audience, and metrics, and the host applies none, some, or all before it fans out to DSPs.
## DSP host
GetMutations runs on the bid response, BID_SHADE is the clean case, and the host decides whether the shaded bid still leaves.
## Colocated bidder
Index Cloud plus a full DSP binary is adjacent, not GetMutations. Do not demo that as an ARTF mutation agent.
Agent is an OCI container beside the host. No egress. Least data. GetMutations proposes. Host applies none, some, or all. Spec does not revalidate OpenRTB after apply.
Gate on error Apply anyway
Agent tmax 150 ms inside auction tmax 300 ms · PUBLISHER_BID_REQUEST · exchange-7
ACTIVATE_SEGMENTS ACTIVATE_DEALS SUPPRESS_DEALS ADJUST_DEAL_FLOOR ADD_METRICS
SSP Illegal patch SSP eng Poison metric DSP Curation lands Publisher Deal leaves the wire DSP bid Shade the bid SSP ops Margin has no home
Host Host Agent Agent Lint Lint Apply skip Gate Gate
Hop
In CTV mid-roll
Host SSP · exchange-7
ARTF curator
Check WASM lint
Out DSP · not called
Intents → OpenRTB
BID_SHADE seatbid[].bid[].price
ADJUST_DEAL_FLOOR deals[].bidfloor
ACTIVATE_DEALS imp.pmp.deals[]
adjustDeals unknown path
ADJUST_DEAL_MARGIN (none in OpenRTB 2.6)
Stream with this sidecar
72 In
0 Rewrite
64 Drop
8 Forward
rewrite drop forward unchanged
This session
Why this hop matters
## gRPC 0 is not a legal auction
The agent returned mutations and the RPC can succeed, while paths, lifecycle, and dialect can still be illegal, and pass 2 is the first time the auction is asked.
## Ticket
Host exchange-7 · publisher bid request
Site streaming.example · 1920×1080
Floor $8.00
Deals deal-premium $12.00 deal-standard $6.00
Segments seg-sports
Metrics none
Bid none
## Mutations
Waiting on the agent.
## Lint
Not run yet.
## Wire GetMutations request
{
"id": "extension-point-001",
"tmax": 150,
"lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST",
"originator": {
"type": "TYPE_EXCHANGE",
"id": "exchange-7"
},
"applicable_intents": [
"ACTIVATE_SEGMENTS",
"ACTIVATE_DEALS",
"SUPPRESS_DEALS",
"ADJUST_DEAL_FLOOR",
"ADD_METRICS"
],
"bid_request": {
"id": "auction-9001",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"imp": [
{
"id": "imp-1",
"secure": true,
"instl": false,
"bidfloor": 8,
"bidfloorcur": "USD",
"video": {
"mimes": [
"video/mp4"
],
"minduration": 15,
"maxduration": 30,
"w": 1920,
"h": 1080,
"protocols": [
2,
3,
5,
6
],
"linearity": 1,
"plcmt": 1,
"skip": false
},
"pmp": {
"private_auction": true,
"deals": [
{
"id": "deal-premium",
"bidfloor": 12,
"bidfloorcur": "USD",
"at": 1
},
{
"id": "deal-standard",
"bidfloor": 6,
"bidfloorcur": "USD",
"at": 2
}
]
}
}
],
"site": {
"id": "site-42",
"domain": "streaming.example",
"page": "https://streaming.example/watch/12345",
"mobile": false,
"content": {
"id": "content-12345",
"livestream": false,
"len": 3600
}
},
"device": {
"dnt": false,
"lmt": false,
"ua": "Mozilla/5.0"
},
"user": {
"id": "user-77",
"data": [
{
"id": "dmp-1",
"name": "Example DMP",
"segment": [
{
"id": "seg-sports"
}
]
}
]
},
"regs": {
"coppa": false,
"gdpr": false
}
}
} GetMutations response
{
"id": "extension-point-999",
"mutations": [
{
"intent": "BID_SHADE",
"op": "OPERATION_REPLACE",
"path": "/seatbid/dsp-1/bid/bid-abc",
"adjust_bid": {
"price": -2.5
}
},
{
"intent": "ADJUST_DEAL_FLOOR",
"op": "OPERATION_REPLACE",
"path": "/imp/imp-404/pmp/deals/deal-premium",
"adjust_deal": {
"bidfloor": 3
}
},
{
"intent": "ADJUST_DEAL_FLOOR",
"op": "OPERATION_REPLACE",
"path": "/imp/imp-1/pmp/deals/deal-unlisted",
"adjust_deal": {
"bidfloor": 3
}
},
{
"intent": "ACTIVATE_DEALS",
"op": "OPERATION_ADD",
"path": "/imp/imp-1",
"adjust_bid": {
"price": 4
}
},
{
"intent": "adjustDeals",
"op": "replace",
"path": "/imp/imp-1/deals/deal-standard",
"value": {
"AdjustDealPayload": {
"bidfloor": 7.25
}
}
},
{
"intent": "ADJUST_DEAL_MARGIN",
"op": "OPERATION_REPLACE",
"path": "/imp/imp-1/pmp/deals/deal-standard",
"adjust_deal": {
"margin": {
"value": 140,
"calculation_type": "PERCENT"
}
}
}
]
} Home Tester ARTF lab Docs Guides Answers FAQ Blog GitHub
---
# Docs · RTBlint
URL: https://rtblint.org/docs/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Overview + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## RTBlint documentation
How RTBlint validates OpenRTB bid requests, what each finding means, and how to run the same checks from the tester, the Rust core, or the CLI.
## What RTBlint checks
RTBlint validates an OpenRTB bid request or bid response against a tracked snapshot of the specification. It is a structural and semantic linter, not a schema-only check: it parses the JSON, walks the object tree against the canonical OpenRTB catalog, and reports anything that does not belong, is in the wrong place, or has the wrong type, plus a semantic rule pack for cross-field checks the catalog alone cannot express.
OpenRTB 3.0 validates through its layered envelope: the transport objects (Openrtb, Request, Item, Deal, Source, Response, Seatbid, Bid) and the AdCOM 1.0 domain objects under item.spec, bid.media, and request.context. A 2.x payload sent to a 3.0 validator gets a diagnostic naming where each object moved.
## Rule ids
Every issue carries a stable rule id and, where it applies, the JSON path that tripped it. The id is the contract: it does not change when wording changes, so you can match on it in CI. A representative sample is below; see the full rule reference for every id RTBlint emits.
Rule id Severity Meaning
openrtb.payload.invalid_json error The payload is not parseable JSON. No field rules run until this is fixed.
openrtb.field.undefined error A field is not defined in the canonical OpenRTB catalog for the selected version.
openrtb.field.deprecated warning A field still parses but is deprecated in the selected version. Migrate to its replacement.
openrtb.field.moved error A field moved to a different path in this version (for example regs.ext.gdpr → regs.gdpr).
openrtb.schain.node.hp_missing warning A SupplyChain node has no hp field; the spec expects it to be propagated on every node.
openrtb.native.request.double_encoded error native.request parses to another JSON string rather than an object: it was JSON-encoded twice.
openrtb.request.tmax_implausible warning tmax is unusually high for an RTB auction; likely seconds instead of milliseconds.
## OpenRTB protocol reference
Beyond the validator, the docs cover the protocol details that usually live in the spec PDF: object anatomy, enumerated lists, privacy signals, and the fields that changed between versions.
OpenRTB bid request: objects and required fields
OpenRTB bid response: seatbid, bid, and win notices
OpenRTB enumerated lists reference
Privacy signals in OpenRTB: gdpr, gpp, us_privacy, coppa
OpenRTB supply chain object (schain)
AdCOM 1.0 object reference: media, placement, context
Native ads in OpenRTB
OpenRTB Video object: every field, grouped by what it controls
video.plcmt in OpenRTB: values, versions, and what buyers filter on
OpenRTB Audio object: podcast and streaming audio bid requests
CTV in OpenRTB: video object, ad pods, plcmt
tmax in OpenRTB: auction timeouts explained
Bid floors in OpenRTB: bidfloor and bidfloorcur
OpenRTB substitution macros
## Tracked versions
RTBlint tracks OpenRTB 2.6 by release snapshot (2.6-202204 through 2.6-202606) so that deprecations and moved fields are reported against the exact version you target. The tester defaults to the latest 2.6 snapshot; pick an older one to validate against it.
## Run it yourself
The tester is the RTBlint Rust core compiled to WASM. The same core is available as a library and CLI:
Rust: rtblint-core and the rtblint CLI on crates.io
CLI: rtblint validate request.json or rtblint validate --stdin
Start with the bid request tester to see the output shape, then wire the same checks into your pipeline.
---
# What is OpenRTB · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## What is OpenRTB
OpenRTB is the IAB Tech Lab protocol that lets publishers and advertisers transact ad impressions in a real-time auction. It is the JSON spoken between an exchange and the bidders connected to it.
## The auction in one paragraph
When a user opens a page or a streaming app, the publisher side packages the opportunity into a bid request : who and what is available, on which device, under which privacy signals. The exchange sends that request to many bidders at once. Each bidder that wants the impression returns a bid response with a price and the creative to serve. The highest eligible bid wins, and all of this happens in roughly the time it takes the page to render.
## The bid request
A bid request is a single JSON object. At the top sit a request id and an imp array, one entry per impression on offer. Each impression declares its media type as a banner , video , audio , or native object. Surrounding objects describe context and constraints:
site or app : where the impression appears
device and user : who is seeing it
regs : regulatory signals such as GDPR, COPPA, and US privacy
source : the supply chain and the entity responsible for the request
Small mistakes here are expensive: a malformed field, a value in the wrong place, or a type the bidder does not expect can drop the impression from the auction entirely, and the failure is silent.
## The bid response
The response mirrors the request: a seatbid array of bids, each with a price, a creative, and the macros the exchange will substitute at win time. Response validation is on the RTBlint roadmap; the current core focuses on the bid request.
## Where RTBlint fits
RTBlint validates the bid request as structured JSON against a tracked snapshot of the OpenRTB specification, before it is sent or as it is received. It is the layer that catches a bad payload at the boundary rather than letting it fail quietly in the auction.
See what RTBlint checks , or paste a request into the tester .
---
# OpenRTB versions · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## OpenRTB versions
OpenRTB is not a single frozen document. The 2.x line has shipped continuous revisions, and a field can be added, deprecated, moved, or removed between them. RTBlint tracks those revisions as dated snapshots so the result matches the version you actually run.
## Why snapshots, not just 2.6
Calling a request OpenRTB 2.6 is not precise enough. Between the 2.6 revisions, fields such as the GDPR signal moved out of an ext block and onto a first-class path. Validate against the wrong revision and you either miss a moved field or flag one that is correct for your partner. A dated snapshot pins the exact rule set.
## Tracked 2.6 snapshots
The tester defaults to the latest snapshot. Pick an earlier one to validate against the revision your exchange or bidder is on.
2.6-202204
2.6-202210
2.6-202211
2.6-202303
2.6-202309
2.6-202402
2.6-202409
2.6-202501
2.6-202505
2.6-202606
## Every tracked version
Each version page describes its release and cataloged changes, and lists object catalog, schema, and validation coverage. There are 18 documented versions and 17 supported for validation. The April 2022 archive has no extracted object catalog.
OpenRTB 2.0 ( 2012-01 )
OpenRTB 2.1 ( 2012-10 )
OpenRTB 2.2 ( 2014-04 )
OpenRTB 2.3 ( 2015-01 )
OpenRTB 2.3.1 ( 2015-06 )
OpenRTB 2.4 ( 2016-03 )
OpenRTB 2.5 ( 2016-12 )
OpenRTB 2.6-202204 ( 2022-04 ) · exact validation unavailable
OpenRTB 2.6-202210 ( 2022-10 )
OpenRTB 2.6-202211 ( 2022-11 )
OpenRTB 2.6-202303 ( 2023-04 )
OpenRTB 2.6-202309 ( 2023-09 )
OpenRTB 2.6-202402 ( 2024-02 )
OpenRTB 2.6-202409 ( 2024-09 )
OpenRTB 2.6-202501 ( 2025-01 )
OpenRTB 2.6-202505 ( 2025-05 )
OpenRTB 2.6-202606 ( 2026-06 )
OpenRTB 3.0 ( 2022-03 )
## Earlier 2.x and 3.0
RTBlint ships object catalogs for 17 of the 18 documented versions, 2.0 through 3.0, so undefined-field and type checks work across the whole line, and each version carries a profile describing what that release changed. Rule depth (deprecations, moves, and the semantic checks) is richest on the tracked 2.6 snapshots. Bid responses validate on each supported version too, standalone or against the request they answer. OpenRTB 3.0 wraps everything in an openrtb envelope and validates through it: the transport objects are checked in full, and so are the AdCOM objects under item.spec , bid.media , and request.context .
See what RTBlint checks for the categories, or the rule reference for the ids that fire when a field is deprecated, moved, removed, or not yet available in the selected snapshot. Each supported version also has downloadable JSON Schema generated from the same catalogs.
---
# What RTBlint checks · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/what-rtblint-checks/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What RTBlint checks + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## What RTBlint checks
RTBlint is a structural and semantic linter, not a schema-only check. It parses the JSON, walks the object tree against the canonical OpenRTB catalog for the version you target, and reports anything that does not belong, sits in the wrong place, or has the wrong type.
## JSON well-formedness
The payload must parse as a JSON object. A syntax error or a non-object root is reported first, and no field rules run until it is fixed.
## Required fields
Fields the specification marks as required must be present. A bid request needs an id and at least one impression; an impression needs a media type object.
## Undefined fields
Every object is walked against the canonical OpenRTB catalog for the selected version. A field that is not defined there is flagged so typos and invented keys do not slip through as ext-like noise.
## Type mismatches
A field declared as a string, integer, array, or object must carry that type. A string where an integer belongs, or an object where an array belongs, is reported with the path that tripped it.
## Deprecated, moved, and removed paths
Versioned status is tracked per snapshot. A deprecated field still parses but warns; a moved field points at its new path (for example regs.ext.gdpr to regs.gdpr); a removed field is an error in versions that dropped it.
## Enum values
Fields constrained to a documented set of integer or string values are checked against that set, so an out-of-range enum is caught rather than passed downstream.
## Semantic rules
A narrow set of cross-field rules runs beyond per-field structure: mutually exclusive fields, media-type requirements on an impression, and conditional requirements such as fields that only apply to skippable video.
## Supply-chain resolution (CLI, opt-in)
With --resolve --cache, each SupplyChain payment hop is checked against that domain's sellers.json, and the first payment hop against the publisher's ads.txt or app-ads.txt. The cache is a local directory; nothing is fetched. The WASM tester and npm package stay offline.
## NDJSON stream (CLI)
--batch lints one payload per line from a captured bid stream. --summary ranks rule ids by how often they fired, so a million-line dump answers which defects dominate rather than printing every finding.
## Exchange profiles
Select an exchange and integration direction to apply documented extension types, values, conditional requirements and captured request/response constraints. Google Authorized Buyers and Prebid Server retain their endpoint rules. Microsoft Monetize bidder and Magnite DV+ xAPI validate optional extensions without fabricating inventory-identity minima. BidSwitch, Index Exchange, Equativ and other partners have separate directional contracts. Unsupported payload directions produce a scope warning and canonical checks. The tester and CLI profile catalog list every supported ID. Account activation, live creative approval and private bidder configuration require external evidence.
## Nested specs
OpenRTB parks whole protocols in strings and ext objects. Native Ads 1.2 markup in imp.native.request and native bid.adm is walked for assets, ids, and subtypes, and paired against the request when one is supplied. GPP headers are decoded and compared to gpp_sid; TCF 2 shape is checked on user.consent. ${AUCTION_*} macros are scanned on nurl, burl, lurl, and adm. EID source/uids/id are required; device.sua is walked as UserAgent. imp.ext.skadn and bid.ext.skadn follow the IAB SKAdNetwork community extension. VAST inside adm is still a document-root sniff.
## Privacy signal contradictions
Declared flags are checked against identifiers on the same payload. regs.coppa, device.lmt, device.dnt, and regs.gdpr versus a live IFA, eids, or user ids; TCF Purpose 1 versus device-storage identifiers; US Privacy Opt-Out Sale versus hashed eids; email-shaped user.id or site.page; DSA Transparency field presence. Findings state facts about the document. They do not state a legal conclusion. Consent-string forensics (GVL, CMP lists) are not included.
## What it does not do yet
The current core validates OpenRTB 2.x and 3.0 bid requests and bid responses, including AdCOM 1.0 domain objects on 3.0. Nested specs cover Native Ads 1.2 markup, GPP/TCF string shape, OpenRTB macros, EID/SUA, and SKAdNetwork extensions. Privacy checks cover payload-versus-declaration contradictions, not consent-string forensics. VAST inside bid.adm is still a document-root sniff, not a full pass of the XML the player will read. That check is VAST versus the OpenRTB envelope . Exchange profiles cover documented protocol extras (Google directional supplier and bidder contracts). Business policy stays separate. Native Go/Python bindings are still on the roadmap. Passing RTBlint also does not guarantee a bid: exchanges, bidders, and private deals impose their own requirements on top of the specification.
Each finding carries a stable id and a path. See the rule reference for the full list, or OpenRTB versions for how snapshots change the result.
---
# OpenRTB rule catalog · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/rules/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## OpenRTB rule catalog
64 versioned rules across OpenRTB 2.0 through 3.0, one per field that was added, deprecated, moved, removed, or corrected in a release. Each links to its own page with what it means, why it matters, and how to fix it. For the diagnostic codes the validator emits, see the rule reference .
## OpenRTB 2.0 4 rules
Change id Kind Paths
openrtb.2.0.device.geo Added behavior device.geo
openrtb.2.0.device.ifa Added field device.ifa
openrtb.2.0.imp.video Added object imp.video
openrtb.2.0.user.data Added field user.data
## OpenRTB 2.1 3 rules
Change id Kind Paths
openrtb.2.1.enum.content_category.tier2 Added list enum.content_category.tier2
openrtb.2.1.geo.type Added field geo.type
openrtb.2.1.imp.video.behavior Added behavior imp.video
## OpenRTB 2.2 4 rules
Change id Kind Paths
openrtb.2.2.imp.secure Added field imp.secure
openrtb.2.2.pmp.deals Added behavior imp.pmp.deals
openrtb.2.2.regs.coppa Added field regs.coppa
openrtb.2.2.traffic.feedback.bot Added guidance traffic.feedback.bot
## OpenRTB 2.3.1 2 rules
Change id Kind Paths
openrtb.2.3.1.macro.auction_bid_id Added behavior macro.${AUCTION_BID_ID}
openrtb.2.3.1.user.buyeruid Corrected field user.buyuid
## OpenRTB 2.3 3 rules
Change id Kind Paths
openrtb.2.3.imp.native Added object imp.native
openrtb.2.3.imp.native.request Added field imp.native.request
openrtb.2.3.native.assets Added behavior native.assets
## OpenRTB 2.4 4 rules
Change id Kind Paths
openrtb.2.4.geo.location Added behavior geo
openrtb.2.4.imp.audio Added object imp.audio
openrtb.2.4.imp.secure.ssl Added behavior imp.secure
openrtb.2.4.imp.video.skip Added field imp.video.skip
## OpenRTB 2.5 6 rules
Change id Kind Paths
openrtb.2.5.bid.response_urls Added field bid.burl, bid.lurl, bid.tactic, bid.language, bid.wratio, bid.hratio
openrtb.2.5.bidrequest.bseat_wlang Added field bidrequest.bseat, bidrequest.wlang
openrtb.2.5.bidrequest.source Added field bidrequest.source
openrtb.2.5.imp.metric Added field imp.metric, metric
openrtb.2.5.imp.video.placement Added field imp.video.placement, imp.video.playbackend
openrtb.2.5.macro.loss Added macro macro.${AUCTION_MBR}, macro.${AUCTION_LOSS}
## OpenRTB 2.6-202211 3 rules
Change id Kind Paths
openrtb.2.6-202211.imp_qty_bidrequest_dooh Added object imp.qty, bidrequest.dooh
openrtb.2.6-202211.inventorypartnerdomain Moved field site.ext.inventorypartnerdomain, app.ext.inventorypartnerdomain
openrtb.2.6-202211.regs.gpp Added field regs.gpp, regs.gpp_sid
## OpenRTB 2.6-202303 4 rules
Change id Kind Paths
openrtb.2.6-202303.imp.refresh Added object imp.refresh, refresh.refsettings
openrtb.2.6-202303.imp.video.placement Deprecated field imp.video.placement
openrtb.2.6-202303.imp.video.plcmt Added field imp.video.plcmt
openrtb.2.6-202303.macro.auction_imp_ts Added macro macro.${AUCTION_IMP_TS}
## OpenRTB 2.6-202309 3 rules
Change id Kind Paths
openrtb.2.6-202309.bidrequest.acat Added field bidrequest.acat
openrtb.2.6-202309.deal.floor_fields Added field deal.guaranteed, deal.mincpmpersec
openrtb.2.6-202309.durfloors Added object imp.video.durfloors, imp.audio.durfloors, deal.durfloors
## OpenRTB 2.6-202402 1 rule
Change id Kind Paths
openrtb.2.6-202402.imp.video.poddedupe Added field imp.video.poddedupe
## OpenRTB 2.6-202409 2 rules
Change id Kind Paths
openrtb.2.6-202409.cookie_sync_guidance Added guidance appendix.cookie_sync
openrtb.2.6-202409.eid.matching Added field eid.inserter, eid.matcher, eid.mm
## OpenRTB 2.6-202501 1 rule
Change id Kind Paths
openrtb.2.6-202501.content.gtax_genres Added field content.gtax, content.genres
## OpenRTB 2.6-202505 1 rule
Change id Kind Paths
openrtb.2.6-202505.data.cids Added field data.cids
## OpenRTB 2.6-202606 2 rules
Change id Kind Paths
openrtb.2.6-202606.content.liveness Added field content.realtime, content.firstbroadcast
openrtb.2.6-202606.macro.auction_discount Added macro macro.${AUCTION_DISCOUNT_PCT}, macro.${AUCTION_DISCOUNT_CPM}
## OpenRTB 2.6-202204 14 rules
Change id Kind Paths
openrtb.2.6.bid.apis Added field bid.apis
openrtb.2.6.bid.mtype Added field bid.mtype
openrtb.2.6.cattax Added field bidrequest.cattax, site.cattax, app.cattax, publisher.cattax, content.cattax, producer.cattax, bid.cattax
openrtb.2.6.deprecated_fields Deprecated field imp.video.sequence, imp.audio.sequence, device.didsha1, device.didmd5, device.dpidsha1, device.dpidmd5, device.macsha1, device.macmd5, user.yob, user.gender, bid.api
openrtb.2.6.imp.rwdd_ssai Added field imp.rwdd, imp.ssai
openrtb.2.6.imp.video_audio.pod_bidding Added field imp.video.maxseq, imp.video.poddur, imp.video.podid, imp.video.podseq, imp.video.mincpmpersec, imp.video.slotinpod, imp.audio.maxseq, imp.audio.poddur, imp.audio.podid, imp.audio.podseq, imp.audio.mincpmpersec, imp.audio.slotinpod
openrtb.2.6.imp.video_audio.rqddurs Added field imp.video.rqddurs, imp.audio.rqddurs
openrtb.2.6.language.bcp47 Added behavior language.bcp47
openrtb.2.6.macro.min_to_win Added macro macro.${AUCTION_MIN_TO_WIN}
openrtb.2.6.network_channel_supplychain_eids Added object network, channel, source.schain, source.schain.nodes, user.eids, eid.uids
openrtb.2.6.regs.gdpr Moved field regs.ext.gdpr
openrtb.2.6.removed_deprecated_fields Removed field banner.wmax, banner.hmax, banner.wmin, banner.hmin, video.protocol, content.videoquality
openrtb.2.6.user_agent_brandversion Added object device.sua, brandversion
openrtb.2.6.user.consent Moved field user.ext.consent
## OpenRTB 3.0 7 rules
Change id Kind Paths
openrtb.3.0.ads_cert Added behavior inventory_authentication.ads.cert
openrtb.3.0.events Added object event.pending, event.billing, event.loss
openrtb.3.0.item Structural shift request.item
openrtb.3.0.macro_object Added object response.macro
openrtb.3.0.openrtb_root Structural shift openrtb
openrtb.3.0.request_response Structural shift request, response
openrtb.3.0.version_header Added header header.x-openrtb-version
---
# Rule reference · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/rule-reference/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Rule reference
Every issue carries a stable id and, where it applies, the JSON path that tripped it. The id is the contract: it does not change when wording changes, so you can match on it in CI.
## Issue codes are not the whole rule set
The 386 ids below are the diagnostic codes : the kinds of finding RTBlint can report. They are not the body of rules. Each code is parameterized by the object, field, and version that tripped it, and the knowledge behind them comes from three sources:
64 versioned rules across OpenRTB 2.0 through 3.0, each with its own code (for example openrtb.2.2.regs.coppa or openrtb.2.3.imp.native ) describing a field that was added, deprecated, moved, removed, or corrected in a specific release.
Per-version object catalogs defining every object and field. The 2.6-202606 catalog alone covers 38 objects and 417 fields; across 17 extracted catalogs in 18 documented versions that is 485 objects and 10,614 field definitions. Every presence, type, enum, and undefined-field check is driven by these.
A semantic rule pack of cross-field checks the catalogs alone cannot express: SupplyChain node hygiene, GPP and US Privacy string coherence, CTV ad-pod duration sanity, native request encoding, and tmax/currency/bidfloor plausibility.
So a single code like openrtb.type.mismatch stands behind hundreds of concrete field checks. The table is the taxonomy; the catalog and rule pack are the coverage.
## Diagnostic codes
Each code has its own page covering what it means, why it costs money, how to fix it, and a payload fragment that trips it. Click through any row.
Rule id Severity Meaning
openrtb.privacy.signal_conflict warning A canonical privacy field and its legacy extension disagree.
openrtb.payload.invalid_json error The payload is not parseable JSON. No field rules run until this is fixed.
openrtb.payload.root_not_object error The JSON parses but the root is not an object. A bid request must be a single JSON object.
openrtb.field.required error A field the specification marks as required is missing at this path.
openrtb.field.undefined error The field is not defined in the canonical OpenRTB catalog for the selected version. Usually a typo or an invented key.
openrtb.field.deprecated warning The field still parses but is deprecated in the selected version. Migrate to its replacement.
openrtb.field.moved error The field moved to a different path in this version, for example regs.ext.gdpr to regs.gdpr.
openrtb.field.removed error The field was removed in the selected version and is no longer valid.
openrtb.field.not_yet_available error The field belongs to a later version than the one selected, so it is not valid against this snapshot.
openrtb.field.requires_skippable_video error The field only applies to skippable video and was used where skippability is not in effect.
openrtb.fields.mutually_exclusive error Two fields that cannot coexist were both present. Keep one.
openrtb.imp.media_type.required error An impression has no media-type object. Each imp needs a banner, video, audio, or native object.
openrtb.type.mismatch error The value has the wrong JSON type, for example a string where an integer is expected.
openrtb.value.invalid error The value is outside the documented set or range for this field, such as an out-of-range enum.
openrtb.version.unsupported error The targeted version has no usable catalog. Validation refuses rather than passing the payload silently.
openrtb.request.tmax_non_positive error tmax is zero or negative, leaving no time for bids to be received.
openrtb.request.tmax_implausible warning tmax is unusually high for an RTB auction; likely seconds instead of milliseconds.
openrtb.request.cur_format_invalid warning A cur entry is not a three-letter uppercase ISO-4217 currency code.
openrtb.imp.bidfloor_negative error bidfloor is negative; a CPM price cannot be negative. Also fires on Deal.bidfloor.
openrtb.imp.bidfloorcur_format_invalid warning bidfloorcur is not a three-letter uppercase ISO-4217 currency code. Also fires on Deal.bidfloorcur.
openrtb.regs.gpp_sid_without_gpp warning gpp_sid is present but gpp is absent or empty.
openrtb.regs.gpp_without_gpp_sid warning gpp is present but gpp_sid is absent or empty.
openrtb.regs.gpp_malformed warning regs.gpp does not decode as a GPP v1 header (type 3, version 1, Fibonacci section range), or uses an illegal character, or has no '~' sections.
openrtb.regs.gpp_section_mismatch warning The section ids encoded in the GPP header disagree with regs.gpp_sid, or the number of '~' payloads does not match the header.
openrtb.regs.tcf_malformed warning user.consent, legacy user.ext.consent, or a GPP section that should be TCF (sids 2 and 5), is not a TCF 2 core string (starts with C, long enough, TCF alphabet).
openrtb.regs.us_privacy_malformed warning us_privacy does not match the IAB US Privacy string shape: "1" followed by three Y/N/- characters.
openrtb.schain.duplicate_node warning Two adjacent SupplyChain nodes share the same asi and sid, as if a node were appended twice.
openrtb.schain.node.hp_missing warning A SupplyChain node has no hp field; the spec expects it to be propagated on every node.
openrtb.schain.node.identifier_empty error A SupplyChain node's asi or sid is an empty string.
openrtb.schain.ver_unexpected warning SupplyChain ver is something other than 1.0, the only published version.
openrtb.schain.incomplete warning complete is 0, declaring that at least one upstream node is missing from the path.
openrtb.schain.length_implausible warning The declared path has more than ten nodes, which is far longer than a real supply path.
openrtb.schain.duplicate_location warning A supply chain is declared at both source.schain and source.ext.schain.
openrtb.schain.node.hp_unexpected warning A SupplyChain node sets hp to something other than 1.
openrtb.schain.node.asi_not_domain warning A node's asi is not a bare domain: it carries a scheme, a path, a port, or whitespace.
openrtb.schain.node.asi_not_lowercase warning A node's asi contains uppercase characters; canonical domains are lowercase.
openrtb.resolve.sellers_json_unavailable warning The local cache has no sellers.json for this node's asi, so the hop cannot be authorised.
openrtb.resolve.sellers_json_unparseable warning The cached sellers.json for this hop exists but cannot be read as a sellers.json document.
openrtb.resolve.sid_not_in_sellers error This node's sid does not match any seller_id in the cached sellers.json for its asi.
openrtb.resolve.ads_txt_unavailable warning The local cache has no ads.txt for site.domain, so the first payment hop cannot be checked against the publisher's authorization file.
openrtb.resolve.ads_txt_unauthorized error The publisher's ads.txt does not list the first payment node's asi and sid as DIRECT or RESELLER.
openrtb.resolve.app_ads_txt_unavailable warning The local cache has no app-ads.txt for app.bundle, so the first payment hop cannot be checked against the app's authorization file.
openrtb.resolve.app_ads_txt_unauthorized error The app's app-ads.txt does not list the first payment node's asi and sid as DIRECT or RESELLER.
openrtb.video.pod.rqddurs_empty warning video.rqddurs is present as an empty array.
openrtb.video.pod.mincpmpersec_without_pod_context warning video.mincpmpersec is present without poddur or maxseq, which normally accompany a dynamic ad pod.
openrtb.native.request.double_encoded error native.request parses to another JSON string rather than an object: it was JSON-encoded twice.
openrtb.native.request.unparseable warning native.request does not parse as JSON at all.
openrtb.native.request.legacy_wrapper warning native.request is wrapped in a top-level "native" key, the pre-Native-1.1 convention.
openrtb.native.assets_missing error The Native Markup Request or Response has no assets array, or it is empty, and the response has no assetsurl either.
openrtb.native.asset.id_required error A native asset has no integer id, so the response cannot be mapped back to the request.
openrtb.native.asset.id_duplicate error Two native request assets share the same id, so a response cannot map assets unambiguously.
openrtb.native.asset.subtype_required error A native asset has none of those subtypes, or more than one.
openrtb.native.field_required error A Native Ads field the spec marks required is absent: title.len, data.type, video mimes/protocols/duration, eventtracker event/methods, or response text/url/vasttag/value/link.url.
openrtb.native.layout_removed warning The encoded native request still carries layout, which Native 1.1 replaced with plcmttype and context.
openrtb.native.value.invalid error data.type, img.type, eventtrackers.event, or methods carries a value Native Ads does not list (and it is below the vendor range 500+).
openrtb.native.asset.required_missing error The native request marked an asset required, and the bid's adm does not return that id.
openrtb.native.asset.id_unknown error The native adm returns an asset id the request never asked for.
openrtb.native.asset.type_mismatch error The response filled a request title slot with an image, or the other way around.
openrtb.response.seatbid_or_nbr.required error A bid response has neither a seatbid nor a no-bid reason code (nbr).
openrtb.bid.mtype_missing warning A bid carries adm markup but no mtype, on a version that defines mtype. The buyer is leaving the markup type to be sniffed.
openrtb.macro.unknown warning nurl, burl, lurl, or adm contains ${NAME} where NAME is not a documented AUCTION_* macro.
openrtb.bid.price_macro_missing warning nurl or burl is present but neither contains ${AUCTION_PRICE}, so the notice cannot report the clearing price.
openrtb.bid.loss_macro_missing warning lurl is present without ${AUCTION_LOSS}, so the notice cannot report why the bid lost.
openrtb.bid.adm.double_encoded error adm parses to another JSON string rather than an object: the native markup response was JSON-encoded twice.
openrtb.bid.adm.native_not_json error mtype 4 declares native markup, but adm is not a JSON Native Markup Response.
openrtb.bid.adm.markup_type_mismatch error The adm payload contradicts the declared mtype, for example a banner bid carrying a JSON payload.
openrtb.bid.adm.vast_root_missing warning A video or audio bid's adm is XML but has no VAST or DAAST document root.
openrtb.bid.adm.not_markup warning A video or audio bid's adm does not start with an XML tag, so it is unlikely to be a VAST document.
openrtb.pair.request_unusable error Cross-validation was asked for, but the paired bid request does not parse or is not an object.
openrtb.response.request_id_mismatch error The response id does not echo the id of the bid request it answers.
openrtb.response.cur_not_allowed error The response bids in a currency the request did not list in cur.
openrtb.seatbid.seat_not_allowed error The seat is absent from the request's wseat allowlist, or present in its bseat blocklist.
openrtb.bid.impid_unknown error A bid's impid does not match the id of any Imp in the bid request.
openrtb.bid.mtype_not_offered error The bid's mtype names a media type the referenced Imp does not offer, for example a banner bid on a video-only imp.
openrtb.bid.adm.media_type_mismatch error The markup sniffed from adm does not match any media subtype the referenced Imp offers.
openrtb.bid.dealid_unknown warning The bid's dealid is not among the referenced Imp's pmp deals. Out-of-band deals exist, so this is a warning.
openrtb.envelope.missing error An OpenRTB 3.0 payload has no openrtb wrapper. Sending a 2.x payload to a 3.0 validator lands here, with a note on where each object moved.
openrtb.envelope.ver_mismatch warning The envelope's ver declares a different OpenRTB version than the one being validated against.
openrtb.envelope.domainspec_unsupported warning The envelope names a domain spec other than AdCOM, so the objects under item.spec and bid.media are left unchecked.
adcom.placement.subtype_required error item.spec.placement has none of the media subtype objects AdCOM requires.
adcom.ad.subtype_required error bid.media.ad has none of the media subtype objects AdCOM requires.
adcom.asset.subtype_required error A native Asset object has none of the subtype objects AdCOM requires.
adcom.assetformat.subtype_required error A native AssetFormat object has none of the format subtype objects AdCOM requires.
openrtb.pair.unsupported_version warning Request/response cross-validation was asked for on OpenRTB 3.0; the checks are 2.x-only, so the response was validated on its own.
openrtb.dialect.bool_for_integer error A flag field arrived as a boolean. The specification types it as an integer, but the IAB OpenRTB protobuf schema declares it bool, so this is a protobuf JSON payload sent to a spec JSON reader.
openrtb.site.domain_not_domain warning site.domain contains a scheme, path, port, query, fragment, credentials or whitespace.
openrtb.dialect.oneof_conflict error A protobuf native oneof has multiple populated alternatives or both spellings of its object field.
openrtb.dialect.integer_for_bool error The payload was validated as protobuf JSON, and a field the OpenRTB protobuf schema declares bool arrived as an integer. A protojson parser rejects the whole payload.
openrtb.dialect.camel_case_name warning A field arrived under the lowerCamelCase name protojson emits by default, such as privateAuction for private_auction. The field was resolved and validated, but a JSON reader will not find it.
openrtb.eid.field_required error An Extended Identifier object has no source, no uids array, or a UID with no id.
openrtb.sua.browsers_empty warning device.sua is present but browsers is missing or empty, so it cannot replace device.ua.
openrtb.skadn.field_required error imp.ext.skadn or bid.ext.skadn is present but lacks a field the IAB SKAdNetwork OpenRTB extension requires.
openrtb.profile.field_required error An exchange profile was declared, and a field that exchange documents as required is missing or empty.
openrtb.profile.prebid.bidder_required error The Prebid Server profile was declared, and this Imp has no bidder targeting and no stored request that would supply it after merge.
openrtb.profile.field_forbidden error The payload contains a field the declared exchange documents as invalid on that endpoint.
openrtb.profile.value_invalid error A field the exchange documents has a closed value set, and this payload is outside it.
artf.payload.invalid_json error The RTBRequest or RTBResponse could not be parsed as JSON, so no envelope or mutation check can run.
artf.payload.root_not_object error The payload parses but its root is not an object. An RTBRequest and an RTBResponse are each a single message.
artf.field.required error The envelope is missing one of id, lifecycle, tmax, or bid_request, which the ARTF specification marks required.
artf.field.undefined error The envelope carries a member the ARTF proto does not define. Protobuf JSON rejects unknown fields by default.
artf.field.type_mismatch error bid_request or bid_response is present but is not a JSON object, so there is nothing to validate inside it.
artf.tmax.not_integer error tmax carries a non-integer value. It is the milliseconds the exchange allows for mutations to come back.
artf.tmax.non_positive error tmax is zero or negative, so the call is already out of budget when it arrives.
artf.tmax.implausible warning tmax exceeds 1000ms. The extension point runs inside an auction the exchange is already timing out, so a budget this large usually means seconds were sent as milliseconds.
artf.lifecycle.unknown error The lifecycle value is not one the ARTF enum defines, so the agent cannot tell which auction stage it is being called at.
artf.lifecycle.unspecified error The stage is explicitly unset, so the agent does not know which payload is authoritative or which intents apply.
artf.lifecycle.payload_mismatch error lifecycle is LIFECYCLE_DSP_BID_RESPONSE but the envelope has no bid_response, so response-stage intents have nothing to target.
artf.lifecycle.payload_unexpected warning lifecycle is LIFECYCLE_PUBLISHER_BID_REQUEST, which runs before any DSP has answered, yet the envelope carries a bid_response.
artf.originator.type_unknown error The business entity type is outside the enum, so the agent cannot tell whose payload it is being asked to change.
artf.originator.id_missing warning The originator names a type but no identity, so the agent cannot tell which business entity owns the payload.
artf.intents.missing warning The agent is not told which intents it may return, and the orchestrator has no declared basis for rejecting the ones it gets.
artf.intents.not_array error applicable_intents is a repeated field, so its JSON form is an array even when it holds one value.
artf.intents.empty warning The list is present but empty, so every mutation the agent returns is out of scope by definition.
artf.intent.unknown error One of the declared intents is not an ARTF Intent value, so the agent cannot tell what is actually being offered.
artf.request_unusable error The envelope passed alongside the mutation set is not a JSON object, so no mutation can be checked against the auction it targets.
artf.response.id_missing error The response carries no id, so the orchestrator cannot tie the mutations back to the extension point call it made.
artf.response.id_mismatch error The response id is not the extension point request id. The envelope id is not the bid request id, and confusing the two is the common failure.
artf.response.metadata_missing warning Without api_version and model_version, an orchestrator cannot record which agent build produced these mutations.
artf.mutations.empty warning The agent returned an empty mutation set, so the orchestrator paid for the call and has nothing to evaluate.
artf.mutation.not_object error An entry in the mutations array is not a Mutation object, so it carries no intent, operation, or path to check.
artf.mutation.intent_unknown error The declared intent is outside the enum, so the orchestrator cannot tell why the change is being proposed.
artf.mutation.intent_unspecified error The mutation declares no purpose, so it cannot be evaluated independently, which is what ARTF requires of every change.
artf.mutation.intent_not_applicable error The mutation declares an intent the orchestrator did not offer on this call, so it is rejected on arrival.
artf.mutation.op_unknown error The operation is outside the enum, so the orchestrator cannot tell whether to add, replace, or remove at the target path.
artf.mutation.op_unspecified error The operation is unset, so the change has a target and a value but no verb.
artf.mutation.op_not_applicable warning The mutation removes at a path while declaring an intent that adjusts a price or a floor, where replace is the operation that applies.
artf.mutation.path_missing error path is required: it is the semantic reference naming which auction entity the mutation applies to.
artf.mutation.path_not_absolute error ARTF semantic paths are rooted at the payload, so they begin with /.
artf.mutation.path_unrecognized warning The path is rooted and well formed but is not one of the semantic references ARTF v1.0 documents, so only a prior agreement can resolve it.
artf.mutation.path_intent_mismatch warning The intent and the path disagree: segment activation pointed at a bid, or bid shading pointed at an impression.
artf.mutation.imp_unknown error The imp id in the path is not among the impressions in the bid request the envelope carried.
artf.mutation.deal_unknown error The deal id in the path is not among the deals the impression's pmp object carries, so there is no floor or margin to adjust.
artf.mutation.bid_unknown error The seat and bid id in the path do not resolve to a bid in the carried bid response.
artf.mutation.target_payload_missing error The path addresses a bid and the RTBRequest has no bid_response to mutate.
artf.mutation.payload_missing error The mutation names an intent and a target but carries none of the value oneof members, so there is nothing to apply.
artf.mutation.payload_ambiguous error value is a protobuf oneof, so exactly one payload member may be present.
artf.mutation.payload_intent_mismatch error The mutation sets a payload member the intent does not carry, such as adjust_bid on a deal activation.
artf.mutation.ids_empty error The mutation proposes no ids, so it changes nothing while still consuming an evaluation slot.
artf.mutation.bidfloor_negative error The floor adjustment carries a negative price, which OpenRTB has no meaning for.
artf.mutation.margin_negative error The margin adjustment carries a negative value, whether it is expressed as CPM or as a percentage.
artf.mutation.margin_implausible warning A PERCENT margin above 100 would take the whole bid and more.
artf.mutation.price_missing error BID_SHADE proposes a new bid price, and adjust_bid.price is absent.
artf.mutation.price_negative error The shaded price is below zero, which no auction can settle.
artf.mutation.metrics_empty error ADD_METRICS proposes no metrics, so the mutation adds nothing to the impression.
artf.mutation.metric_type_missing error OpenRTB requires Metric.type. Without it, whoever receives the mutated request cannot interpret the value.
artf.mutation.no_openrtb_target warning Margin is not part of the OpenRTB Deal object, so the orchestrator has to apply it out of band and no validator can check the result.
artf.mutation.legacy_spec_encoding warning The mutation is written the way the ARTF v1.0 document's examples are, with camelCase intents and a value wrapper, rather than the enum names and oneof members its own .proto defines.
openrtb.profile.adform.dsa_name_length error Adform DSA advertiser names must contain at most 100 Unicode characters.
openrtb.profile.adform.dsa_parameter error Adform DSA targeting parameter must be 1, 2, or 3.
openrtb.profile.adform.dsa_required error Adform requires DSA response information when the Handler request's DSA requirement is 2 or 3.
openrtb.profile.adform.native_image_size error Adform Native image requests need image dimensions; unbounded images do not generate impressions.
openrtb.profile.adform.schain_nodes error Adform's declared supply chain requires at least one node.
openrtb.profile.applovin.advertiser_domain error AppLovin requires an advertiser domain.
openrtb.profile.applovin.api_unsupported error AppLovin ALX does not support VPAID or ORMMA.
openrtb.profile.applovin.clicktrackers error AppLovin HTML with SKAdNetwork requires click trackers.
openrtb.profile.applovin.creative_type error AppLovin creative type must identify a supported HTML, MRAID, Native or VAST format.
openrtb.profile.applovin.currency error AppLovin ALX accepts only USD; omitting currency defaults to USD.
openrtb.profile.applovin.macro_context error AppLovin substitutes AUCTION_LOSS only in lurl.
openrtb.profile.applovin.native_video error AppLovin ALX Native does not support video assets.
openrtb.profile.applovin.publisher_bundle error AppLovin rejects publisher app.bundle used as the advertised app bundle.
openrtb.profile.applovin.response_size error ALX documents a 4 KB maximum bid response; this JSON body exceeds 4096 UTF-8 bytes.
openrtb.profile.applovin.seat_format error A supplied AppLovin seat must be an alphanumeric string of at most 40 characters.
openrtb.profile.applovin.skadn_campaign error AppLovin SKAdNetwork campaign must be an integer string in its version-specific range.
openrtb.profile.applovin.skadn_fidelity error AppLovin SKAdNetwork fidelities must not be empty.
openrtb.profile.applovin.skadn_mismatch error AppLovin SKAdNetwork itunesitem must match advertised bid.bundle.
openrtb.profile.applovin.skadn_nonce error AppLovin SKAdNetwork nonce must use UUID format.
openrtb.profile.applovin.skadn_timestamp error AppLovin SKAdNetwork timestamp must be a decimal Unix timestamp in milliseconds, expressed as a string.
openrtb.profile.applovin.skadn_version error AppLovin SKAdNetwork version must be 2.0 or above.
openrtb.profile.bidswitch.audio_url error Audio format 3 needs either VAST or DAAST URL.
openrtb.profile.bidswitch.bid_count error Buyer responses allow at most two bids per ad slot across all seats.
openrtb.profile.bidswitch.billing_macro error The buyer billing URL must contain the win price macro.
openrtb.profile.bidswitch.click_macro error Creative markup may contain the supplier click tracking macro at most once.
openrtb.profile.bidswitch.creative_id_recommended warning BidSwitch recommends adid or crid for creative review.
openrtb.profile.bidswitch.domain_ascii error Advertiser domains must use ASCII, including punycode for international domains.
openrtb.profile.bidswitch.dsa_name_length error DSA names have a maximum of 100 characters.
openrtb.profile.bidswitch.impression_macro error The win price macro may appear once in adm and cannot appear in both adm and nurl.
openrtb.profile.bidswitch.inventory_conflict error A DOOH request cannot also contain site or app.
openrtb.profile.bidswitch.inventory_required error BidSwitch requires a documented inventory context.
openrtb.profile.bidswitch.markup_macro error Markup document URLs cannot contain the win price macro.
openrtb.profile.bidswitch.markup_version error Buyer adm requires a declared protocol version of at least 4.0.
openrtb.profile.bidswitch.native_version error Supplier native markup requires version 1.2.
openrtb.profile.bidswitch.s2s_markup_macro error Server-to-server notification requests forbid the win price macro in adm.
openrtb.profile.bidswitch.seat_unique error All bids from a buyer seat must be grouped into one SeatBid.
openrtb.profile.bidswitch.secure_notification error Browser win notifications on secure inventory require HTTPS.
openrtb.profile.bidswitch.user_id_length error BidSwitch user identifiers have a maximum of 50 characters.
openrtb.profile.bidswitch.value_invalid error The extension value is outside the BidSwitch documented set.
openrtb.profile.bidswitch.video_url error Video bids need ext.vast_url or the documented nurl fallback.
openrtb.profile.commerce_grid.banner_format error Commerce Grid requires banner formats, even for a single size.
openrtb.profile.commerce_grid.currency_offer error Commerce Grid requires at least one allowed bid currency.
openrtb.profile.commerce_grid.language_conflict error Commerce Grid accepts only one of wlang and wlangb.
openrtb.profile.commerce_grid.metric_value error Commerce Grid metric values must be between 0 and 1.
openrtb.profile.commerce_grid.native_privacy error Commerce Grid native requests require privacy 1.
openrtb.profile.commerce_grid.skadn_mismatch error Commerce Grid SKAdNetwork sourceapp must match publisher app.bundle.
openrtb.profile.digital_turbine.array_empty error DT supply chain needs at least one node.
openrtb.profile.digital_turbine.clicktrackers error DT display Auto Store and SKOverlay click firing needs a nonempty tracker list.
openrtb.profile.digital_turbine.creative_type error DT ext.crtype must identify the creative type when supplied.
openrtb.profile.digital_turbine.currency error DT supports only USD.
openrtb.profile.digital_turbine.deal_mismatch error DT response dealid must reference a deal in the matched impression.
openrtb.profile.digital_turbine.framework error DT reports its app framework as unity or native.
openrtb.profile.digital_turbine.macro_context error DT supports AUCTION_MIN_TO_WIN only in nurl.
openrtb.profile.digital_turbine.native_asset error DT Native producer asset IDs 1 through 7 identify title, main image, video, icon, description, rating and CTA respectively.
openrtb.profile.digital_turbine.native_version error DT Native requests use version 1.2.
openrtb.profile.digital_turbine.percentage error DT user percentages range from 0 through 100.
openrtb.profile.digital_turbine.playable_attr error DT Rewarded Playable responses require creative attribute 13.
openrtb.profile.digital_turbine.price_macro error DT requires AUCTION_PRICE in nurl, burl or an adm tracking pixel.
openrtb.profile.digital_turbine.producer_value error DT producer field contains a value outside its documented emitted subset.
openrtb.profile.digital_turbine.skadn_campaign error DT SKAdNetwork 2 and 3 campaign ranges 1 through 100.
openrtb.profile.digital_turbine.skadn_mismatch error DT request SKAdNetwork sourceapp must match app.bundle.
openrtb.profile.digital_turbine.skadn_nonce error DT attribution nonce must be a UUID string.
openrtb.profile.digital_turbine.skadn_sourceidentifier error DT SKAdNetwork 4 sourceidentifier is a four-digit string from 0001 through 9999.
openrtb.profile.digital_turbine.skadn_timestamp error DT attribution timestamp must be a decimal Unix millisecond string.
openrtb.profile.digital_turbine.skadn_version error DT supports SKAdNetwork 2.0 and later.
openrtb.profile.digital_turbine.source_conflict warning DT sources give conflicting, conditional or optional presence guidance; verify this field against your integration.
openrtb.profile.digital_turbine.store_categories error DT caps store subcategories at three strings.
openrtb.profile.digital_turbine.store_id error DT Auto Store requires a store listing ID in bundle or SKAdNetwork itunesitem.
openrtb.profile.dv360.banner_markup error DV360 always includes adm for banner bids.
openrtb.profile.dv360.duplicate_deal error DV360 deal IDs must be unique within an impression.
openrtb.profile.dv360.gma_dependency error disable_gma_format is permitted only with gdemsignals.
openrtb.profile.dv360.ignored_field warning DV360 parses the field but does not use it for bidding.
openrtb.profile.dv360.instream_sound error DV360 sound-off playback must be classified as outstream.
openrtb.profile.dv360.inventory_required error DV360 requests require site or app inventory.
openrtb.profile.dv360.ios_bundle error DV360 iOS app bundles must be numeric App Store IDs.
openrtb.profile.dv360.ip_required error DV360 requires the device IPv4 or IPv6 address.
openrtb.profile.dv360.native_version error DV360 supports Native Ads 1.2; versions 1.0 and 1.1 are unsupported.
openrtb.profile.dv360.privacy_locations warning DV360 expects one US Privacy signal location.
openrtb.profile.dv360.protocols_required error DV360 video requires a nonempty supported protocol list.
openrtb.profile.dv360.schain_expected warning DV360 requires SupplyChain in almost all integrations; an exemption needs account context.
openrtb.profile.equativ.app_identity_advisory warning The Equativ App table marks bundle required, but its parent description strongly recommends App ID or Bundle ID. Missing bundle is advisory while these source requirements conflict.
openrtb.profile.equativ.bid_limit error Equativ supplier responses contain at most ten bid objects.
openrtb.profile.equativ.deal_type error Equativ dealtype must be one of its four documented strings.
openrtb.profile.equativ.directpay_once error Publisher directpay can be sent only once in a request.
openrtb.profile.equativ.dsa_name_length error Equativ DSA advertiser and payer names have a maximum of 100 Unicode characters.
openrtb.profile.equativ.impression_limit error Equativ accepts at most ten impression objects in a supplier request.
openrtb.profile.equativ.mainline_precedence warning Equativ prioritizes the mainline field when both mainline and legacy values are present.
openrtb.profile.equativ.mio_first_only warning Equativ processes only the first non-instream impression when placement tag IDs are missing or differ. Unified requests also require account activation.
openrtb.profile.equativ.network_id error Supplier requests must provide the Equativ network identifier through publisher.id or the configured ext.network_id method.
openrtb.profile.equativ.obsolete_rewarded warning The Equativ guide marks video.ext.rewarded obsolete and recommends imp.rwdd. Current 2.6 acceptance is not promised.
openrtb.profile.equativ.video_placement error Equativ requires video placement information. Modern plcmt or documented legacy placement supplies it.
openrtb.profile.equativ.zero_dimension warning Equativ ignores requests with an explicitly zero width or height.
openrtb.profile.field_type error DT DSP Dual End Card uses JSON true or false.
openrtb.profile.google.billing_id_not_offered warning The selected Google billing ID is not offered by the referenced impression. With a sole ID and no active child seats Google may ignore this field; account configuration is unavailable.
openrtb.profile.google.billing_id_required error A Google bid must select ext.billing_id when its impression offers multiple billing IDs.
openrtb.profile.google.collapsible_size_exceeded error The expanded Google collapsible-ad the field exceeds the impression's the field.
openrtb.profile.google.deal_billing_id_not_offered error The Google deal's non-empty billing_id list does not offer the selected billing ID.
openrtb.profile.google.deal_media_not_offered error The bid's mtype is excluded by the Google deal's creative_constraints.mtypes.
openrtb.profile.google.dsa_paid_required error Google's DSA declaration requires paid, including when the payer and advertiser are the same.
openrtb.profile.google.event_token_ignored warning Google ignores event notification token payloads longer than 128 UTF-8 bytes.
openrtb.profile.google.frequency_caps_unsupported error Google's request explicitly declares fcap_scope=NONE (1), so frequency-capped bids are filtered.
openrtb.profile.google.landing_page_required error Authorized Buyers bids must declare a click URL in ext.clickurl, an advertiser domain in adomain, or both.
openrtb.profile.google.oneof_conflict error Google's protobuf oneof permits at most one of these fields.
openrtb.profile.google.sdk_declared_creative_required error The SDK declared ad must specify one supported creative content field.
openrtb.profile.google.sdk_field_required error Google's selected buyer SDK ad contract requires this bid field, even when the general protocol marks it optional.
openrtb.profile.google.sdk_native_field_required error https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-proto.txt.
openrtb.profile.google.sdk_native_image_type_required error https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-adx-proto.txt.
openrtb.profile.google.sdk_not_offered error Google SDK-rendered ads require an installed_sdk submessage in the corresponding app request.
openrtb.profile.google.sdk_params_not_offered error openrtb.profile.google.sdk_native_image_type_required.
openrtb.profile.google.sdk_renderer_conflict error Google filters bids that select a buyer SDK creative and a separate ordinary or AMP creative.
openrtb.profile.google.value_invalid error the field the field.
openrtb.profile.index.adomain_expected warning Index expects adomain unless the impression is passed on; that exception needs integration context.
openrtb.profile.index.adomain_length error Index advertiser domains allow at most 128 characters.
openrtb.profile.index.banner_size_unoffered error The banner creative dimensions must match an offered fixed format.
openrtb.profile.index.currency error Index's published DSP requests use USD.
openrtb.profile.index.deal_discount error Index deal discounts are fractions from 0.01 through 1.0.
openrtb.profile.index.dsa_length error Index DSA names allow at most 100 characters.
openrtb.profile.index.ip_required error Index supplier requests require device.ip or device.ipv6.
openrtb.profile.index.metric_probability error Index probability metrics must be from 0.0 through 1.0.
openrtb.profile.index.native_wrapper error Index native bid markup requires an outer native object.
openrtb.profile.index.pod_id_mismatch error Index supplier requests with multiple video impressions require the same podid for a single ad pod.
openrtb.profile.index.seat_expected warning Index normally requires seat, but can disable it per DSP; account configuration is unavailable.
openrtb.profile.index.site_identity error Index supplier site requests require domain or page.
openrtb.profile.index.skad_bundle error SKAdNetwork itunesitem must match bid.bundle.
openrtb.profile.index.skad_network error The SKAdNetwork response network must match an offered request ID.
openrtb.profile.index.tmax_minimum error Index supplier requests allow at least 100 milliseconds.
openrtb.profile.index.video_protocol error Index requires at least one supported video protocol.
openrtb.profile.index.vpaid_api error Index requires VPAID API 1 or 2 with application/javascript video.
openrtb.profile.inmobi.banner_size_required error InMobi supplier banners require positive w/h or a format with positive w/h.
openrtb.profile.inmobi.bapp_limit error InMobi sends at most 30 blocked app bundles.
openrtb.profile.inmobi.category_required error InMobi requires the creative's IAB categories.
openrtb.profile.inmobi.creative_id_truncated warning InMobi truncates creative IDs longer than 64 characters.
openrtb.profile.inmobi.device_address warning The supplier guide labels both IP families required but does not define the alternative or privacy redaction behavior. Confirm address availability for this integration.
openrtb.profile.inmobi.history_count error InMobi histories contain at most five entries; purchase and advertiser histories are omitted when empty.
openrtb.profile.inmobi.history_order warning InMobi documents recent history first; its advertiser example conflicts with this ordering.
openrtb.profile.inmobi.inventory_required error InMobi supplier ingest requires app or site inventory context; the current FAQ supports both directions.
openrtb.profile.inmobi.percentage_range error InMobi percentage telemetry must be an integer from 0 to 100.
openrtb.profile.inmobi.placement_required error InMobi supplier ingest requires tagid or ext.placementid.
openrtb.profile.inmobi.play_store_state error InMobi omits Play Store version when psdisable is 1.
openrtb.profile.inmobi.quality_declaration warning InMobi Getting Started requires this quality declaration; the current response table labels it recommended. Confirm the active integration contract.
openrtb.profile.inmobi.schain_nodes error InMobi's declared supply chain requires at least one node.
openrtb.profile.inmobi.sdk_expected warning The outgoing guide says this field is passed by the InMobi SDK; verify SDK version and producer configuration.
openrtb.profile.inmobi.single_format error InMobi sends each format opportunity to DSPs in a separate request.
openrtb.profile.inmobi.skadnetwork_unoffered error The response SKAdNetwork must match a requested skadnetids entry.
openrtb.profile.inmobi.supplier_unsupported warning The supplier request guide labels this object unsupported in its current version; negotiated integration support is not visible here.
openrtb.profile.inmobi.video_experience error InMobi video experience IDs are 1, 2 and 3.
openrtb.profile.inmobi.video_experience_unoffered error InMobi portrait and vertical experiences must be explicitly offered in the request.
openrtb.profile.inmobi.video_linearity error InMobi outgoing video opportunities use linearity 1.
openrtb.profile.magnite.api_not_offered error The referenced impression does not offer the Magnite creative API framework.
openrtb.profile.magnite.array_limit error Magnite xAPI the field permits at most the field entries.
openrtb.profile.magnite.deprecated warning The public Magnite xAPI model marks this extension field deprecated; no account-side behavior is inferred.
openrtb.profile.magnite.insecure_tracker error Magnite xAPI requires HTTPS impression trackers when the referenced impression is secure.
openrtb.profile.magnite.media_not_offered error The Magnite xAPI creative format was not offered by the referenced impression.
openrtb.profile.magnite.mime_mismatch error The Magnite banner response MIME type differs from the requested markup format.
openrtb.profile.magnite.size_not_offered error The Magnite banner size ID was not included in the explicit primary or alternate size IDs.
openrtb.profile.magnite.type_invalid error The supplied Magnite xAPI extension does not match its public field type or integer width.
openrtb.profile.mobilefuse.badv_limit error MobileFuse supports at most 50 blocked advertiser domains.
openrtb.profile.mobilefuse.bid_for_ignored_imp warning MobileFuse documents processing only the first impression; this bid references a later impression.
openrtb.profile.mobilefuse.currency error MobileFuse auctions use USD.
openrtb.profile.mobilefuse.device_address_invalid error The address must use the documented IP family.
openrtb.profile.mobilefuse.device_address_required error MobileFuse requires ip or ipv6.
openrtb.profile.mobilefuse.impressions_ignored warning MobileFuse processes only the first impression; later impressions are ignored.
openrtb.profile.mobilefuse.native_version warning MobileFuse expects Native Ads 1.2.
openrtb.profile.mobilefuse.sdk_signal_required error MobileFuse SDK bidding requires the SDK token in the first data segment.
openrtb.profile.mobilefuse.sdk_signal_size error The SDK token may be at most 4000 UTF-8 bytes.
openrtb.profile.mobilefuse.tmax_minimum error MobileFuse tmax must be at least 100 milliseconds.
openrtb.profile.native_encoding error This exchange requires a Native request encoded as an object or a JSON object string.
openrtb.profile.openwrap.adpod_count error CTV ad counts must be positive after OpenWrap's zero defaults (minads 1, maxads 3).
openrtb.profile.openwrap.adpod_count_order error CTV minads cannot exceed maxads after applying defaults.
openrtb.profile.openwrap.adpod_duration error An explicit CTV adpod requires positive adminduration and admaxduration.
openrtb.profile.openwrap.adpod_duration_order error CTV adminduration cannot exceed admaxduration.
openrtb.profile.openwrap.adpod_exclusion error CTV exclusion percentages must be between 0 and 100.
openrtb.profile.openwrap.ctv_video_required error The selected OpenWrap CTV endpoint requires at least one video impression.
openrtb.profile.openwrap.schain_removed warning The CTV middleware removes this supply chain because its helper requires version 1.0, a complete flag, nonempty nodes, nonempty ASI/SID, SID at most 64 characters, and hp 1.
openrtb.profile.prebid.alias_noop error PBS aliases must not map a bidder code to itself.
openrtb.profile.prebid.alias_not_declared error A PBS alias GVL ID must reference a declared request alias.
openrtb.profile.prebid.cache_type_required error PBS cache configuration requires bids or vastxml.
openrtb.profile.prebid.currency_truncated warning PBS-Go uses only the first request currency and drops subsequent entries.
openrtb.profile.prebid.media_not_offered error The PBS bid marker ext.prebid.type=the field references an impression without that media object. Stored-request media cannot be resolved locally.
openrtb.profile.prebid.media_type_mismatch error The PBS ext.prebid.type marker contradicts the bid's mtype.
openrtb.profile.prebid.multibid_normalized warning PBS-Go clamps maxbids to the supported range 1 through 9.
openrtb.profile.scope.unsupported warning {} has no verified OpenRTB {} {} contract in this build. Canonical specification checks were applied.
openrtb.profile.sovrn.protocols error Sovrn video requires supported protocols.
openrtb.profile.triplelift.assetsurl_unsupported error Native assetsurl requires request aurlsupport=1; omission means unsupported.
openrtb.profile.triplelift.banner_format_empty error TripleLift's required format array must describe at least one banner size.
openrtb.profile.triplelift.banner_format_fallback warning TripleLift labels format required but recommends w/h when it is absent. This request uses that documented fallback.
openrtb.profile.triplelift.bundle_contract_conflict warning TripleLift's app table requires bundle while its prose says an app ID or bundle is not strictly required. Confirm the active supplier contract.
openrtb.profile.triplelift.event_enum error Native event and method IDs must be standard IDs or exchange-specific values of at least 500.
openrtb.profile.triplelift.event_unoffered error The returned Native event and tracking method must be among the request's declared options.
openrtb.profile.triplelift.image_size_recommended warning TripleLift recommends an exact or minimum native image dimension.
openrtb.profile.triplelift.jstracker_markup error TripleLift Native 1.2 jstracker contains HTML with script tags.
openrtb.profile.unity.advertiser_domain error Unity accepts exactly one advertiser domain.
openrtb.profile.unity.creative_type error Unity ext.crtype must be a documented creative type (case-insensitive).
openrtb.profile.unity.deal_not_offered error Unity response dealid must match a deal ID offered by the referenced impression.
openrtb.profile.unity.impression_count error Unity emits exactly one impression per request.
openrtb.profile.unity.impression_id error Unity's sole impression has the string id 1.
openrtb.profile.unity.price_invalid error Unity bid price must be greater than zero.
openrtb.profile.unity.price_precision error Unity accepts at most three decimal places in bid price.
openrtb.profile.unity.skadn_campaign error Unity SKAdNetwork 2.x and 3.x campaign is an integer string from 1 through 100.
openrtb.profile.unity.skadn_mismatch error Unity SKAdNetwork sourceapp must identify the publisher app.bundle.
openrtb.profile.unity.skadn_sourceidentifier error Unity SKAdNetwork sourceidentifier is a four-digit string.
openrtb.profile.unity.skadn_timestamp error Unity SKAdNetwork timestamp must be a Unix-milliseconds integer string.
openrtb.profile.unity.type_invalid error Unity SKAdNetwork fidelities entries must be objects.
openrtb.profile.unity.value_invalid error Unity video placement is 1 or 5.
openrtb.profile.vungle.currency_ignored warning Vungle treats the response currency as USD, including a supplied non-USD value.
openrtb.profile.vungle.idfv_context error Vungle IDFV extensions are emitted only for iOS devices.
openrtb.profile.vungle.idfv_mismatch error Vungle ext.ifv and ext.idfv must contain the same IDFV.
openrtb.profile.vungle.macro_context error Vungle minimum-bid-to-win macros are supported only in lurl.
openrtb.profile.vungle.native_icon_size error Vungle Native app icons must be at least 80 by 80 pixels when supplied.
openrtb.profile.vungle.native_image_extension error Vungle Native image URL must have a supported image file extension before its query or fragment.
openrtb.profile.vungle.native_main_image error Vungle Native requires main-image asset id 1.
openrtb.profile.vungle.native_unsupported warning Vungle does not support Native the field.
openrtb.profile.vungle.native_version error Vungle supports Native Ads version 1.2.
openrtb.profile.vungle.skadn_campaign error Vungle SKAdNetwork campaign must be an integer string in the version-specific range (1 through 100 before 4.0, 0 through 9999 in 4.0 and later).
openrtb.profile.vungle.skadn_mismatch error Vungle SKAdNetwork itunesitem must match the advertised bid.bundle when supplied.
openrtb.profile.vungle.skadn_nonce error Vungle SKAdNetwork fidelity nonce must use UUID syntax.
openrtb.profile.vungle.skadn_sourceidentifier error Vungle sourceidentifier is a four-digit integer string for SKAdNetwork 4.0 and later.
openrtb.profile.vungle.skadn_timestamp error Vungle SKAdNetwork timestamp is a Unix-milliseconds integer string.
openrtb.profile.vungle.skadn_version error Vungle request SKAdNetwork versions must be 2.0 or later; Vungle does not advertise 2.1.
openrtb.profile.vungle.skoverlay_disabled error Vungle disallows other SKOverlay attributes when show is 0.
openrtb.profile.vungle.type_invalid error Vungle user.ext.consent is an integer 0 or 1, or a configured TCF consent string.
openrtb.profile.vungle.value_invalid error Vungle source.ext.omidpn is vungle when supplied.
openrtb.profile.vungle.vast_prefix error Vungle VAST markup must start its VAST element within the first 100 bytes.
openrtb.profile.xandr.array_limit error Xandr sends at most 64 blocked advertiser domains.
openrtb.profile.xandr.billing_url_required error Xandr non-impression payment bids require a billing notify URL in bid.burl.
openrtb.profile.xandr.notify_macro error Xandr does not document $the field}} in bid.the field.
openrtb.profile.xandr.payment_currency error Xandr viewable-impression payment bids support USD only.
openrtb.profile.xandr.payment_not_offered error The Xandr request does not offer this payment type for the referenced impression.
openrtb.profile.xandr.pod_duration error This Xandr creative is longer than the entire offered dynamic pod.
openrtb.profile.xandr.slot_not_offered error Xandr bid.slotinpod may identify a guaranteed position only when the seller offered one.
openrtb.profile.xandr.string_limit error Xandr custom macro values have a maximum length of 550 characters.
openrtb.profile.xandr.type_invalid error Xandr the field has an invalid documented JSON type.
openrtb.profile.yandex.ad_type error Yandex SDK ad type must be banner, interstitial, rewarded, appopenad, or native.
openrtb.profile.yandex.bidder_token error Yandex SDK Open Bidding requires the SDK bidder token in user.data[].segment[].signal.
openrtb.profile.yandex.currency_offer error Yandex SDK Open Bidding needs a supported request currency.
openrtb.profile.yandex.ignored_impressions warning Yandex SDK Open Bidding considers only the first impression.
openrtb.profile.yandex.impression_mismatch error Yandex SDK Open Bidding responses must reference the first offered impression.
openrtb.profile.yandex.macro_context error Yandex substitutes AUCTION_LOSS only in lurl and AUCTION_MIN_TO_WIN only in nurl or lurl.
openrtb.profile.yandex.response_count error A Yandex SDK Open Bidding response contains one SeatBid and one bid.
## Severities
An error means the payload is invalid against the selected version. A warning means it still parses but uses something deprecated you should migrate away from. The tester counts each separately so you can gate on errors and triage warnings.
See what RTBlint checks for the categories behind these ids, or OpenRTB versions for how the selected snapshot changes which ids fire.
---
# OpenRTB JSON Schemas · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/json-schemas/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · JSON Schemas + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## OpenRTB JSON Schemas
JSON Schemas for 17 supported OpenRTB versions, both payload types, generated from the same spec catalogs the validator runs on. IAB Tech Lab ships protobuf but no JSON Schema for 2.6 or 3.0, so nothing else machine-readable tracks the monthly snapshots. Free to fetch, no account, stable URLs.
## Latest snapshot
https://rtblint.org/schemas/openrtb-2.6-202606-bid-request.schema.json
https://rtblint.org/schemas/openrtb-2.6-202606-bid-response.schema.json
Schemas declare draft 2020-12 and carry a self-describing $id , so they can be referenced directly from an editor, a CI step, or a code generator:
# validate a payload with check-jsonschema
pipx run check-jsonschema \
--schemafile https://rtblint.org/schemas/openrtb-2.6-202606-bid-request.schema.json \
bid-request.json
## What the schemas cover
Object nesting, field types, required fields, documented value sets, and the AdCOM enumerated lists a field references. Members outside the catalog are allowed, because exchanges legitimately carry ext objects.
What a schema cannot express is exactly what a linter adds: fields that are deprecated or moved in a given version, fields that belong to a later version than the one you targeted, and semantic rules such as SupplyChain node hygiene, GPP and US Privacy coherence, CTV pod duration sanity, native markup encoding, and mtype / adm agreement on a bid response. Validating against a schema is a type check; the tester and the CLI catch the rest.
## Every version
Version Bid request Bid response
2.0 bid-request.schema.json bid-response.schema.json
2.1 bid-request.schema.json bid-response.schema.json
2.2 bid-request.schema.json bid-response.schema.json
2.3 bid-request.schema.json bid-response.schema.json
2.3.1 bid-request.schema.json bid-response.schema.json
2.4 bid-request.schema.json bid-response.schema.json
2.5 bid-request.schema.json bid-response.schema.json
2.6-202210 bid-request.schema.json bid-response.schema.json
2.6-202211 bid-request.schema.json bid-response.schema.json
2.6-202303 bid-request.schema.json bid-response.schema.json
2.6-202309 bid-request.schema.json bid-response.schema.json
2.6-202402 bid-request.schema.json bid-response.schema.json
2.6-202409 bid-request.schema.json bid-response.schema.json
2.6-202501 bid-request.schema.json bid-response.schema.json
2.6-202505 bid-request.schema.json bid-response.schema.json
2.6-202606 bid-request.schema.json bid-response.schema.json
3.0 bid-request.schema.json bid-response.schema.json
The 3.0 schemas are rooted at the openrtb envelope and pin one payload member, so a request schema will not accept a response. They include the AdCOM 1.0 objects reachable from item.spec , bid.media , and request.context .
One tracked version has no schema: the 2.6-202204 snapshot, whose published archive carries no usable object tables. It is listed on OpenRTB versions , where the validator refuses it rather than passing payloads silently.
## How they are generated
The catalogs are extracted from the IAB specifications as structured metadata (object names, field names, type notations, value sets, section citations) and compiled into the validator. The schemas fall out of the same data, so they cannot drift from what RTBlint enforces: continuous integration regenerates them on every change and fails if the committed files differ.
cargo run -p rtblint-core --example export_json_schemas
RTBlint is not affiliated with or endorsed by IAB Tech Lab. The schemas carry structural metadata and section references only, no specification prose.
---
# CLI and library · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/cli/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · CLI and library + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## CLI and library
The tester is the RTBlint Rust core compiled to WebAssembly. The same core runs as a command-line tool and as a Rust library, so a check you see in the browser is the check you can gate a build on.
## Validate a fixture in CI.
Save a bid request as fixtures/bid-request.json in your repository, then add this workflow as .github/workflows/openrtb.yml :
name: Validate OpenRTB
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: aleksUIX/rtblint@main
with:
path: fixtures/bid-request.json
spec-version: 2.6-202606
format: json
Validation errors fail the job. Warnings remain in the report without failing validation. The JSON report includes each finding's rule ID, severity, message, and field path.
This example follows the action's main branch and downloads the latest CLI release. Pin a release tag or commit for repeatable builds. The spec-version input selects the OpenRTB snapshot; the version input selects the CLI release.
Add profile: google-ab , prebid-server , xandr , or magnite to check a partner's documented requirements. Use type: response for bid responses, with request pointing to the originating request when pairing them.
Inspect a failing fixture in the tester , or compare deployment options before putting validation into a running service.
## CLI
Validate a bid request from a file or from stdin:
# validate a file
rtblint validate request.json
# validate from stdin
cat request.json | rtblint validate --stdin
# pin a specific tracked version
rtblint validate request.json --version 2.6-202505
# machine-readable output for CI
rtblint validate request.json --format json
# sellers.json / ads.txt against a local cache
rtblint validate --resolve --cache ./supply-cache request.json
# captured NDJSON stream: rule frequencies
rtblint validate --summary bids.ndjson
# one result per payload, then the totals
rtblint validate --batch --summary bids.ndjson
# Google Authorized Buyers protocol extras
rtblint validate --profile google-ab google-request.json
# Prebid Server /openrtb2/auction extras
rtblint validate --profile prebid-server pbs-auction.json
# Microsoft Monetize outgoing extras
rtblint validate --profile xandr xandr-request.json
# Magnite DV+ xAPI documented extensions
rtblint validate --profile magnite magnite-request.json
The JSON output carries the same shape as the tester: a valid flag and an issues array, each issue with an id , severity , message , and path . Match on the id to fail a pipeline on errors while letting warnings through.
--resolve --cache
checks each SupplyChain payment hop against that domain's sellers.json and the publisher's ads.txt or app-ads.txt. The cache is a local directory: sellers//sellers.json , ads//ads.txt , app-ads//app-ads.txt . Nothing is fetched.
--batch lints one JSON object per line from a file or stdin. --summary prints how often each rule id fired across that stream. --summary bids.ndjson is the histogram; --batch --summary is one line per payload plus the totals.
--profile google-ab applies Google Authorized Buyers' documented protocol extras on top of the spec: at: 3 (FIXED_PRICE) is a valid auction type, and each Imp must carry ext.billing_id . --profile prebid-server applies Prebid Server /openrtb2/auction extras: each Imp must name a bidder or stored request, and wseat / bseat are refused. --profile xandr checks the Microsoft Monetize bidder contract, including provided context values. --profile magnite checks the optional DV+ xAPI extension schema. Select the documented supplier or bidder direction when a vendor has separate profiles. Unsupported directions produce a scope warning. The flag is refused on ARTF payloads.
Profile IDs: spec , google-ab , prebid-server , xandr , magnite , dv360 , index-exchange , index-exchange-seller , unity , vungle , bidswitch , bidswitch-supplier , inmobi , inmobi-supplier , mobilefuse , mobilefuse-sdk , applovin-alx , commerce-grid , digital-turbine , sovrn , equativ , equativ-supplier , triplelift-supplier , adform-handler , yandex-sdk-bidding , pubmatic-openwrap , pubmatic-openwrap-ctv .
## Rust library
Use rtblint-core to validate in-process, with no subprocess:
use rtblint_core::validate;
let result = validate(&bid_request_json);
if !result.valid {
for issue in &result.issues {
eprintln!("{} [{}] {}", issue.severity, issue.id, issue.message);
}
}
validate targets the latest tracked 2.6 snapshot; validate_bid_request_for_version pins a specific one. validate_bid_request_with_profile applies an exchange profile ( Profile::GoogleAuthorizedBuyers , Profile::PrebidServer , Profile::Xandr , Profile::Magnite ) on top of the spec.
## Node / npm library
For JavaScript and TypeScript, rtblint-core is the same validator compiled to WebAssembly, with no native dependency to build:
npm install rtblint-core
import { validate, validateResponse, versions } from "rtblint-core";
const report = validate(JSON.stringify(bidRequest)); // latest tracked 2.6
const legacy = validate(JSON.stringify(bidRequest), "2.5"); // version-aware
const response = validateResponse(JSON.stringify(bidResponse));
if (!report.valid) {
for (const issue of report.issues) {
console.log(`[${issue.severity}] ${issue.path}: ${issue.message} (${issue.id})`);
}
}
Findings carry the same stable rule id, severity, message, and JSON path as the tester and the CLI. validateDialect covers protobuf JSON; validateProfile applies an exchange profile such as google-ab , prebid-server , xandr , or magnite .
## Packages
rtblint : the Rust CLI (crates.io)
rtblint-core : the Rust validation library (crates.io)
rtblint-core : the WASM-backed npm library for Node (npm)
rtblint-mcp : the stdio MCP server crate (crates.io)
GitHub Action: uses: aleksUIX/rtblint@
A hosted MCP server also runs at rtblint.org/mcp . Payloads sent there may be stored; local rtblint-mcp does not send them. Native Go and Python bindings are on the roadmap; track progress on GitHub .
Start from the bid request tester to see the output, then wire the same checks into your pipeline.
---
# Choose where OpenRTB validation runs · RTBlint
URL: https://rtblint.org/docs/deployment/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Deployment options + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Choose where OpenRTB validation runs.
The CLI, libraries, and gRPC service use the same Rust validator. Choose where to run it based on when you need findings and how your application handles failure.
## Match validation to your workflow.
RTBlint deployment choices and their data flow
Where it runs Payload and findings Failure behavior
CI or local CLI A fixture or NDJSON capture enters the CLI. Findings go to the console or a JSON report. Validation errors return a failing exit code. Your build decides whether to block a change.
Application library The request or response stays in your process. Rust and Node libraries return a validation report. Your code decides whether to log, reject, or continue. Include validation time in your auction budget.
gRPC sidecar Your application sends a document to your own validator service and receives a report. Your caller sets the RPC deadline and decides what happens if the service is unavailable.
Captured bid stream A separate consumer writes sampled traffic as NDJSON. The CLI emits per-payload findings or rule-frequency totals. Validation happens outside the live auction path. Findings inform debugging and later changes.
These local modes do not upload payloads to rtblint.org. The browser tester and hosted MCP endpoint have separate payload-storage behavior .
## Start with a fixture and a selected version.
cargo install rtblint
rtblint validate request.json --version 2.6-202606 --format json
Add an exchange profile when you need its documented requirements on top of the specification, for example --profile prebid-server . A valid report means there were no validation errors against that version and profile. It does not guarantee that a partner will bid, accept the request, or serve an ad.
Add the GitHub Action to CI , or use the Rust and Node library examples to validate in your application.
## Use a sidecar when validation needs its own service.
# From a checkout of the rtblint repository:
cargo run -p rtblint-grpc
# Inspect the local service:
grpcurl -plaintext localhost:50061 list
Requests specify their payload kind, specification version, and optional exchange profile. The service provides reflection, health checks, and metrics. Measure the RPC and validation cost with your own payloads before adding it to an auction path.
Read the gRPC configuration and request examples .
## Inspect captured traffic outside the auction path.
# One JSON payload per line:
rtblint validate --batch --summary bids.ndjson --version 2.6-202606
Keep the capture consumer separate from the auction consumer. Your infrastructure handles capture and sampling; RTBlint reads the NDJSON. Each payload gets a report, and the summary ranks rules by how often they fire. The homepage's Kafka viewer illustrates this pattern; it is not a packaged Kafka integration.
## Keep the validation boundary explicit.
The core checks a payload against its selected specification and profile without fetching live resources. Supply-chain checks against sellers.json, ads.txt, or app-ads.txt require the CLI's opt-in --resolve --cache mode and a cache you provide. Business policy and auction outcomes remain decisions for your application.
Read the validation coverage and version-specific limitations .
---
# MCP server · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/mcp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · MCP server + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## MCP server
RTBlint runs a hosted Model Context Protocol server so an AI agent can validate OpenRTB payloads mid-conversation. It is the same rtblint-core validator behind the tester and the CLI, exposed as callable tools over HTTP. No account, no key. Payloads sent to this hosted endpoint may be stored (identifiers stripped) so the rules can be improved and for research described in the terms ; see the privacy page. Use local rtblint-mcp over stdio if the payload must not leave the machine.
## Endpoint
https://rtblint.org/mcp
Listed on Smithery as aleksander/rtblint . Machine-readable card: /.well-known/mcp/server-card.json .
The server speaks JSON-RPC 2.0 over HTTP: POST a request and the response comes back in the body. Bare GET with a JSON Accept returns a short descriptor so crawlers and Smithery do not hang. SSE opens only when Accept includes text/event-stream . It is stateless (no session ids, no Durable Objects), CORS-open, and runs on the same Cloudflare Worker that serves this site. Validation happens in a WebAssembly build of rtblint-core at the edge; the default version is the latest tracked 2.6 snapshot.
## Tools
Tool Purpose and arguments
validate_bid_request Validate an OpenRTB 2.x bid request JSON string against a tracked spec version. Returns a valid flag and structured issues, each with a rule id, severity, message, and JSON path. Arguments: payload (string, required) · version (string, optional) · dialect (spec-json | proto-json, optional) · profile (canonical exchange and integration-direction ID, optional)
validate_bid_response Validate an OpenRTB 2.x bid response JSON string. Optional bid_request cross-checks impid, mtype, dealid, seat, and currency against the auction. Arguments: payload (string, required) · version (string, optional) · dialect (optional) · profile (optional) · bid_request (string, optional)
validate_artf_request Validate an ARTF RTBRequest envelope plus the OpenRTB payloads it carries. Arguments: payload (string, required) · version (string, optional)
validate_artf_response Validate an ARTF RTBResponse mutation set against the RTBRequest it answers. apply=true writes the mutations and revalidates. Arguments: payload (string, required) · rtb_request (string, required) · apply (boolean, optional) · version (string, optional)
list_openrtb_versions List every OpenRTB version id this build can validate against. Arguments: no arguments
get_adcp_capabilities AdCP protocol discovery. Returns the AdCP releases this agent speaks and the bid-stream conformance metrics it computes, so an agentic buying pipeline can find rtblint without hardcoding it. Arguments: adcp_version (string, optional) · protocols (array, optional) · context (object, optional)
The version argument accepts supported OpenRTB version ids (call list_openrtb_versions for the documented set). Exact validation for 2.6-202204 is unavailable because it has no extracted object catalog. Findings mirror the tester : a stable rule id, a severity, a message, and the JSON path that tripped it.
## AdCP discovery
RTBlint answers AdCP capability discovery at release 3.1. An agent that finds the endpoint can ask what it is before calling it, rather than having the integration hardcoded by whoever wired it up:
{
"status": "completed",
"adcp_version": "3.1",
"adcp": {
"major_versions": [3],
"supported_versions": ["3.1"],
"idempotency": { "supported": false }
},
"operator": { "name": "rtblint", "domain": "rtblint.org" },
"supported_protocols": ["measurement"],
"experimental_features": ["measurement.core"],
"measurement": {
"metrics": [
{ "metric_id": "openrtb_error_count", "unit": "count", ... },
{ "metric_id": "openrtb_warning_count", "unit": "count", ... },
{ "metric_id": "openrtb_conformance_rate", "unit": "percent", ... }
]
}
}
The declaration is deliberately narrow. RTBlint does not plan, negotiate or deliver, so it claims none of the transactional protocols: declaring one commits an agent to that protocol's compliance storyboard, and claiming media_buy to look better populated would be a claim it cannot pass. What it does do is compute quantitative properties of a bid-stream payload, which is what the experimental measurement protocol describes. The three metric ids are the numbers validate_bid_request and validate_bid_response already return.
Version pinning is enforced rather than ignored. A caller that pins a release this agent does not serve gets a typed VERSION_UNSUPPORTED carrying the releases that would work, so it can re-pin without a second round trip. That handshake is the thing the bid stream itself still lacks, which we wrote about in the version negotiation post . Field-level mapping between an AdCP media buy and the request it becomes is in AdCP to OpenRTB .
## Connect from Claude Code
claude mcp add --transport http rtblint https://rtblint.org/mcp
Then ask it to validate a bid request and it will call the tool directly.
## Connect from Claude Desktop, Cursor, and others
Clients with native remote MCP support:
{
"mcpServers": {
"rtblint": { "url": "https://rtblint.org/mcp" }
}
}
Older clients can reach the same endpoint through the mcp-remote bridge:
{
"mcpServers": {
"rtblint": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://rtblint.org/mcp"]
}
}
}
## Call it directly
The endpoint is plain JSON-RPC, so you can exercise it with curl:
curl -s https://rtblint.org/mcp \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "validate_bid_request",
"arguments": { "payload": "{\"id\":\"1\",\"imp\":[]}" }
}
}'
## Run it locally over stdio
For a local, offline setup, the same tools ship as the rtblint-mcp crate, a stdio MCP server that needs no network:
cargo install rtblint-mcp
# then point an MCP client at the "rtblint-mcp" command over stdio
Prefer the browser or a pipeline instead? See the tester and the CLI and library .
---
# OpenRTB example bid requests and responses (valid JSON) · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## OpenRTB examples
Valid, annotated OpenRTB payloads you can copy, adapt, and validate. Every example passes the current spec snapshot clean and opens directly in the tester.
## OpenRTB banner bid request example
A minimal, valid display bid request: one banner impression with primary and fallback sizes, a site object with publisher, and an explicit floor. View the payload →
## OpenRTB video bid request example
A minimal valid video request with an impression id and supported MIME type. Use it to start testing before adding placement and duration constraints. View the payload →
## CTV ad pod bid request example
A connected-TV ad pod request using the 2.6 pod bidding fields: pod identity, slot sequencing, and duration bounds. View the payload →
## OpenRTB native bid request example
A valid native impression showing the trickiest encoding in OpenRTB: the Native Markup Request as a JSON string encoded exactly once. View the payload →
## Bid request example with GPP privacy signals
A mobile banner request carrying a synthetic GPP string and matching section IDs at the OpenRTB 2.6 regs paths. View the payload →
## DOOH bid request example
A digital out-of-home request: the dooh distribution channel added in 2.6-202211, with quantity-based impression counting. View the payload →
## OpenRTB 3.0 bid request example
A layered 3.0 request: the openrtb envelope, item in place of imp, and the AdCOM placement under item.spec. View the payload →
## OpenRTB video bid response example
A realistic CTV video bid response: VAST markup inline in adm, mtype declared, and win/billing/loss notices carrying macros. View the payload →
## Matched bid request and response example
A request/response pair that cross-validates clean: seat allowed, deal echoed, currency permitted, and markup matching the offer. View the payload →
## How to use these
Each payload is a starting shape, not a template to ship verbatim: swap the ids, domains, and bundles for yours, then validate the result in the tester or in CI with the CLI . The bid request and bid response references explain every field these examples touch.
---
# OpenRTB validator online: check a bid request in the browser · RTBlint
URL: https://rtblint.org/docs/openrtb-validator-online/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Online (browser) + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Validate OpenRTB online
Paste a bid request or bid response into the tester and get every spec violation instantly: no signup. Validation runs in your browser. Payloads you enter may be stored so the rules can be improved and for research described in the terms ; see privacy .
## Validation still runs in the browser
The validator is the same Rust core that powers the CLI, compiled to WebAssembly and executed in your browser. Bid payloads routinely carry user identifiers, IPs, and deal terms. Those identifiers are stripped before a copy is stored for rule work and research described in the terms. Submitted JSON is not published as a public gallery. Built-in samples are not sent. Opt out on the tester, or use the CLI on your machine. Details are on the privacy and terms pages.
## What you get per finding
A stable rule id (for example openrtb.field.moved ) you can look up in the rule reference
The exact JSON path that tripped it, and an error or warning severity
The OpenRTB spec section the check derives from, where the catalog records one
Validation is version-pinned: pick a supported snapshot from 2.0 through 3.0 and deprecated, moved, and not-yet-available findings adjust to match.
## Start from a working payload
The tester ships happy and unhappy sample scenarios, and the examples library has annotated valid payloads (banner, video, CTV pods, native, DOOH, 3.0) that open directly in it.
Validating in bulk or on every deploy? The same rules run in the CLI , from Node.js , in Rust , and over MCP for AI agents .
---
# OpenRTB validator CLI: lint bid requests from the command line · RTBlint
URL: https://rtblint.org/docs/openrtb-validator-cli/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · CLI + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Validate OpenRTB from the CLI
One install, no runtime dependencies: the CLI is a single Rust binary that runs the full rule set locally.
## Install and run
cargo install rtblint
rtblint validate request.json
rtblint validate --type response response.json
rtblint validate --type response --request request.json response.json
rtblint validate --version 2.5 --format json request.json
cat request.json | rtblint validate --stdin
Exit codes are CI-ready: 0 valid, 1 validation errors, 2 usage or I/O error. --format json emits machine-readable findings with stable rule ids, so you can gate on specific ids from the rule reference .
## Cross-validate responses against their request
--request supplies the originating bid request, and every bid's impid , mtype , markup, deal id, seat, and currency are checked against what that request actually offered. Batch mode pairs one request against many response lines.
## Pin the spec version
--version supports 17 catalog-backed versions from 2.0 through 3.0 , including the dated 2.6 snapshots, so deprecation and moved-field findings match the revision your partner actually runs. The April 2022 archive, 2.6-202204, is documented but cannot be validated exactly. Use 2.6-202210 only when its October scope is appropriate. The CI guide shows the GitHub Actions wiring end to end.
Prefer a library? The same core ships for Node.js and Rust , or paste one-offs into the online tester .
---
# Validate OpenRTB in Node.js: the rtblint-core npm package · RTBlint
URL: https://rtblint.org/docs/openrtb-validator-nodejs/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Node.js + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Validate OpenRTB in Node.js
rtblint-core on npm is the Rust validator compiled to WebAssembly: full rule parity with the CLI, no native build step, works in Node and bundlers.
## Install and validate
npm install rtblint-core
import { validate, validateResponse, validateResponseAgainstRequest } from "rtblint-core";
const report = validate(JSON.stringify(bidRequest), "2.6-202606");
if (!report.valid) {
for (const issue of report.issues) {
console.log(issue.severity, issue.id, issue.path, issue.message);
}
}
Each issue carries a stable id from the rule reference , a severity, a message, and the JSON path that tripped it. The second argument pins a supported spec snapshot .
## Responses, alone or against their request
const alone = validateResponse(JSON.stringify(bidResponse), "2.6-202606");
const paired = validateResponseAgainstRequest(
JSON.stringify(bidResponse),
JSON.stringify(bidRequest),
"2.6-202606",
);
The paired form cross-checks every bid's impid , mtype , markup, deal id, seat, and currency against the originating request, the same checks the CLI runs with --request .
## Where it fits
Drop it into integration tests around your request builder, a pre-send assertion in a bidder, or an Express middleware that flags malformed partner traffic. For quick one-offs use the online tester , and start from a known-good payload in the examples library .
---
# Validate OpenRTB in Rust: the rtblint-core crate · RTBlint
URL: https://rtblint.org/docs/openrtb-validator-rust/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rust + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Validate OpenRTB in Rust
rtblint-core on crates.io is the engine itself: everything the CLI, npm package, and MCP server do runs through this crate.
## Use the crate
cargo add rtblint-core
use rtblint_core::{validate_bid_request_for_version, OpenRtbVersion};
let result = validate_bid_request_for_version(OpenRtbVersion::V2_6_202606, payload);
for issue in &result.issues {
println!("{} {} {:?}", issue.severity, issue.id, issue.path);
}
Versions are a typed enum covering documented snapshots from 2.0 through 3.0 , so an unsupported version is a compile error, not a runtime surprise. Issues carry the stable ids documented in the rule reference .
## Why in-process validation matters for bidders
A Rust exchange or bidder can lint traffic on the hot path: sample one request in a thousand through the validator and you get continuous conformance monitoring for the cost of microseconds, catching a partner's schema drift the day it ships rather than in the quarterly revenue review.
## The same engine everywhere
The CLI wraps this crate, the npm package is its WASM build, the online tester runs that WASM in your browser, and the MCP server exposes it to AI agents. Findings agree across all of them by construction. Source is on GitHub .
---
# OpenRTB MCP server: let AI agents validate bid requests · RTBlint
URL: https://rtblint.org/docs/openrtb-validator-mcp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · MCP (AI agents) + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## Validate OpenRTB over MCP
A coding agent working on bidder or exchange code can validate the payloads it writes, as it writes them. The Model Context Protocol server exposes the full rule set as tools.
## Hosted: zero install
{
"mcpServers": {
"rtblint": { "url": "https://rtblint.org/mcp" }
}
}
The hosted endpoint speaks MCP over HTTP and exposes validate_bid_request , validate_bid_response (optional bid_request for cross-validation), validate_artf_request , validate_artf_response , list_openrtb_versions , and get_adcp_capabilities . Listed on Smithery .
## Local: stdio
cargo install rtblint-mcp
{
"mcpServers": {
"rtblint": { "command": "rtblint-mcp" }
}
}
Same tools, running entirely on your machine, for environments where payloads must not leave the network. Local stdio does not store samples. The hosted endpoint may; see privacy and terms .
## Why give an agent a validator
Agents writing OpenRTB integration code confidently produce payloads with moved fields and stale enums; the training data is full of 2.5-era examples. A validator tool turns that guesswork into a checked loop: the agent validates against the exact spec snapshot you target and fixes findings by rule id before you ever review the code. Full endpoint details are in the MCP reference .
---
# OpenRTB guides · RTBlint
URL: https://rtblint.org/guides/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides · 26
## OpenRTB guides
Task-focused walkthroughs on the OpenRTB protocol and on validating it: how a bid request is built, where versions differ, why bids get dropped, and how to catch all of it before production. For object-by-object reference, see the docs ; for single questions, answers and the FAQ . Start here 4 How the market fits together 5 Debugging the auction 4 Pricing and deals 2 Versions and migration 3 Identity, privacy, and supply chain 3 Agentic advertising 5
Most read
01 How to validate an OpenRTB bid request Step-by-step: validate a bid request in the browser or the CLI, read rule IDs and JSON paths, and fix what the spec says is wrong. 02 Common OpenRTB bid request mistakes Ten spec-grounded mistakes that drop bid requests: missing imp, string at, stale placement, gdpr in the wrong path, schain drift, and more. 03 placement vs plcmt in OpenRTB video video.placement was superseded by video.plcmt in 2.6. The enums do not map 1:1. Both value tables and how to migrate.
## Start here
The working loop: validate a payload, recognise what usually breaks, and keep it from regressing.
How to validate an OpenRTB bid request Step-by-step: validate a bid request in the browser or the CLI, read rule IDs and JSON paths, and fix what the spec says is wrong. →
Common OpenRTB bid request mistakes Ten spec-grounded mistakes that drop bid requests: missing imp, string at, stale placement, gdpr in the wrong path, schain drift, and more. →
OpenRTB bid request best practices A spec-grounded checklist for sending clean bid requests: keep-alive and gzip transport, required fields, first-class privacy signals, schain, floors and tmax, versioning, and payload discipline. →
OpenRTB validation in CI Gate builds on bid request validity: RTBlint in GitHub Actions, machine-readable JSON output, pinned spec snapshots, and rule-ID gating. →
## How the market fits together
Who the parties are, which layer each standard occupies, and where OpenRTB does the actual talking.
What is programmatic advertising? A plain-English explainer Programmatic advertising is the automated buying and selling of ads through real-time auctions. The players, how an auction works, the deal types, and where OpenRTB makes it interoperable. →
SSP, DSP, and ad exchange: the OpenRTB ecosystem, explained What SSPs, DSPs, and ad exchanges actually are, how they map to the exchange, bidder, seat, and publisher roles in an OpenRTB auction, and why the lines between them keep blurring. →
OpenRTB vs Prebid and header bidding: how they fit together OpenRTB, header bidding, and Prebid are not competitors: one is a protocol, one is an auction technique, one is software. How they layer, and where OpenRTB does the actual talking. →
What is AdCOM? The object model behind OpenRTB 2.6 and 3.0 AdCOM is the Advertising Common Object Model. Why OpenRTB 2.6 moved all its enumerated lists there, what AdCOM defines, and how it underpins OpenRTB 3.0. →
VAST and OpenRTB: how video ad creatives are delivered OpenRTB runs the video auction; VAST describes the video ad. Where the two IAB specs meet, how VAST XML travels in bid.adm, and which imp.video fields constrain the creative. →
## Debugging the auction
Why a bid never arrives, never wins, or never renders: reason codes, deadlines, and creative delivery.
OpenRTB no-bid reason codes (nbr) The full nbr code table, HTTP 204 versus an empty response, and how to debug a bidder that stops bidding. →
OpenRTB loss reason codes (lurl) The full loss reason code table: 0 Bid Won through 215 App Bundle Exclusions, plus how lurl, AUCTION_LOSS, and AUCTION_MIN_TO_WIN tell a DSP why its bid lost. →
tmax and bidder timeouts: why OpenRTB bids arrive too late What BidRequest.tmax means, why it includes network latency, how a timeout differs from a no-bid, typical values, and how to debug a bidder that keeps missing the deadline. →
bid.adm vs nurl: how the winning ad gets delivered in OpenRTB The two ways a bidder delivers creative markup, inline adm versus the nurl win notice, plus burl and lurl, the mtype field, and where macros expand across the win, billing, and loss notice flow. →
## Pricing and deals
How the price is decided and how private supply is expressed in the request.
First-price vs second-price auctions in OpenRTB What the OpenRTB at field means, how first-price and second-price auctions differ, why the industry moved to first-price, and how bidders read the clearing price through auction macros. →
OpenRTB deals and PMP, explained: preferred, private auction, programmatic guaranteed The four programmatic deal types and how OpenRTB expresses them through imp.pmp, private_auction, and the Deal object (id, at, guar, bidfloor, wseat), mapped field by field. →
## Versions and migration
What changed between releases, and the field migrations that are still half-finished across the industry.
OpenRTB 2.5 vs 2.6: what changed GPP, first-class gdpr and consent, plcmt, ad pods, duration floors, and AdCOM enum lists: the full 2.5 to 2.6 delta with a migration checklist. →
OpenRTB 2.6 vs 3.0 3.0 is a layered redesign built on AdCOM, not an upgrade of 2.x. How the two models differ and why most traffic still runs 2.6. →
placement vs plcmt in OpenRTB video video.placement was superseded by video.plcmt in 2.6. The enums do not map 1:1. Both value tables and how to migrate. →
## Identity, privacy, and supply chain
The signals that say who the user is and who is entitled to sell the impression.
OpenRTB user identity: eids, buyeruid, and the cookieless transition How user identity travels in a bid request: legacy user.id and buyeruid from cookie syncs, the modern user.eids array of extended IDs (source, uids, atype), and the move past third-party cookies. →
sellers.json, ads.txt, and schain: the OpenRTB supply chain trust stack How ads.txt, sellers.json, and the OpenRTB schain object work together to make the programmatic supply path auditable, how they cross-check, and where adagents.json now fits. →
Migrating to SupplyChain v1.1: hp=0 custody nodes, checklist and pitfalls A working checklist for SupplyChain v1.1: what changes on hp, ver and complete, which existing schain checks stop being correct, how ads.txt and sellers.json apply to custody nodes, and what to do on each side of an integration. →
## Agentic advertising
The 2026 agent stacks (AAMP, AdCP, MCP) and exactly where they meet the bid stream they run on.
Agentic buying and OpenRTB: how AI ad agents meet the bid stream How agentic media buying (AdCP, AAMP, MCP, A2A) connects to the bid stream: what agents negotiate above OpenRTB, what still executes as a bid request, the trust stack, and how to validate the output. →
IAB Tech Lab's agentic advertising standards, explained: AAMP, ARTF, Agentic Audiences A plain-English map of IAB Tech Lab's agentic program: the AAMP umbrella and its three pillars, the Agentic RTB Framework, Agentic Audiences, and the strategy of extending OpenRTB rather than replacing it. →
ARTF explained: the Agentic RTB Framework and where it sits in the auction What the Agentic RTB Framework specifies: containerized agent services beside the exchange, a gRPC request and response pair, eight mutation intents against a live OpenRTB payload, and how it relates to AAMP, AdCP and the bid stream you already run. →
The Ad Context Protocol (AdCP), explained What AdCP is, who runs it (AgenticAdvertising.org), how it uses MCP and A2A, the negotiation and Trusted Match layers, the Prebid Sales Agent, adagents.json, and where it meets OpenRTB. →
From an AdCP media buy to an OpenRTB bid request: the mapping The field-level handoff from an agentic media buy to the bid stream: video_placement_types to video.plcmt, audio_distribution_types to audio.feed, packages to imp.pmp deals, adagents.json alongside schain, AXE segment lookups, and where the mapping silently breaks. →
## Working from a payload instead?
Paste a bid request or bid response into the tester and read the findings; each one names a rule id that links to its own page. The same checks run in CI from the CLI , in Node through rtblint-core , and over MCP for AI agents.
---
# OpenRTB answers: direct answers to the questions people actually ask · RTBlint
URL: https://rtblint.org/answers/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## OpenRTB answers
12 questions that come up constantly in ad tech, each with its own page and a direct answer in the first paragraph. Shorter than a guide, longer than an FAQ entry , and grounded in the field names the specification actually uses. For step-by-step walkthroughs, see the guides .
## Money and supply path
Where the money goes on the way to the impression, and who decides the price.
## What is supply path optimization (SPO)?
Supply path optimization is a buyer's practice of deciding which intermediaries to buy an impression through, then cutting the rest. The same impression is usually offered by several exchanges and resellers at once, at different prices and fees, so buyers compare paths on cost, win rate, and how verifiable the seller chain is, then concentrate spend on the shortest defensible path. In OpenRTB the evidence for that decision lives in source.schain, cross-checked against the publisher's ads.txt and each intermediary's sellers.json. Full answer →
## What is bid shading and how does it work?
Bid shading is a buy-side pricing technique that submits a bid below the buyer's true maximum, estimating the lowest price that still wins. It exists because the industry moved from second-price to first-price auctions: under first price (OpenRTB at=1) the winner pays exactly what it bid, so bidding your full valuation means overpaying on every win. OpenRTB has no bid shading field. The model lives inside the DSP and is trained on auction feedback, mainly loss notices (lurl) carrying ${AUCTION_MIN_TO_WIN} and loss reason codes. Full answer →
## What is curation in programmatic advertising?
Curation is the packaging of inventory plus data into a ready-to-buy deal, assembled on the sell side by a curator: a data company, an agency, a retail media network, or the SSP itself. The buyer sees one deal ID; the audience segments and inventory filters behind it are applied upstream, before the request is sent. In OpenRTB a curated deal arrives as an ordinary entry in imp.pmp.deals with no marker saying it was curated, which is exactly why curation is hard to audit. IAB Tech Lab's Curation object addresses that in the separate Deal Sync API, not in the bid request. Full answer →
## What are MFA (made for advertising) sites?
MFA stands for made for advertising: sites and apps built to monetise acquired traffic rather than to serve an audience. The tells are commercial, not technical: very high ad density, auto-refreshing slots, slideshow or clickbait content, and paid traffic acquisition. Nothing in OpenRTB marks a request as MFA, and MFA inventory usually passes ads.txt, sellers.json, and payload validation cleanly, so buyers filter it with inventory lists and quality vendors, using signals like imp.refresh, site.cat, and per-domain performance to build those lists. Full answer →
## Inventory and media types
Channels the bid request models beyond banner and video.
## How does DOOH work in OpenRTB?
The OpenRTB 2.6-202211 snapshot added BidRequest.dooh as a third inventory context alongside site and app, for digital out-of-home screens. It carries venue identification (venuetype, venuetypetax, referencing the OpenOOH venue taxonomy by default) plus the usual publisher, domain, and content. The structural difference from web and app is imp.qty: one DOOH play is seen by many people, so qty.multiplier states how many impressions that single ad play represents, with qty.sourcetype and qty.vendor saying who measured it. Pricing is per impression, so the multiplier changes what a bid means. Full answer →
## How do audio ads work in OpenRTB?
Audio inventory is offered through imp.audio, a sibling of imp.video with its own object definition. Only mimes is required; the recommended set is minduration, maxduration, protocols, and startdelay, which distinguishes pre-roll, mid-roll, and post-roll. Creatives are VAST: DAAST was folded into VAST 4.1 and later, so the protocols list is the same creative subtype list video uses. Streaming audio uses the same pod fields as CTV (poddur, podid, rqddurs, slotinpod, mincpmpersec), and audio-specific fields cover feed type, whether the ad is stitched server-side, volume normalisation, and companion display units. Full answer →
## Debugging
Questions that start with something not working.
## How do I build an OpenRTB bidder endpoint?
A bidder is one HTTPS endpoint that accepts a POSTed JSON bid request and returns a bid response before tmax expires. The minimum viable implementation parses the request, decides on each imp, and returns either HTTP 200 with a BidResponse whose id echoes the request id and whose bids carry impid, price, mtype, and adm or nurl, or HTTP 204 with no body to pass. Everything else, targeting, pacing, shading, sits behind that contract. The hard parts are latency (your compute budget is tmax minus network round trip) and honouring what the request declares: cur, wseat, bcat, badv, and privacy signals. Full answer →
## Why is my fill rate low?
Low fill means bidders are getting your requests and passing, so the question is which filter they hit. Check in this order: floors set above the market clearing price; missing or malformed required fields, which get a request dropped before it is ever priced; stale media-type signalling, above all video.placement without video.plcmt; privacy signals that are absent or self-contradictory, which make buyers drop EEA traffic; a tmax too tight for the path; and blocked categories, advertisers, or seats. Validate one real request before reading any dashboard. Full answer →
## Trust and privacy
What a bid request claims about a person, and how much of it is checkable.
## What is ID bridging in programmatic advertising?
ID bridging is populating a device or user identifier in a bid request with one that was not actually observed on that impression: reusing a stale IFA, filling device.ifa on inventory that cannot legitimately carry one, or passing a probabilistic household match as if it were deterministic. The buyer sees a targetable, cappable identifier and pays accordingly; what it bought was a guess. No validator can detect it from a single payload, but the EID provenance fields added in OpenRTB 2.6-202409 (inserter, matcher, mm) plus consistency between device.ifa, lmt, and dnt make the origin of an ID inspectable. Full answer →
## Is bidstream data personal data under GDPR?
For a typical bid request, yes. GDPR Article 4(1) counts online identifiers as personal data, and an ordinary OpenRTB request carries several: device.ifa or cookie-derived ids in user.eids, device.ip or ipv6, geo coordinates, and the page or app being viewed, all attached to one browsing event. In 2024 the Court of Justice of the EU held in C-604/22 that even the TCF consent string is personal data when it can be combined with an IP address. This is engineering guidance, not legal advice. Full answer →
## What does User-Agent deprecation mean for OpenRTB?
The User-Agent header was not removed; it was frozen. Chrome's UA reduction replaced the informative parts of the string (exact browser version, platform version, device model) with fixed placeholder values, so parsing device.ua now yields stale or generic answers. OpenRTB 2.6 added device.sua, a structured UserAgent object populated from User-Agent Client Hints headers, carrying browser brands and versions, platform, mobile preference, architecture, bitness, and model as separate fields. When both are present, the spec says to trust sua and ignore ua. Full answer →
## Spec and versions
Finding the specification itself, and knowing which document is authoritative.
## Where is the official OpenRTB spec?
The current OpenRTB 2.x specification is the file 2.6.md in IAB Tech Lab's openrtb2.x repository on GitHub, where main always holds the latest dated release and each release is tagged 2.6-YYYYMM. OpenRTB 3.0 lives in a separate repository (openrtb), with its domain model AdCOM in a third (AdCOM). Versions 2.5 and earlier were published as PDFs, linked from iabtechlab.com. Loss reason codes and other community extensions sit under extensions/community_extensions/ inside openrtb2.x. Full answer →
## Have a payload rather than a question?
Paste it into the bid request tester . It validates against the OpenRTB snapshot you pick, entirely in the browser, and every finding names the rule id and the JSON path. The same checks run from the CLI , an MCP server for AI agents, and the JSON Schemas .
---
# OpenRTB FAQ: 93 answers on bid requests, no-bids, GDPR, schain · RTBlint
URL: https://rtblint.org/faq/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
FAQ
## OpenRTB FAQ
93 questions ad ops and integration engineers actually ask about OpenRTB, answered directly with the exact field, version, and default. Every answer is grounded in the IAB Tech Lab specification; the longer treatments live in the docs and guides , and the questions that need a page of their own are in answers . OpenRTB basics and the bid request 24 questions Debugging, no-bids, and validation 22 questions Video, CTV, native, floors, deals, and macros 24 questions Privacy, identity, supply chain, and versions 23 questions
## OpenRTB basics and the bid request
The protocol, the auction, and the structure of a bid request: required fields, objects, and the conventions every integration relies on.
## What is OpenRTB?
OpenRTB is the IAB Tech Lab standard that defines the JSON messages ad exchanges and bidders use to buy and sell impressions in real time. An exchange sends a BidRequest describing the impression, site or app, device, user, and applicable regulations; each bidder answers with a BidResponse carrying a CPM price and creative markup, all within a deadline set by tmax. Nearly every programmatic integration between an SSP or exchange and a DSP runs on OpenRTB 2.x, with 2.6 as the current version. OpenRTB 3.0 is a separate, non-backwards-compatible spec with much lower adoption.
OpenRTB docs · OpenRTB versions
## How does a real-time bidding auction work end to end?
A user loads a page or app, the publisher's ad system asks an exchange to sell the impression, and the exchange sends an OpenRTB BidRequest over HTTP POST to many bidders at once. Each bidder evaluates the request and returns a BidResponse with a price and creative before the tmax deadline; late or empty responses are treated as no-bids. The exchange picks a winner according to the auction type in the at field (default 2, second price plus), fires the winner's win notice (nurl) and billing notice (burl) at the appropriate events, and the creative renders. The whole loop typically completes in a few hundred milliseconds.
How tmax works · Bid request reference
## What's the difference between OpenRTB and Prebid.js?
OpenRTB is a wire protocol; Prebid.js is a piece of software. OpenRTB defines the JSON bid request and response format that servers exchange, while Prebid.js is Prebid.org's open-source header bidding wrapper that runs in the browser and collects bids from demand partners before the ad server call. They are complementary, not competing: Prebid Server and many Prebid adapters speak OpenRTB 2.x to demand partners under the hood. If you are a publisher wiring up demand on a page, you use Prebid; if you are building an exchange or DSP endpoint, you implement OpenRTB.
OpenRTB docs
## Is header bidding the same as OpenRTB?
No. Header bidding is an auction architecture: the publisher offers each impression to multiple demand sources before (or alongside) the ad server call instead of waterfalling through them one at a time. OpenRTB is the message format those demand calls are usually made in. OpenRTB even models the header bidding case explicitly: the source object carries fd (whether the exchange or an upstream entity makes the final decision) and tid (a transaction ID shared across all participants selling the same impression), which exist precisely because header bidding means the exchange receiving the request may not control the final sale.
Bid request reference
## What's the difference between an SSP, a DSP, and an ad exchange?
From the protocol's point of view there are only two roles: the supply side sends OpenRTB bid requests and runs the auction, and the demand side receives them and bids. An SSP represents publishers, a DSP represents buyers, and an ad exchange is the marketplace connecting them; in practice modern SSPs and exchanges are the same system, so the terms blur. In OpenRTB terms, the exchange assigns BidRequest.id, sets the auction rules (at, tmax, cur), fans the request out to DSPs, and sends win notices; the DSP parses the request, prices the impression, and returns a BidResponse.
## What is a bid request in programmatic advertising?
A bid request is the JSON message an exchange sends to bidders to offer one or more impressions for sale. The top-level BidRequest object carries a unique id, an imp array describing each ad slot, one of site, app, or dooh for the inventory context, plus device, user, source, and regs objects with device details, user identifiers, supply chain data, and privacy signals. It is sent over HTTP POST with Content-Type application/json. Bidders must answer within the tmax deadline or the exchange treats them as passing on the auction.
Bid request reference · How to validate a bid request
## What is a bid response in OpenRTB?
A bid response is the JSON message a bidder returns with its bids. BidResponse.id must echo the request's id, and bids are grouped in seatbid objects, each holding one or more bid objects with the impid they target, a price in CPM, and creative markup in adm (or a hosted creative reference). The cur field states the bid currency and defaults to USD. To decline, a bidder either returns an empty HTTP 204 response or a BidResponse containing only an nbr no-bid reason code.
Bid response reference · No-bid reason codes
## Which fields are required in an OpenRTB bid request?
Only two: id, the exchange's unique ID for the request, and imp, an array containing at least one Imp object, each with its own required id. Everything else is optional or merely recommended (site or app, device, and user are recommended). Omitted fields fall back to spec defaults: at defaults to 2 (second price plus), test to 0 (live traffic), allimps to 0, and imp.bidfloor to 0 in USD. A request that validates is not automatically biddable; most DSPs also expect device, inventory, and user data before they will spend.
Bid request reference · Validate a request in the browser
## How do I tell if an auction is first-price or second-price from the bid request?
Check BidRequest.at: 1 means first price, 2 means second price plus, and 2 is the default when the field is omitted. Values of 500 and above are exchange-specific auction types that must be documented by the exchange. Private marketplace deals can override this per deal via pmp.deals[].at, where 3 means the value in the deal's bidfloor is the agreed fixed price. Note that most exchanges moved to first-price auctions years ago, so an omitted at (implying second price) often does not reflect how the exchange actually clears; when in doubt, confirm with the exchange.
OpenRTB enum reference
## What is the imp object in an OpenRTB bid request?
The Imp object describes a single ad placement being auctioned, and the imp array can hold several of them; a single bid request may offer every ad position on a page, for example. Each Imp has a required id (typically 1, 2, 3...) that bids reference via impid. The presence of a banner, video, audio, or native object inside the Imp declares which formats are offered, and a publisher may offer several at once as long as each bid conforms to one of them. Other key fields: bidfloor and bidfloorcur for the price floor, tagid for the placement identifier, and instl for interstitials.
Bid request reference · Bid floors explained
## How do I signal web vs in-app inventory in a bid request?
Include a site object for website inventory or an app object for non-browser application inventory; OpenRTB 2.6 adds a third option, dooh, for digital out-of-home screens. A bid request must not contain more than one of site, app, or dooh. Neither object has strictly required fields, but a site should carry at least an id or page URL and an app at least an id or bundle, since buyers key brand safety and ads.txt or app-ads.txt checks off site.domain and app.bundle. Requests carrying both site and app are a common integration bug and get rejected by many DSPs.
Common OpenRTB mistakes · Bid request reference
## How do I send test traffic in OpenRTB?
Set BidRequest.test to 1. The field is an integer with a default of 0, where 0 means live mode and 1 means test mode: auctions run end to end but are not billable. It lets you exercise a full integration (parsing, bidding, win notices) without spending money, and bidders typically route test requests around production pacing and budgets. Coordinate with your partner first, since handling of test traffic varies by exchange. Validating request structure before sending test traffic catches most integration issues earlier; RTBlint checks a 2.6 request in the browser or from the CLI.
Browser tester · RTBlint CLI
## How do currencies work in an OpenRTB bid request?
Three fields control currency, all using ISO 4217 alpha codes. BidRequest.cur is an array of currencies the exchange accepts for bids, recommended only when the exchange accepts more than one. imp.bidfloorcur states the currency of that impression's floor and defaults to USD; it does not inherit from anywhere, and per-deal floors in pmp.deals[].bidfloorcur likewise default to USD rather than inheriting from the Imp. On the response side, BidResponse.cur declares the bid currency and also defaults to USD. Mismatched floor and bid currencies are a classic source of silently lost auctions.
Bid floors explained · Common OpenRTB mistakes
## What do bcat, badv, and bapp do in a bid request?
They are the publisher's blocklists, applied request-wide. bcat blocks advertiser categories, expressed in the taxonomy named by BidRequest.cattax (default 1, IAB Content Category Taxonomy 1.0). badv blocks advertisers by domain, for example ford.com. bapp blocks apps by their app store IDs: bundle or package names for Google Play, numeric IDs for the Apple App Store. OpenRTB 2.6 also adds acat, an allowlist of advertiser categories; a request should contain acat or bcat, not both. Bidders that return creatives violating these lists get their bids filtered or their traffic clawed back.
Bid request reference
## What is cattax and how does it relate to cat?
cattax is an integer telling bidders which category taxonomy the category arrays use, per the AdCOM Category Taxonomies list; it defaults to 1, meaning IAB Content Category Taxonomy 1.0. The cat, sectioncat, and pagecat arrays on site and app describe the inventory's content categories, and BidRequest.cattax scopes bcat and acat. The gotcha: if you populate categories from Content Taxonomy 2.x or 3.x, you must send the matching cattax value, otherwise bidders will interpret your IDs against the 1.0 taxonomy and misclassify the inventory.
OpenRTB enum reference
## What is the device object for and which fields matter?
Device describes the hardware and software the impression will be delivered to, and it drives targeting, fraud detection, and identity. The fields buyers look at first: ua, the raw browser User-Agent string; sua, the structured user agent built from User-Agent Client Hints, which bidders should prefer over ua when both are present since ua may be frozen or reduced; ip for geo and fraud checks; devicetype, an AdCOM enum distinguishing phone, tablet, connected TV, and so on; ifa, the OS advertising identifier in the clear; and lmt, the limit ad tracking flag. The hashed ID fields (didsha1, dpidmd5, etc.) are deprecated as of 2.6.
Bid request reference · OpenRTB enum reference
## What is the user object in an OpenRTB bid request?
The user object describes the human on the other side of the impression: user.id (the exchange's identifier), buyeruid (the bidder's mapped identifier from a cookie sync), eids for standardized identity providers, consent for the TCF consent string when GDPR applies, plus geo, data segments, and keywords. In OpenRTB 2.6 the demographic fields yob and gender are deprecated. Everything in this object is gated by the privacy signals in regs, so read the two together.
Privacy signals in OpenRTB
## What is the ext field in OpenRTB and how do extensions work?
ext is a placeholder object for exchange-specific extensions, and by convention it may appear on any OpenRTB object. The spec deliberately leaves its structure undefined; an exchange using extensions is responsible for documenting them to its bidders. IAB Tech Lab hosts well-known community extensions in its GitHub repository, and successful extensions often get promoted into the core spec later: regs.ext.gdpr, user.ext.consent, and source.ext.schain in 2.5 all became first-class fields (regs.gdpr, user.consent, source.schain) in 2.6. Validators can only check documented fields, so undocumented ext payloads are effectively opaque.
OpenRTB 2.5 vs 2.6
## What do wseat and bseat do in a bid request?
wseat is an allowlist and bseat a blocklist of buyer seats (advertisers or agencies) permitted to bid on the impressions in the request. At most one of the two may appear in the same request, and omitting both means no seat restrictions. Seat IDs are not standardized; the exchange and bidder must agree on them in advance. Bidders declare which seat a bid belongs to via seatbid.seat in the response, which is how the exchange enforces the restriction. Per-deal seat allowlists also exist at pmp.deals[].wseat.
Bid request reference
## What does allimps mean in an OpenRTB bid request?
allimps is a flag saying whether the impressions in the request represent every impression available in the context, such as all placements on a page or all video spots in a pod, to support roadblocking. It defaults to 0, meaning no or unknown; 1 means the offered impressions are all that exist. A buyer who wants exclusive presence can only trust a roadblock buy when allimps is 1, usually combined with a multi-impression request and the group flag on seatbid, which lets a seat insist on winning all impressions or none.
Bid request reference
## How large is a typical bid request and what volume should I expect?
There is no fixed size: a bid request is usually a few kilobytes of JSON, growing with eids arrays, supply chains, and multi-format impressions, and the spec does not set a limit. Volume depends entirely on how much of an exchange's traffic you take; production DSP endpoints commonly handle very large request rates, which is why the spec's stated best practices are gzip compression (negotiated via Accept-Encoding) and HTTP persistent connections to cut connection overhead. Whatever the volume, each response must arrive within tmax, which includes network latency in both directions.
How tmax works
## What format and encoding rules apply to OpenRTB payloads?
OpenRTB payloads are JSON sent over HTTP POST with Content-Type application/json, and the response must use the same representation as the request. Standard JSON rules apply: no comments, no trailing commas, string keys in double quotes; hand-edited requests with comment lines are a frequent cause of HTTP 400 rejections. The spec gives the absence of an attribute formal meaning, usually that the value is unknown, so omit fields rather than sending null. Exchanges may agree on binary alternatives like Protobuf or Avro with an appropriate Content-Type, and gzip compression is a documented best practice.
Browser tester · Common OpenRTB mistakes
## Who maintains OpenRTB and where does the spec live?
IAB Tech Lab maintains OpenRTB. The 2.x specification lives in the InteractiveAdvertisingBureau/openrtb2.x repository on GitHub, and OpenRTB 3.0 plus the shared AdCOM object model live in the InteractiveAdvertisingBureau/openrtb and AdCOM repositories. Since release 2.6-202211, the version number only increments on breaking changes; non-breaking updates ship as dated snapshots of 2.6 (2.6-202303 replaced video.placement with plcmt, for example), with release notes on the repository's Releases page. RTBlint is an independent validator and is not affiliated with IAB Tech Lab.
OpenRTB versions
## What OpenRTB version should a new integration target in 2026?
Target OpenRTB 2.6 at its latest dated snapshot. It is the current 2.x spec and carries the modern signals buyers expect: GPP privacy strings (regs.gpp, added 2.6-202211), first-class gdpr and consent fields, source.schain, video plcmt, and CTV pod bidding. OpenRTB 3.0 is a redesigned, non-backwards-compatible protocol built on AdCOM; it has real merits but limited ecosystem adoption, so 2.6 remains the practical choice for exchange-to-DSP integrations. RTBlint validates requests across 2.0–3.0 catalogs with the deepest rule coverage on 2.6 snapshots.
OpenRTB 2.6 vs 3.0 · OpenRTB versions
## Debugging, no-bids, and validation
Why requests get dropped, why bids lose, what the no-bid codes mean, and how to validate payloads before they cost revenue.
## Why is my bidder not receiving bid requests?
Work the path from the exchange inward: confirm the endpoint the exchange has on file matches what you deployed (scheme, host, path), that your endpoint returns a well-formed response or HTTP 204 quickly enough to stay under the exchange's timeout, and that traffic filters on the exchange side (geo, media type, QPS caps, pretargeting) are not excluding you. Exchanges routinely throttle or suspend bidders whose error or timeout rate climbs, so a bidder that once received traffic and stopped usually failed health checks. Ask the exchange for its bidder health report; most expose error and timeout rates per endpoint.
## Why is my bid rate low even though I receive requests?
Start by separating deliberate no-bids from failures. If your engine chooses not to bid, that shows up as HTTP 204 or a response with a no-bid reason code in BidResponse.nbr. If you are trying to bid and nothing goes through, the usual causes are malformed responses (impid not matching an imp.id, price as a string, missing adm and nurl), bids below imp.bidfloor, bids in a currency the request's cur array does not allow, or creatives that have not cleared the exchange's audit. Compare your internal bid count against the exchange's received-bid count first; a gap means responses are being rejected in transit or on parse.
OpenRTB no-bid reason codes · Bid response reference
## How do I find out why my bids are losing auctions?
Ask for loss reasons via the loss notice URL. Set bid.lurl in your response with the ${AUCTION_LOSS} macro; when the exchange discards or outbids you it fires the URL with a loss reason code substituted in (0 means bid won, 100 below auction floor, 102 lost to a higher bid, and the 200 range covers creative filtering). Not every exchange supports lurl, but where it exists it is the only per-bid answer to why you lost. Aggregate the codes: a spike in 100 means a floor problem, a spike in the 200s means creative policy.
OpenRTB substitution macros · Bid response reference
## How do I debug a systematic OpenRTB no-bid?
If the bidder returns a BidResponse with nbr set, the code tells you where to look: nbr 2 is Invalid Request, which means the bidder could not parse or accept your bid request, so run the request through a validator before anything else. nbr 6 Unsupported Device, 7 Blocked Publisher, and 8 Unmatched User point at targeting and identity rather than payload structure. If the bidder just returns 204 with no nbr, you get no signal from the wire; reproduce the request in a validator and check for missing required fields, moved paths, and type mismatches, which are the classic silent killers.
No-bid reason codes table · Bid request tester
## What does HTTP 204 mean in OpenRTB, and how is it different from nbr?
HTTP 204 No Content is the spec's preferred way for a bidder to say it has no bid: no body, cheapest possible round trip. The alternative is HTTP 200 with a BidResponse that carries no bids and, optionally, a no-bid reason code in nbr; that costs a body but tells the exchange why. An empty seatbid array amounts to the same no-bid outcome. Use 204 for routine passes and nbr when you want the exchange to see the reason, for example during an integration test where you are diagnosing systematic no-bids.
OpenRTB no-bid reason codes
## How do I validate an OpenRTB bid request?
Paste it into a validator that checks against the actual spec catalog, not just JSON syntax. RTBlint validates a bid request against a chosen OpenRTB version snapshot and reports missing required fields, unknown and deprecated fields, moved paths (placement to plcmt, regs.ext.gdpr to regs.gdpr), type mismatches, and out-of-range enum values, each with a stable rule ID and the exact JSON path. The browser tester runs client-side; payloads you enter may be stored with identifiers stripped (see the privacy page). The CLI (rtblint validate request.json) runs the same rules from a terminal or script and does not send payloads.
Bid request tester · Validation walkthrough
## How do I validate OpenRTB payloads in CI?
Keep your bid request fixtures in the repo and lint them on every build. With RTBlint: cargo install rtblint, then rtblint validate fixture.json --version 2.6-202505 --format json in a CI step; the exit code gates the build and the JSON report carries rule IDs you can allow or deny with jq. Pin the version flag so a spec snapshot upgrade is a deliberate diff instead of a surprise. This catches drift when a partner moves to a newer 2.6 snapshot and a field your golden files still use has been deprecated or moved.
OpenRTB validation in CI · CLI reference
## How do I test an OpenRTB integration without spending money?
Set test to 1 on the bid request. The spec defines test as a flag where 1 means the auction is not billable; both sides can exercise the full request-response path, including creative return, without money moving. Beyond the flag, most exchanges offer a sandbox or staging endpoint with synthetic traffic, and you can replay captured production requests against your own bidder offline. Validate the payloads themselves before any live test so you are not burning integration time on structural mistakes a linter would catch.
Bid request reference
## Why did the exchange or bidder reject my bid request as invalid?
The usual suspects, in order: JSON that does not parse (trailing commas, unescaped quotes, truncation), a missing top-level id or imp array, an empty imp array, integers sent as strings (at, tmax, w, h, the flag fields), both site and app present, and fields that moved in 2.6 still sitting at their 2.5 paths. Strictly typed parsers reject the whole request on the first type error, and the failure is usually silent from your side. A validator pinpoints the exact path instead of leaving you to diff a 4 KB payload by eye.
Common OpenRTB mistakes · Bid request tester
## Why is my bid response being dropped by the exchange?
Check the contract fields first: BidResponse.id must echo the request id, every bid.impid must exactly match an imp.id from the request, price must be a JSON number (CPM), and the bid must carry markup in adm or a win-notice URL in nurl. After structure, the common filters are currency (cur must be one the request allows), bids under the floor, missing adomain or crid where the exchange requires them for audit, and creative attributes colliding with battr. Exchanges rarely explain a dropped response inline, so compare your sent-bid logs against the exchange's reported received bids, then work the list.
Bid response reference
## How do I debug RTB timeouts?
Measure against tmax, not against your server clock. BidRequest.tmax is the exchange's total budget in milliseconds including network latency, so your compute window is tmax minus the round trip to the exchange. Instrument the full path: TLS handshake reuse, DNS, queue time before your handler, and response serialization all count. If your p99 response time sits near tmax, you are timing out at the tail even when the median looks healthy. Exchanges report timeout rate per bidder; a rising timeout rate with a flat error rate almost always means infrastructure latency, not payload problems.
tmax and timeouts
## What causes impression count discrepancies between DSP and SSP?
Different counting points. If the DSP counts wins (nurl fired) while the publisher side counts rendered or billable impressions (burl, which the spec ties to the billing event), every won-but-never-rendered impression becomes a discrepancy. Add timeout losses after win, creative wrappers that fail to load, and timezone boundaries on reporting, and 5 to 10 percent gaps are common. The spec's answer is burl: bill on the billing notice, not the win notice. When reconciling, first agree on which URL each side counts and in which timezone the day is cut.
Win, billing, and loss notices · OpenRTB substitution macros
## How do I capture and replay bid requests for QA?
Sample and log raw request bodies at your edge (before any normalization), strip or hash user identifiers, and store them as fixtures. Replaying them serves two purposes: regression-testing your own parser and bidding logic against real traffic shapes, and validating the payloads against the spec to catch drift when a partner changes what they send. A nightly job that runs the latest sample through rtblint validate --stdin with --format json will surface a partner's new or moved fields the day they appear instead of the week revenue dips.
OpenRTB validation in CI
## What is a seatbid, and why is my response's seatbid empty?
seatbid is the array grouping bids by bidder seat: each SeatBid carries an optional seat identifier and a bid array with at least one bid. A BidResponse with no seatbid, or with SeatBid objects whose bid arrays are empty, is a no-bid as far as the auction is concerned. If your engine intends to bid but seatbid comes out empty, look at your response assembly: bids filtered late (floor, budget, creative approval) after the response shell was built is the classic cause. If you mean to no-bid, prefer HTTP 204 or set nbr so the intent is explicit.
Bid response reference
## Why is my win notice (nurl) not firing?
First confirm you actually won: nurl fires on win, and depending on the exchange that can be the auction win or the final render decision. Then check the URL itself: it must be reachable from the exchange's servers (not localhost, not behind auth), fast, and idempotent. If the URL contains substitution macros, malformed macro syntax means the exchange substitutes nothing or drops the call. Also remember the spec allows returning markup via the nurl response body instead of adm; if you rely on that, a broken nurl means no ad served at all. Log query parameters server-side and compare against ${AUCTION_PRICE} expectations.
OpenRTB substitution macros
## What is creative audit in RTB, and why are my creatives filtered?
Most exchanges review creatives before letting them win, either pre-bid (submit for approval) or post-bid (first bids lose while the creative is in review). That is why new campaigns often show bids with no wins for the first hours. Your bid must carry the fields the audit keys on: adomain (advertiser domain), crid (creative ID), and often cat and attr. Loss reason codes in the 200 range signal creative filtering specifically: 200 is a generic creative filter, and the list continues through categories like blocked category and blocked attribute. If wins stop after a creative change, assume re-audit.
Bid response reference
## Why does my video bid never win?
Video adds media constraints on top of the usual auction filters, and any mismatch disqualifies the bid: your creative's MIME type must be in imp.video.mimes, the VAST version you return must map to a value in protocols, duration must sit between minduration and maxduration (or match rqddurs exactly when present), and dimensions should fit w and h. On CTV, buyers and exchanges increasingly key on plcmt; a creative strategy built for plcmt 1 instream will not clear an outstream placement. Compare each constraint in the request against what your ad server actually returned, field by field.
CTV in OpenRTB · Protocols and plcmt enums
## How do I check which OpenRTB version a partner is running?
Look at the x-openrtb-version HTTP header on their requests; the spec has exchanges declare the version there (for example x-openrtb-version: 2.6). Beyond the header, the payload itself tells you: regs.gpp means at least the 2.6-202211 snapshot, plcmt on video means 2.6-202303 or later, and gdpr still living at regs.ext.gdpr suggests a 2.5-era integration regardless of what the docs claim. Partner documentation lags reality often enough that fingerprinting the actual traffic is the reliable method.
OpenRTB versions and snapshots
## What is the x-openrtb-version HTTP header?
It is the custom HTTP header OpenRTB defines for version signaling on the wire: the sender of a bid request declares the protocol version it speaks, for example x-openrtb-version: 2.6. The body should also be sent with Content-Type: application/json. The header names the version line, not the dated snapshot, so 2.6 traffic from 2022 and 2025 both say 2.6 even though the field sets differ; that finer distinction is exactly why validating against a specific snapshot matters.
OpenRTB versions and snapshots
## Are unknown or extra fields in a bid request a problem?
Usually tolerated, occasionally fatal, always worth knowing about. The spec's extension convention is that custom data belongs inside ext objects; fields invented at other paths are undefined behavior. Lenient parsers skip them, strict ones reject the request, and either way you are shipping bytes that no partner reads. Unknown fields are also the fingerprint of drift: a typo (bidflor), a field at its pre-2.6 path, or a partner-specific field leaking into traffic for everyone. RTBlint flags every field not in the catalog for the version you target, with the exact path.
What RTBlint checks
## How do I gate CI on specific OpenRTB validation rules?
Run the validator with machine-readable output and filter on rule IDs. rtblint validate request.json --format json emits findings each carrying a stable rule ID (for example openrtb.field.moved or openrtb.field.deprecated) and a JSON path; pipe that through jq to fail the build on the classes you care about while tolerating others. Teams typically hard-fail on errors (required fields, types, undefined fields) and warn on deprecations until a migration lands. Because the IDs are stable across releases, the gate does not rot when message wording changes.
OpenRTB validation in CI · Rule catalog
## What tools exist to validate OpenRTB payloads?
Options are thinner than you would expect for a protocol this central. Generic JSON Schema validation catches types and required fields if you maintain a schema, but the IAB does not publish an official one per snapshot, and schemas cannot express moved or deprecated paths across versions. Exchange-specific request debuggers exist inside partner consoles but only cover that partner's dialect. RTBlint is an open-source validator built specifically for this: version-aware across OpenRTB 2.0 through 3.0 catalogs with rule depth on the 2.6 snapshots, running in the browser (client-side WASM) and as a Rust CLI for pipelines.
Bid request tester · CLI reference
## Video, CTV, native, floors, deals, and macros
Media-type specifics: the video object and ad pods, the native request string, bid floors and PMP deals, and the substitution macros in win and loss notices.
## How do I build an OpenRTB video bid request?
Add an imp.video object to the impression; its presence is what marks the impression as video. mimes is the only required field (e.g. video/mp4), but the spec recommends minduration, maxduration, protocols, startdelay, and player w and h in device-independent pixels. minduration and maxduration are mutually exclusive with rqddurs: send a range or an exact-duration list, never both. Add plcmt for the placement subtype and skip if the player allows skipping. The same imp may also carry banner, audio, or native objects if the publisher accepts multiple formats.
Bid request structure · Validate a bid request
## What is plcmt in OpenRTB video?
imp.video.plcmt declares the video placement subtype using AdCOM's Plcmt Subtypes list, which follows the updated IAB digital video guidelines. Values: 1 = instream (sound on by default or clear user intent, video is the focus of the visit), 2 = accompanying content (player sits alongside text or graphical content and starts playback only on entering the viewport), 3 = interstitial (ad without video content that takes over the viewport), 4 = no content or standalone (slideshows, native feeds, in-content, sticky players). It was added in OpenRTB 2.6-202303 and replaces the deprecated placement field; the two enums do not map 1:1.
placement vs plcmt · OpenRTB enums
## What plcmt value should I send for CTV inventory?
Send imp.video.plcmt = 1 (instream) for CTV. Pre-roll, mid-roll, and post-roll ads inside requested streaming video content are instream by definition, and CTV playback is sound-on full-screen video, so it meets the instream bar without qualification. Pair it with startdelay to distinguish pre-roll from mid-roll and post-roll, and podid plus slotinpod when the break is an ad pod. Keep sending placement = 1 too while partners finish migrating off the deprecated field.
CTV in OpenRTB · placement vs plcmt
## Should I send placement or plcmt in a video bid request?
Send both during the transition, but treat plcmt as authoritative. placement was deprecated in the OpenRTB 2.6-202303 release in favor of plcmt, whose values follow the updated IAB digital video guidelines. The two enums differ in meaning (old placement 1 in-stream is stricter than it sounds under the new definitions), so there is no mechanical 1:1 mapping; classify inventory against the plcmt definitions rather than translating old values. Buyers that only read placement will still work while you dual-send, and you can drop placement once your demand partners confirm they consume plcmt.
placement vs plcmt · Common OpenRTB mistakes
## How does ad pod bidding work in OpenRTB 2.6?
Each slot in the pod is its own imp, and a shared imp.video.podid ties them together. podseq gives the pod's position in the content stream, and slotinpod indicates whether the seller can guarantee a specific position in the pod (a bid can also set slotinpod to claim one). For structured pods, each imp carries its own duration constraints. For dynamic pods, where the slot count is not predetermined, send maxseq (maximum ads in the pod) and poddur (total seconds to fill for the whole break). rqddurs lists exact acceptable creative durations for live TV and is mutually exclusive with minduration and maxduration. All of these arrived in OpenRTB 2.6.
CTV in OpenRTB · OpenRTB 2.5 vs 2.6
## How do I signal server-side ad insertion (SSAI) in a bid request?
Set imp.ssai, an integer added in OpenRTB 2.6 with default 0. Values: 0 = status unknown, 1 = all client-side (no server-side stitching), 2 = assets stitched server-side but tracking pixels fired client-side, 3 = all server-side (stitching and tracking). Buyers use it to judge tracker reliability and IVT risk, so send the honest value rather than leaving 0 on stitched CTV streams. Value 2 is the common CTV middle ground: the ad is in the stream but measurement still runs on the device.
CTV in OpenRTB
## How do I signal rewarded inventory in OpenRTB?
Set imp.rwdd = 1. The field was added in OpenRTB 2.6, is an integer with default 0, and means the user receives a reward for viewing the ad: an extra life in a game, a free article, or an ad-free music session, typically granted after the video completes. Before 2.6 this signal lived in assorted imp.ext extensions, so if you support older partners you may need to dual-write. rwdd sits on the impression, not on the video object, so it applies to any media type offered in that imp.
Bid request structure · OpenRTB 2.5 vs 2.6
## How do I signal skippable video in a bid request?
Set imp.video.skip = 1 to say the player allows skipping, then qualify it with skipmin and skipafter (both default 0). skipmin means only videos longer than that many seconds can be skipped, and skipafter is how many seconds must play before the skip control appears. So skip=1, skipmin=15, skipafter=5 reads: ads over 15 seconds are skippable after 5 seconds. These describe player capability only. If a bidder returns a creative that is itself skippable, the bid should list creative attribute 16 in bid.attr.
Bid request structure · OpenRTB enums
## What VAST versions do OpenRTB protocols values map to?
imp.video.protocols uses AdCOM's Creative Subtypes Audio/Video list. The mapping: 1 = VAST 1.0, 2 = VAST 2.0, 3 = VAST 3.0, 4/5/6 = VAST 1.0/2.0/3.0 Wrapper, 7 = VAST 4.0, 8 = VAST 4.0 Wrapper, 9 = DAAST 1.0, 10 = DAAST 1.0 Wrapper, 11 = VAST 4.1, 12 = VAST 4.1 Wrapper, 13 = VAST 4.2, 14 = VAST 4.2 Wrapper, 15 = VAST 4.3, 16 = VAST 4.3 Wrapper. A common mistake is advertising inline support (e.g. 3, 7) without the wrapper values, which blocks any bidder returning wrapper tags. If you accept a version, you almost always want its wrapper value too.
OpenRTB enums · Common OpenRTB mistakes
## How does audio differ from video in OpenRTB?
imp.audio mirrors imp.video for the core fields (mimes required, minduration, maxduration, protocols, startdelay, full pod support with podid, poddur, rqddurs) but drops the visual ones: no w, h, plcmt, linearity, skip, or playbackmethod. In their place audio adds feed (feed type from AdCOM, e.g. music service vs podcast), stitched (1 if the ad is stitched into the audio stream), and nvol (volume normalization mode). Audio creatives are described by DAAST or, since VAST 4.1, VAST itself; the protocols list covers both. A bid on an audio imp sets mtype = 3.
Bid request structure
## How do I send a native bid request in OpenRTB?
Add imp.native with two fields that matter: request and ver. request is required and holds the Native Ads API request (assets, event trackers, context) as a JSON-encoded string, not a nested object; forgetting to stringify it is the classic native integration bug. ver is recommended and should state the Dynamic Native Ads API version the payload complies with, 1.2 being the current standard. Since Native 1.1 the payload's root object is the request itself; only Native 1.0 wrapped it in a native key. api and battr on imp.native carry the usual framework and blocked-attribute lists.
Native in OpenRTB · Validate a bid request
## Why is imp.native.request a string instead of a JSON object?
Because the Native Ads API is a separate specification that versions independently of OpenRTB, the request payload is carried as an opaque JSON-encoded string. OpenRTB deliberately does not parse or validate it; the string can evolve under the Dynamic Native Ads API without requiring a new OpenRTB release. The practical consequence is double encoding: your native request object must be serialized to a string, then embedded in the bid request JSON, with quotes escaped accordingly. Parsers that expect an object here will reject valid requests, and senders that inline a raw object are out of spec even though some exchanges tolerate it.
Native in OpenRTB · Common OpenRTB mistakes
## How do I set a bid floor in OpenRTB?
Set imp.bidfloor, a float expressed as CPM, with imp.bidfloorcur naming the currency as an ISO-4217 code (default USD). The floor is scoped to the impression: each imp in a multi-imp request carries its own floor, and there is no request-level floor field. bidfloor defaults to 0, meaning no floor. bidfloorcur sets the default currency for all floors specified within that Imp object, but note that Deal.bidfloorcur does not inherit from it; a deal's currency is either explicit or USD. Bids below the floor are eligible for rejection with loss reason 100 (bid below auction floor).
Floors in OpenRTB
## Why are all my bids coming back below floor?
The usual cause is a currency mismatch: imp.bidfloorcur defaults to USD, so a floor of 200 intended as JPY but sent without bidfloorcur reads as a 200 USD CPM and nothing clears it. The inverse also happens when a bidder prices in its own currency and compares against the raw floor number without converting. Check three things: that bidfloorcur is set whenever the floor is not USD, that the bidder converts before comparing, and that deal floors carry their own bidfloorcur (Deal.bidfloorcur does not inherit from the imp, it defaults to USD independently). Loss notices with ${AUCTION_LOSS} = 100 confirm floor rejections.
Floors in OpenRTB · No-bid and loss reasons
## How do PMP deals work in OpenRTB?
The seller attaches imp.pmp to the impression, containing private_auction and a deals array of Deal objects. private_auction = 0 means open bids are still accepted alongside deal bids; 1 restricts the auction to the listed deals and their terms. Each Deal has a required id plus optional bidfloor, bidfloorcur, at (auction type override), wseat (allowed buyer seats), wadomain (allowed advertiser domains), and since 2.6 a guar flag for guaranteed deals. A bidder responding against a deal must echo the deal id in bid.dealid; a bid without dealid on a private_auction = 1 impression is invalid.
Bid request structure · Bid response structure
## What does at=3 mean on an OpenRTB deal?
Deal.at = 3 means the value in Deal.bidfloor is the agreed fixed deal price, not a floor to bid above. It overrides the request-level auction type for that deal: 1 = first price, 2 = second price plus, 3 = fixed price. In a fixed-price deal the bidder bids the deal price and clears at it; there is no price competition against that value. Exchanges may define additional auction types above 500. Note the field reuses bidfloor for the price, so a validator or bidder that treats every bidfloor as a minimum will misprice at=3 deals.
Floors in OpenRTB
## What are duration floors (durfloors) in OpenRTB 2.6?
durfloors lets sellers price video and audio by creative duration: an array of DurFloors objects on imp.video, imp.audio, or Deal, each with mindur or maxdur (at least one is required, an unbounded end is omitted) and a bidfloor in CPM. Example: 1-15s at 5.00, 16-30s at 10.00, 31s+ at 20.00. Creatives whose duration falls outside every defined range fall back to the imp-level bidfloor. Ranges are not guaranteed to be non-overlapping; buyer and seller coordinate which applies. For dynamic ad pods there is also mincpmpersec, a floor expressed as CPM per second of the bid's duration.
Floors in OpenRTB · OpenRTB 2.5 vs 2.6
## How does the ${AUCTION_PRICE} macro work?
The exchange replaces ${AUCTION_PRICE} with the clearing price, in the same currency and units as the bid and reflecting any discount, wherever the macro appears: in the nurl, burl, and lurl notice URLs and inside the adm markup itself. Compliant exchanges must support substitution in both URLs and markup for win and billing notifications. In loss notices, exchange policy may withhold clearing prices, in which case ${AUCTION_PRICE} is replaced with an empty string rather than left intact. Values can be encoded by mutual agreement using the :X suffix (e.g. ${AUCTION_PRICE:B64}) when the price travels through markup into the browser.
Substitution macros
## What's the difference between nurl, burl, and lurl?
Three notice URLs on the Bid object, each fired by the exchange for a different event. nurl is the win notice, called when the bid wins the auction; winning is not necessarily a delivered, viewed, or billable ad, and the nurl response body can optionally serve the ad markup. burl is the billing notice, called when the winning bid becomes billable under exchange policy, typically on delivery or viewability. lurl is the loss notice, called when the bid is known to have lost, usually carrying ${AUCTION_LOSS} and possibly a redacted ${AUCTION_PRICE}. Count spend on burl, not nurl; the gap between the two is exactly the won-but-never-rendered case.
Bid response structure · Substitution macros
## When is burl fired versus nurl?
nurl fires on auction win; burl fires later, when the win becomes billable under the exchange's business policy, which the spec describes as typically delivered or viewed. The two can be minutes apart or the burl may never fire at all if the ad loses downstream or fails to render, so bidders should reconcile spend against burl. For VAST video the spec's best practice is that the VAST impression event is the official billable signal, and an exchange adhering to that policy should fire burl at the same time as the VAST impression, while warning that firing both invites small discrepancies.
Bid response structure
## What is the ${AUCTION_MIN_TO_WIN} macro?
${AUCTION_MIN_TO_WIN}, added in OpenRTB 2.6, is replaced with the minimum bid that would have tied the decisive competing price, in the bid's own currency and units, and is the standard bid-shading feedback signal. If your bid lost, it is the price needed to tie the winning bid; if you won, it is the price needed to tie the next-closest bid, or the floor if yours was the only bid. Exchanges may substitute an empty string when price was not the deciding factor, when the bid never entered the auction, or when privacy policy withholds price data, so parsers must tolerate a blank value.
Substitution macros · OpenRTB 2.5 vs 2.6
## What is mtype in an OpenRTB bid response?
bid.mtype declares the type of the creative markup so the exchange can associate it with the right sub-object of the impression: 1 = banner, 2 = video, 3 = audio, 4 = native. It was added in OpenRTB 2.6 to remove guesswork on multi-format impressions, where one imp offers banner, video, audio, or native and the exchange previously had to sniff the adm contents to tell which the bid was for. Always set it; on a multi-format imp a missing mtype forces the exchange to infer, and misclassification breaks rendering and reporting.
Bid response structure · OpenRTB 2.5 vs 2.6
## How do I return VAST in an OpenRTB bid response?
Put the VAST XML document directly in bid.adm as a JSON-escaped string and set mtype = 2. The alternative is to omit adm and return the VAST as the response body of the win notice: the exchange calls bid.nurl and the body must contain the markup and nothing else. If both adm and the nurl return provide markup, adm takes precedence. The exchange applies substitution macros such as ${AUCTION_PRICE} inside the markup either way. Inline adm is preferred in practice since it saves a round trip and lets the exchange scan the creative before rendering.
Bid response structure · Substitution macros
## What are eventtrackers in Native 1.2?
eventtrackers is the Native 1.2 mechanism for declaring and returning ad tracking, replacing the older imptrackers and jstracker fields, which the spec marks as to be deprecated. In the request, the eventtrackers array states which events and methods the publisher supports: event types include 1 = impression, 2 = viewable-mrc50 (50% in view for 1 second), 3 = viewable-mrc100, 4 = viewable-video50, with 500+ reserved for exchange-specific types; methods are 1 = img pixel and 2 = js tag. In the response, each EventTracker object carries the event, the single method chosen, and the tracking URL. Bidders should send eventtrackers and keep imptrackers only for legacy partners.
Native in OpenRTB
## Privacy, identity, supply chain, and versions
Consent and regulatory signals with their exact paths, schain, ads.txt and sellers.json, and how the 2.x line and 3.0 relate.
## How do I pass GDPR consent in an OpenRTB bid request?
Set regs.gdpr to 1 when the request is subject to GDPR and put the TCF consent string in user.consent. Both are first-class fields in OpenRTB 2.6; on 2.5 and earlier the same signals travel as regs.ext.gdpr and user.ext.consent. regs.gdpr is an integer flag (0 = no, 1 = yes, omitted = unknown), and user.consent carries the IAB Transparency and Consent Framework string. Sending a consent string without the gdpr flag, or the flag without the string, is a common integration bug worth validating for.
Privacy signals in OpenRTB · OpenRTB 2.5 vs 2.6
## How do I pass a GPP string in OpenRTB?
Put the Global Privacy Platform consent string in regs.gpp and list the applicable section IDs in regs.gpp_sid. Both fields were added in the OpenRTB 2.6-202211 update. regs.gpp_sid is an integer array; it generally contains exactly one value, though edge cases can carry more. GPP sections 3 (header) and 4 (signal integrity) do not need to be listed. On versions before 2.6-202211 there is no first-class home for GPP, so partners typically agree on an ext placement.
Privacy signals in OpenRTB · OpenRTB version snapshots
## GPP vs us_privacy: which should I send?
Send GPP (regs.gpp plus regs.gpp_sid) where your partners support it; the US Privacy signal was deprecated by IAB Tech Lab on January 31, 2024 in favor of GPP. In practice many exchanges and bidders still read regs.us_privacy, so during the transition it is common to send both, with the GPP string treated as authoritative when the relevant US section is present. Follow each partner's integration guidance rather than dropping us_privacy unilaterally, and avoid sending contradictory values in the two fields.
Privacy signals in OpenRTB
## How do I signal CCPA in OpenRTB?
Put the US Privacy string in regs.us_privacy, which is a first-class field in OpenRTB 2.6; on 2.5 and earlier it travels as regs.ext.us_privacy per the IAB extension. The value is the four-character USP string (for example 1YNN) covering spec version, explicit notice, opt-out of sale, and LSPA coverage. Note that the US Privacy spec itself is deprecated in favor of GPP, so newer integrations express the same signal through regs.gpp with the appropriate US section ID.
Privacy signals in OpenRTB
## How do I signal COPPA in an OpenRTB request?
Set regs.coppa to 1 when the request is subject to the COPPA regulations established by the US FTC, and 0 when it is not. The field is an integer flag on the Regs object and has been first-class since OpenRTB 2.2, so it works the same across 2.x versions. When coppa=1, buyers are expected to suppress behavioral targeting and treat user identifiers accordingly; sellers should also avoid sending identifying fields that contradict the flag.
Privacy signals in OpenRTB
## What is the DSA extension in OpenRTB?
The DSA transparency extension carries EU Digital Services Act ad-transparency data through OpenRTB 2.x ext blocks. On the request, regs.ext.dsa holds dsarequired (0-3, whether a DSA object is required in the response), pubrender (whether the publisher renders the transparency info), datatopub, and a transparency array of domain plus dsaparams objects. On the response, the bid's ext.dsa holds behalf (on whose behalf the ad shows), paid (who paid), adrender, and its own transparency array. It is an IAB Tech Lab community extension, not part of the core 2.6 spec.
Privacy signals in OpenRTB
## What is the difference between device.lmt and device.dnt?
device.dnt is the browser Do Not Track header flag, while device.lmt is the OS-level Limit Ad Tracking signal from mobile platforms such as iOS and Android. For both, 0 means tracking is unrestricted and 1 means tracking must be limited. When lmt=1, buyers must limit tracking per the platform's commercial guidelines: no profiling or retargeting off the device ID, and the ifa is typically absent or zeroed anyway. dnt matters for web inventory, lmt for app inventory; requests should not carry a device identifier usage that contradicts either flag.
Privacy signals in OpenRTB
## What happens to ifa when the user limits ad tracking (ATT)?
When the user denies tracking, the OS advertising API returns an all-zero identifier, so device.ifa arrives as 00000000-0000-0000-0000-000000000000 or is omitted entirely, and device.lmt should be 1. Never treat a zeroed ifa as a real ID for frequency capping, matching, or attribution; filter it out. The 2.6 spec defines ifa as the ID sanctioned for advertiser use in the clear, derived from the device OS advertising API, so once the OS stops vending it there is no compliant substitute in that field.
Privacy signals in OpenRTB
## What is user.eids in OpenRTB and how do extended IDs travel?
user.eids is an array of EID objects, each carrying one or more identifiers from a single ID source or technology provider. Each EID has a source (the canonical domain of the ID provider) and a uids array; each UID has an id string and an atype (agent type, from the AdCOM Agent Types list, strongly recommended since many DSPs require it for resolution). EID and UID became first-class objects in OpenRTB 2.6 (sections 3.2.27 and 3.2.28); before that the same structure traveled under user.ext.eids. Vendor IDs like UID2 or RampID all use this same envelope, distinguished by the source domain.
Privacy signals in OpenRTB · Bid request reference
## What's the difference between user.id and user.buyeruid?
user.id is the exchange's own identifier for the user (typically from the exchange's cookie), while user.buyeruid is the buyer's identifier for that same user, as mapped by the exchange for that specific bidder. buyeruid is populated from a prior cookie sync: the exchange looks up its cookie ID in its match table and inserts the DSP's corresponding ID before sending the request. A DSP can act on buyeruid directly for targeting and frequency capping; user.id is only meaningful to the exchange unless you have built your own mapping.
Bid request reference
## How does cookie matching work in OpenRTB?
Cookie matching (ID syncing) is how an exchange and a DSP link their separate cookie IDs for the same browser so bid requests can carry a buyer-usable ID. One party hosts a match table; most commonly the exchange does. A sync pixel fired on the other party's domain redirects with the partner's user ID in the URL, letting the table owner store the pairing. On subsequent requests the exchange looks up its cookie ID and places the DSP's ID in user.buyeruid. OpenRTB 2.6 documents this flow in its cookie-based ID syncing appendix, including consent gating: sync endpoints are expected to honor GDPR, GPP, and US privacy parameters.
Bid request reference · Privacy signals in OpenRTB
## How do I implement schain in OpenRTB?
Put a SupplyChain object at source.schain in OpenRTB 2.6; on 2.5 it lives at source.ext.schain. The SupplyChain object requires three fields: complete (1 if the chain traces all the way back to the inventory owner, else 0), nodes (an ordered array of SupplyChainNode objects, first node closest to the publisher, last node the entity sending the request), and ver (the schain spec version string, currently 1.0). Each node requires asi (the advertising system's canonical domain) and sid (the seller's account ID in that system), and should carry hp. Every intermediary appends its own node and propagates the rest unchanged.
Supply chain in OpenRTB
## What does schain complete=1 mean, and what is hp?
complete=1 asserts that the nodes array contains every entity in the payment chain back to the owner of the site, app, or other medium; complete=0 means the chain starts at the first known node and earlier hops are missing. Buyers commonly discount or reject inventory with incomplete chains. hp on each node indicates whether that node is in the flow of payment: when 1, the system in asi pays the seller in sid, who pays the previous node. For schain version 1.0 the spec says hp should always be 1, and intermediaries must propagate it downstream unchanged.
Supply chain in OpenRTB
## How do ads.txt and sellers.json relate to schain?
They are the verification layer for the path schain describes. Each schain node's asi is the advertising system's domain, the same value used to identify systems in the publisher's ads.txt or app-ads.txt file, and each sid is the seller account ID that should appear as a seller_id in that system's sellers.json. A buyer can walk the chain node by node: confirm the first node's asi/sid pair is authorized in the publisher's ads.txt, then resolve every sid against the corresponding sellers.json to see who is actually being paid. A chain that fails those lookups is a spoofing or misdeclaration signal.
Supply chain in OpenRTB
## What are source.tid and source.fd in OpenRTB?
source.tid is a transaction ID that must be common across all participants in the bid request, so multiple exchanges auctioning the same impression (header bidding, for example) can be correlated and deduplicated. source.fd declares who makes the final impression sale decision: 0 means the exchange itself, 1 means an upstream source such as a header bidding wrapper, another exchange, or an ad server mixing direct and programmatic demand. Both are recommended fields on the Source object, which also hosts pchain and schain.
Bid request reference
## How do I migrate from OpenRTB 2.5 to 2.6?
Move the promoted ext fields to their first-class paths, switch enum references to AdCOM, and adopt the new video fields. Concretely: regs.ext.gdpr becomes regs.gdpr, user.ext.consent becomes user.consent, source.ext.schain becomes source.schain, and regs.ext.us_privacy becomes regs.us_privacy. Enumerated lists were removed from the spec body and now point to AdCOM 1.0. From 2.6-202303, imp.video.plcmt replaces the deprecated placement field with different enum values and no one-to-one mapping. Also note deprecations: user.yob, user.gender, video/audio sequence, and the hashed device ID fields. Validate against your target 2.6 snapshot to catch stragglers.
OpenRTB 2.5 vs 2.6 · placement vs plcmt
## What changed in OpenRTB 2.6?
OpenRTB 2.6 added CTV pod bidding (podid, poddur, podseq, maxseq, rqddurs, slotinpod, mincpmpersec on video and audio), made SupplyChain, EID/UID, gdpr, and consent first-class objects and fields, and moved all enumerated lists out of the spec into AdCOM 1.0. It also added bid.mtype, imp.rwdd, imp.ssai, structured UserAgent and BrandVersion objects, cattax for taxonomy versioning, and the AUCTION_MIN_TO_WIN macro, while deprecating user.yob, user.gender, the hashed device IDs, and video/audio sequence. Later dated updates added more: GPP fields and DOOH objects in 2.6-202211, plcmt in 2.6-202303.
OpenRTB 2.5 vs 2.6 · OpenRTB version snapshots
## Is OpenRTB 3.0 worth adopting, and who actually uses it?
For most integrations, not yet: OpenRTB 3.0 has displaced very little 2.x traffic, and the 2.x line remains under active development, with IAB Tech Lab shipping regular 2.6 updates. 3.0 is a ground-up layered redesign: the transaction layer (auction mechanics) is separated from the domain layer, which is defined by AdCOM, and it adds a signed supply chain trust layer. It is deliberately not backwards compatible with 2.x, so adopting it means a parallel integration, not an upgrade. It is worth understanding, and worth building against if a major partner requires it, but 2.6 is where the ecosystem transacts today.
OpenRTB 2.6 vs 3.0
## What are the OpenRTB 2.6 dated snapshots and why do they matter?
Since 2.6, IAB Tech Lab ships the spec as dated releases (2.6-202204, 2.6-202210, 2.6-202211, 2.6-202303, and onward through 2.6-202505) instead of new minor version numbers. They matter because fields appear, move, and get deprecated between snapshots: regs.gpp and gpp_sid arrived in 2.6-202211, and imp.video.plcmt replaced placement in 2.6-202303. Saying a partner is on 2.6 is therefore not precise enough to validate against. RTBlint tracks each snapshot as a separate rule catalog so you can pin the exact revision your integration targets.
OpenRTB version snapshots · Browser tester
## Which OpenRTB version is most used?
OpenRTB 2.5 and 2.6 carry the overwhelming majority of real-time bidding traffic; there are no reliable public numbers splitting the two, but 2.6 adoption keeps growing as CTV pod bidding and first-class privacy fields pull integrations forward, while plenty of production endpoints still speak 2.4 or 2.5. OpenRTB 3.0 remains a small fraction of traffic despite being final since 2018. Practically, build and validate against 2.6 (ideally a specific dated snapshot), and expect to keep accepting 2.5-shaped requests, with the promoted fields still in ext, for a long time.
OpenRTB version snapshots
## Is OpenRTB backwards compatible between versions?
Within the 2.x line, largely yes: revisions are mostly additive, so a 2.4 request is generally still parseable by a 2.6 endpoint. The exceptions are field promotions (gdpr, consent, schain, us_privacy moved from ext to first-class paths in 2.6), the plcmt replacement of video placement in 2.6-202303 (different enum values, no direct mapping), and removals of long-deprecated attributes like banner wmax/hmax. OpenRTB 3.0 is explicitly not backwards compatible with 2.x: different object model, different layering, separate integration. So treat 2.x upgrades as migrations of specific fields, and 3.0 as a new protocol.
OpenRTB 2.6 vs 3.0 · placement vs plcmt
## What is AdCOM?
AdCOM (Advertising Common Object Model) is the IAB Tech Lab spec that defines the domain objects of an ad transaction: media (the ad and its assets), placement (where it can run), and context (site, app, user, device, regs). OpenRTB 3.0 is built on it directly, keeping only auction mechanics in OpenRTB itself and delegating everything domain-shaped to AdCOM. It also matters for 2.x work: OpenRTB 2.6 removed its own enumerated lists section, so values like category taxonomies, connection types, and agent types are now defined by the AdCOM 1.0 lists that 2.6 field descriptions point to.
OpenRTB enums reference · OpenRTB 2.6 vs 3.0
## Where do I download the OpenRTB spec?
The authoritative sources are IAB Tech Lab's GitHub repositories, no PDF hunting required. OpenRTB 2.6 lives in the openrtb2.x repo as 2.6.md, with dated releases on that repo's Releases page. OpenRTB 3.0 and the community extensions (schain examples, DSA transparency, and others) live in the openrtb repo, and the AdCOM 1.0 domain spec, including all the enum lists 2.6 references, is in the AdCOM repo. All under the InteractiveAdvertisingBureau organization. For a field-by-field reference with validation context, the RTBlint docs cover the bid request and response objects directly.
OpenRTB docs · Bid request reference
## Still stuck?
If the question is about a specific payload, paste it into the bid request tester : it validates against the exact OpenRTB 2.6 snapshot you pick, client-side, and each finding names the rule and the JSON path. The same checks run from the CLI in CI.
---
# Blog · OpenRTB news and analysis · RTBlint
URL: https://rtblint.org/blog/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog
## OpenRTB news and analysis
What changed in the spec, what IAB Tech Lab is shipping, and what each development means for the people who maintain bid streams. Reference material lives in the docs ; this is the timely layer on top. RSS feed .
October 20, 2026 Supply chain
## DecryptAds mapped more than 2,100 AI recipe domains through ads.txt footprints, and the OpenRTB request still looks like food inventory.
The Oct 20 DecryptAds study expanded roughly 400 manually confirmed AI recipe sites into more than 2,100 MFA domains using ads.txt account IDs and 190 technical footprints. Buyers who validate only site.domain and category fields never see authorship or seller vetting on the bid.
October 17, 2026 Signals
## Google Ad Manager now sends site.pagecat on Ad Exchange requests, and Prebid bidders on the same page still get whatever you put in ortb2.site.
Starting October 15, 2026, Google populates site.cat, site.pagecat, app.cat, and app.pagecat on Authorized Buyers, Open Bidding, and SDK bid requests outside the EEA, UK, and Switzerland. Prebid demand still receives only the publisher ortb2.site object, which is often empty, so contextual models split by path on one URL.
October 14, 2026 Protocol
## Prebid wants ad servers to bid into the header auction so AdX can compete without GAM seeing the winning price first.
At the October 2026 Prebid Summit, a working group proposed reversing the flow so GAM bids into Prebid instead of Prebid feeding GAM. That would functionally unbundle AdX from the ad server and collapse two auction calls into one, but the framework is built for Prebid Server and Google has not committed to that path.
October 11, 2026 Protocol
## A Trusted Server edge auction can price Safari inventory with an OpenRTB object your SSP never saw in the browser.
After Safari blocked adsrvr.org and identity sync hosts, IAB Tech Lab is pushing server-side OpenRTB on publisher edge runtimes. The bid request assembled at the CDN is not the same payload Prebid.js would have sent, and buyer filters keyed on browser user.eids can no-bid anyway.
October 9, 2026 Privacy
## Safari 27 can shrink user.eids on web bid requests while impression counts stay flat.
WebKit bug 324771 lists uidapi.com, ID5, LiveRamp, Permutive, and Audigent domains for unconditional blocking before sync pixels run. Sellers still see Safari traffic; buyers lose the identity entries their models expect.
October 6, 2026 Supply chain
## A publisher clean on your exchange IVT log can still carry a clawback warning on another seller path.
Pixalate October 6, 2026 Clawback Warning labels apps and sites with buyer IVT disputes across 745 exchanges over a rolling 12 months. That is cross-path dispute history, not your impression-level classification rate, and waterfall sellers can hide bad traffic from any one SSP.
October 3, 2026 Supply chain
## Gannett survived summary judgment on Enhanced Dynamic Allocation because cream-skimming is an allocation-order problem, not a bad bid request.
Judge Castel kept EDA, Minimum Bid to Win, and Bernanke for trial on September 30, 2026. The record describes reserved direct inventory cleared through the house exchange at temporary floors before rival exchanges price the same impression, which looks like header bidding losing on quality rather than on OpenRTB shape.
October 1, 2026 Protocol
## The Google ad tech remedies ruling routes AdX and DFP through Prebid, so the bid request Prebid Server builds becomes the compliance record.
Judge Brinkema kept AdX and DFP with Google but ordered functionally equivalent Prebid integrations, AdX bids into rival ad servers, win and loss data for publishers, and a six-year monitor. Equivalence will be argued from logged OpenRTB, so floors, signals, and loss codes need to validate before the integrations ship.
September 29, 2026 CTV
## European programmatic CTV can grow 44 percent while open auction samples stay STB-heavy, because most programmatic views clear as guaranteed deals.
FreeWheel's 1H 2026 report puts 71% of European programmatic ad views on guaranteed programmatic direct against 27% in the US, with CTV at 39% of European programmatic impressions versus 92% in the US. Headline growth rates describe ad-server delivery, not the bid request shape US filters were built on.
September 27, 2026 Protocol
## Authorized Buyers vs OpenRTB is a spec request plus at 3 and imp.ext.billing_id.
OpenRTB at is 1, 2, or 500 and above. Authorized Buyers documents request at 3 as fixed price and requires imp.ext.billing_id. Deal.at 3 is a different field. A spec-only check does not apply the profile.
September 27, 2026 Protocol
## AdCP vs OpenRTB is an agent task against a bid request, and the mapping is where the fields die.
get_products and create_media_buy are not auctions. video_placement_types maps to video.plcmt, not placement. A media buy carries no consent string. The deal id has to land on imp.pmp.deals or the open auction runs.
September 27, 2026 Protocol
## source.tid vs imp.ext.tid is the transaction and one impression inside it, not a single tid column.
source.tid is the transaction on that request. imp.ext.tid is one impression inside it. imp.id is often 1, 2, 3 and does not join paths. A second auction will not reuse the values unless you set them.
September 27, 2026 Protocol
## UID2 vs ID5 vs RampID is one OpenRTB array, and the source domain is what tells them apart.
They are not OpenRTB fields. They travel in user.eids, each with its own source. user.id is the exchange id. user.buyeruid is the cookie sync. An ID with no source is unmatchable. On 2.6 the array is not under ext.
September 27, 2026 Protocol
## GPP vs TCF vs the US Privacy string live on different OpenRTB fields, and one does not fill the others.
TCF is regs.gdpr plus user.consent. The US Privacy string is regs.us_privacy and is legacy next to GPP. GPP is regs.gpp plus regs.gpp_sid. A flag of 1 with no consent string is unresolved.
September 27, 2026 Protocol
## PMP vs preferred deal vs programmatic guaranteed is private_auction, at, and guar.
A private auction is private_auction 1, Deal.at 1 or 2, guar 0. A preferred deal is at 3 and guar 0. Programmatic guaranteed is at 3 and guar 1. Deal.bidfloorcur does not inherit the impression currency.
September 27, 2026 Supply chain
## ads.txt vs app-ads.txt is the domain file or the bundle file, and the request picks which.
Web inventory reads ads.txt for site.domain. App inventory reads app-ads.txt for app.bundle. The first payment hop, hp not 0, has to match a DIRECT or RESELLER line in that file. The CLI does not fetch either file.
September 27, 2026 Protocol
## placement vs plcmt is not a rename: the same integer 2 is a different placement.
video.placement was deprecated in OpenRTB 2.6-202303. video.plcmt uses a new list. Copying the old integer claims the wrong subtype. Muted in-article autoplay that said placement 1 is plcmt 2, not sound-on instream.
September 27, 2026 Supply chain
## ads.txt vs sellers.json vs schain is three files, and a complete chain can still fail the join.
ads.txt is the publisher allowlist. sellers.json is the seller account directory. source.schain is the path on this request. complete 1 with a missing hop is the dishonest case. The CLI does not fetch the files.
September 27, 2026 Protocol
## OpenRTB 2.5 vs 2.6 is a version string that says 2.6 and objects that still live under ext.
A request can announce 2.6 and still carry regs.ext.gdpr, user.ext.consent, source.ext.schain, and video.placement. plcmt and GPP are dated updates. Pin the snapshot on the builder output.
September 27, 2026 Protocol
## A DSP partner sample bid request is not the request production will send.
A solutions engineer at a DSP can validate the sample and still be looking at fields production leaves on the 2.5 paths. The sample has plcmt, regs.gdpr, and one inventory object. The live request has placement, regs.ext.gdpr, site and app together, and a floor with no currency.
September 27, 2026 Protocol
## An exchange bid-request fixture should fail in CI on the builder, not on a cleaned sample.
An engineer at an SSP or an exchange can pin the rtblint action on the JSON the request builder emits. A hand-cleaned golden file stays green while production still writes regs.ext.gdpr, a boolean imp.secure, and both site and app.
September 27, 2026 Protocol
## A publisher captured bid request is not the request the DSP bid on.
An engineer at a publisher can paste the OpenRTB the page or Prebid Server built into the tester. A spec pass on that paste does not describe the body Amazon TAM or Google Open Bidding sent.
September 27, 2026 Protocol
## nurl vs burl vs lurl lines up a win notice, a billing notice, and a loss notice.
test=1 is a non-billable auction, so a burl on that request is not spend. Deal.at of 3 means the floor is the price. Loss 209 is bcat on the request that ran, not a weak CPM.
September 27, 2026 Protocol
## Prebid vs Amazon TAM vs Google Open Bidding lines up three assemblies of one impression.
bcat and badv are per request, so a block in Prebid is not a block in TAM or Open Bidding. If at is omitted, the default is 2, second price, not first price.
September 26, 2026 Signals
## Two-thirds of tested publisher homepages let every synthetic bot through. OpenRTB still treats device.ua as identity telemetry.
A June 2026 benchmark of 21,491 high-traffic domains found 65.3 percent stopped none of ten automated visitors and only 2.4 percent stopped all of them. More than seven in ten let a spoofed AI crawler string through. Buyers who classify invalid traffic from the bid request cannot see that gap on the landing page where forms and pixels fire.
September 24, 2026 Supply chain
## Comscore uniques at a flagship publisher fell seventy-eight percent since 2021. OpenRTB site.domain did not shrink with them.
Status reporting on a September all-hands slide shows Business Insider averaging twenty-one million Comscore uniques in 2026 year-to-date, down from ninety-five million in 2021. Buyers who still buy open-web news on site.domain are pricing the same string while the measured audience behind it collapsed.
September 21, 2026 CTV
## CTV pre-bid show targeting can splice a Content object from app.bundle alone while the exchange still forwards an empty content block.
OpenEPG DB 1.0 maps 375,000+ bundle variations to 580,000+ shows across 13,900+ FAST channels and returns OpenRTB 2.6 Content fields from app.bundle and device.ua with zero publisher opt-in. Buyers who QA only raw SSP logs still see title-blind requests after enrichment already ran upstream.
September 17, 2026 Supply chain
## Jounce puts ninety-eight percent of the bidstream in reach of directness validation. Blunt supply filters act like ads.txt was never crawlable.
IAB Tech Lab's September 2026 supply-chain essay cites Jounce research that ninety-eight percent of bidstream traffic enables independent validation of directness. Buyers who skip ads.txt and sellers.json crawls in favor of hop-count caps alone are refusing inventory the existing stack already authorizes.
September 14, 2026 Supply chain
## Half a billion AI slop impressions in H1 2026 can still arrive as clean OpenRTB requests, because nothing on the bid labels generated junk.
Verification data counted more than 500 million low-quality AI-generated impressions in the first half of 2026, blocked and post-bid combined. Travel and violence topped EMEA category lists. Bid requests that pass ads.txt and field validation still monetize the same pages until a buyer filters outside the payload.
September 11, 2026 CTV
## Console-native FAST sells authenticated gaming identity. The OpenRTB request still reads like generic CTV unless the path declares it.
Live TV on PS5 routes SSAI through Publica and programmatic supply through PubMatic against 125 million PlayStation Network accounts. Third-party FAST apps on the same console only expose device-level IDs. Buyers who segment CTV on devicetype and IP alone cannot tell which identity layer they priced.
September 9, 2026 Privacy
## 57 ad SDKs ship precise location into ad requests without manifest disclosure. OpenRTB device.geo inherits that gap.
A Q2 2026 source-code audit of 698 mobile ad SDKs found 57 transmitting precise geolocation without declaring it in bundled privacy manifests, affecting up to 88,787 apps, and 60+ SDKs built to broadcast location directly into the advertising bidstream. A bid request that passes field validation can still carry coordinates an integrating app never disclosed to the store or the user.
September 7, 2026 Signals
## A 25 percent lead rate at half the CPA is not a supply win. It is an optimization signal fraudsters can manufacture.
An Offernet pet-insurance investigation found 70 percent of leads from cheap app placements with 15 to 25 percent form completion rates, while call-centre callbacks contradicted the data. When buyers optimize on in-platform conversion events without downstream reconciliation, fabricated success looks identical to real demand in the training loop, even though the bid request still passes as a real Android device.
September 5, 2026 CTV
## Open programmatic CTV spends 57 percent on TV sets and 43 percent on phone apps. The auction still sells it as one class.
MediaPost coverage of a June 2026 U.S. open exchange study maps 57% of open programmatic CTV spend to large-screen TV OS players and 43% to mobile apps. Buyers who filter on devicetype=3 alone are aligning to half the money or misclassifying the other half, because OpenRTB never segregates the two surfaces in the deal label.
September 3, 2026 Privacy
## UK consumers block fewer ads than the global average, but two-thirds opt out of cookie tracking. That split is a bidstream problem.
A survey of 22,000 consumers finds 40% of UK users run ad blockers versus 47% globally, while 68% have opted out of cookie tracking. Inventory that still ships with third-party identity but thin privacy metadata is priced as addressable when the user population has already rejected cross-site profiling.
August 31, 2026 Signals
## MRC invalid traffic rules require a decision rate. Unknown impressions are not clean.
Accredited measurement must report how many impressions had enough telemetry to classify invalid traffic. The MRC worked example leaves 15 of 100 rendered impressions unknown, and explicitly forbids treating unknown as valid. OpenRTB fields for IP, user agent, and app identity are the same signals.
August 29, 2026 Video
## A spec-valid video bid can still fill with empty VAST.
OpenRTB can accept imp.video and a well-formed bid.adm while the VAST inside is a wrapper that returns no ads, a SIMID file with no MediaFile, or a companion with no width. Bid-stream QA is not tag QA.
August 28, 2026 CTV
## Half a million streaming shows get ranked from app.bundle alone. Your content object is optional to everyone but you.
Pixalate's July 2026 OpenEPG Index maps 532,000+ U.S. streaming TV shows from open-exchange bundle IDs without publisher opt-in. News drew 52% of mobile programmatic spend at 6.1% IVT while CTV news over-monetized at 37% spend versus 28% reach. Buyers who hard-require content.title are filtering on a field sellers rarely send.
August 26, 2026 Agentic
## adagents.json does not audit schain. Those two trust files do not talk.
AgenticAdvertising.org put publisher authorization in /.well-known/adagents.json. IAB Tech Lab already had ads.txt, sellers.json, and source.schain. A hop can be a valid seller and an unauthorized agent at the same time, because nothing in OpenRTB cross-checks the two files.
August 26, 2026 Protocol
## imp.native.request is a JSON string, not a nested object.
OpenRTB 2.x sends the Native request as a string inside imp.native.request, not as a nested JSON object. A bidder that json.Unmarshal into a struct without a second parse accepts the impression and never reads the assets.
August 25, 2026 Signals
## Car head units now join the residential proxy pool. OpenRTB still has no field for that device class.
Kaspersky documented the first in-the-wild malware on Android automotive infotainment systems: click fraud and a BADBOX-linked residential proxy botnet delivered through a legitimate firmware updater. Pre-bid datacenter lists miss those IPs; the bid request does not say the device is a car.
August 21, 2026 Supply chain
## A spec-valid SupplyChain hop can still be pooled inventory. ads.txt certifies the seller ID, not the site.
Dark pooling shares one authorized seller ID across unrelated domains. Buyers who only check that schain nodes appear in ads.txt and sellers.json will pass inventory they never meant to fund. Two academic crawls put a size on those pools.
August 21, 2026 Signals
## OpenRTB carries device.ipv6 beside device.ip. IPv4-only datacenter blocks miss the parallel path.
During the dual-stack transition, a bid request can expose a residential device.ip and a datacenter device.ipv6 on the same impression. IPv4-only pre-bid datacenter lists miss that path; blunt IPv4 blocks can also reject an entire household when only a fraction of traffic behind the address is invalid.
August 19, 2026 CTV
## Fraudulent CTV bundle IDs mimic each platform's ID grammar. OpenRTB validates shape, not spoof.
Analysis of the 50 highest-traffic fraudulent CTV bundle IDs finds brand spoofing on Roku, ASIN-style mimicry on Fire TV, numeric ID mimicry on Samsung, and mobile bundles in CTV streams. A well-formed app.bundle passes schema checks while the identity claim is false.
August 16, 2026 CTV
## A CTV app delisted from the store can still bid. The auction keys on bundle ID, not shelf status.
Pixalate's August 2026 CTV pre-bid blocklist flags apps removed from stores that continue generating programmatic traffic. Impression-level IVT does not catch that gap; app-level exclusion does, because OpenRTB never carries whether the store still lists the bundle.
August 14, 2026 Agentic
## OpenRTB has two JSON encodings, and ARTF's own sample corpus uses both
The OpenRTB specification types 28 flag fields as integers. The IAB OpenRTB protobuf schema declares those same fields bool. Both encodings are in the wild, a payload valid in one is invalid in the other, and two of the five ARTF reference samples cannot be parsed by the protobuf JSON parser the framework runs on.
August 8, 2026 Supply chain
## SupplyChain v1.1 adds nodes that never touch the money. Most schain checks assume those cannot exist.
The proposed upgrade puts technical custody entities into the main chain with hp=0, bumps ver, and reworks what complete means. Public comment closes August 21. What that does to hop counting, sellers.json cross-checks, and every validator that treats hp=1 as an invariant.
August 8, 2026 Agentic
## The agentic protocols shipped a version handshake. A bid request still has nowhere to say which OpenRTB it is.
AdCP 3.1 puts a version on every request and response, advertises supported releases, and returns a typed error when a buyer pins one the seller does not serve. AAMP 2.3 added trust verification on price-moving paths. OpenRTB, ten dated snapshots into 2.6, still agrees its version in an onboarding document.
July 31, 2026 CTV
## CTV runs at 65 percent of commercial capacity. Part of that gap is demand that could not read the request.
Omdia's July 29 benchmark puts ad-supported CTV at 65 percent of commercial capacity and prescribes a bigger advertiser base. A seller's fill rate cannot tell a buyer who passed from a buyer who filtered the request before pricing it, and the CTV fields most likely to be wrong are the pod fields carrying the unsold slots.
July 30, 2026 Spec release
## AdCOM 1.0-202607: new enums, five redefined playback methods, and two releases carrying the wrong field names
The July 16 AdCOM release adds the CTV Ad Portfolio enumerations, quietly rewords five existing playback methods, and ships a Content object whose field names were renamed by accident in March and reverted on main a week after the tag. What that does to anything generated from a tagged release.
July 29, 2026 Agentic
## ARTF lets agents rewrite the bid request in flight. Nothing in it checks the result.
The Agentic RTB Framework specifies mutations against a live OpenRTB payload: eight intents, three operations, a path, and a typed payload. Every one of them can produce a request that is no longer valid for the version the exchange is running. What each intent touches, and where to put the check.
July 29, 2026 CTV
## Live event ad insertion: a burst, not a stream, and the OpenRTB fields that carry it
A live break is thousands of impression opportunities released on one cue, with a hard deadline set by the transport stream. Which OpenRTB fields describe that, which one changed meaning in June 2026, and what a bid request for a live pod should actually look like.
July 26, 2026 Standards
## Redefining Media Types: eight new claims, and the bidstream fields they land on
The IAB RMT Standard is in public comment until August 8, 2026 and is designed to be encoded directly into OpenRTB bid requests. Its eight impression-level attributes map onto fields that already exist and are already populated inconsistently. What to audit before the classification lands on top.
July 16, 2026 Revenue
## Bid request quality is a revenue line: the auction economics of broken fields
Every malformed or missing field in a bid request removes bidders, and every removed bidder lowers the clearing price. How field-level breakage turns into CPM decay, QPS deprioritization, and unauditable revenue.
July 15, 2026 Protocol
## What happens when your stack doesn't support an OpenRTB version? Nothing. That's the problem.
VAST has error 102 for version mismatches. OpenRTB has silence: unknown fields are ignored by design, and the version travels in an optional HTTP header. Where the signal actually drops, and how to catch it.
July 14, 2026 Privacy
## What is bidstream data? Everything a bid request broadcasts, field by field
Regulators now use the word bidstream in enforcement orders. What it means at the protocol level: which OpenRTB fields carry location, identifiers, and context, who receives them, and what the spec can and cannot do about it.
July 11, 2026 Protocol
## Will AI agents replace OpenRTB? Why the bid stream is the stable layer
Agentic advertising is reframing how media gets bought, but OpenRTB is not going away. Why both agent stacks build on the bid stream, what actually changes, and why validation matters more, not less.
July 8, 2026 Spec release
## OpenRTB 2.6-202606, field by field: live content and discount macros
The June 2026 dated snapshot added content.realtime and content.firstbroadcast, redefined content.livestream, and added two discount macros. What changed and the migration it forces.
July 5, 2026 Agentic
## AAMP, AdCP, and the bid stream: where agentic advertising actually touches OpenRTB
IAB Tech Lab's AAMP and AAO's AdCP both claim the agentic future. Where each one touches the bid stream, and the OpenRTB 2.6-202606 fields that shipped meanwhile.
June 24, 2026 CTV
## CTV pod bidding grows up: duration floors, guaranteed deals, and live sports
The 2.6 pod bidding toolkit (podid, rqddurs, durfloors, mincpmpersec) was built for the live-sports CTV surge now underway. What sellers actually ship in 2026.
June 10, 2026 Spec release
## OpenRTB 2.6-202505: what changed and what to do about it
A field-by-field look at the May 2025 OpenRTB update and the integration work it creates for exchanges and bidders, centered on the new data.cids field.
May 20, 2026 Signals
## The User-Agent string is going away: sua, client hints, and what to send now
Chrome UA reduction froze device.ua years ago. How the structured device.sua object (UserAgent, BrandVersion) works, and why bidders should parse it first.
May 6, 2026 Privacy
## DSA transparency in OpenRTB: where enforcement stands in 2026
The regs.ext.dsa and bid.ext.dsa extension two years into EU Digital Services Act enforcement: who requires it, what dsarequired values mean in practice.
April 15, 2026 Video
## Three years of plcmt: the state of the placement migration
OpenRTB 2.6-202303 deprecated video.placement for plcmt in April 2023. Three years on, why dual-sending both fields is still the norm, not the exception.
March 31, 2026 Protocol
## OpenRTB 3.0 and ads.cert in 2026: still waiting, still worth watching
Eight years after 3.0 went final, the layered protocol and its signed supply chain remain mostly unadopted. What would have to change, and what to do now.
March 11, 2026 Privacy
## GPP in OpenRTB: regs.gpp, gpp_sid, and the 2026 state sections
Every GPP section id bid requests carry in 2026, what regs.gpp and regs.gpp_sid must contain per OpenRTB 2.6-202211, and the half-pair mistakes validators keep flagging.
February 25, 2026 Spec release
## No more 2.7: how OpenRTB ships now, and why your parser should care
Since 2.6-202211, OpenRTB version numbers only move on breaking changes; everything else lands as dated snapshots. What that means for validation.
February 4, 2026 Spec release
## OpenRTB 2.6-202501 in review: the January update, field by field
OpenRTB 2.6-202501 added content.gtax and content.genres for CTV genre signaling. What changed, who is affected, and how to check your fixtures against it.
January 21, 2026 IAB
## What the IAB Tech Lab 2026 roadmap means for OpenRTB
IAB Tech Lab's 2026 roadmap is mostly agentic advertising. Its one OpenRTB post covers gtax, genres, and a Curation object excluded from OpenRTB itself.
---
# Privacy · RTBlint
URL: https://rtblint.org/privacy/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
## Privacy
Last updated 15 October 2026.
Validation of OpenRTB JSON still runs in your browser via WebAssembly. The CLI, library, and local rtblint-mcp stdio server do not send payloads. The hosted MCP endpoint at rtblint.org/mcp does store a redacted copy, as described below.
## What we keep
The optional updates form saves your email address, the tool whose updates you requested, signup dates and the version of the signup consent in a private database shared by vastlint.org, rtblint.org and pixellint.org. Repeat signups merge tool interests into one address. Email addresses are unverified, and this form does not send emails automatically. We keep the signup until you request removal at aleks@vastlint.org . A saved-signup flag and dismissals are remembered in this browser. Signup analytics contain the tool name, without your email address.
Copying a share link saves the full payload, paired request and validation settings you choose, separately from redacted usage samples. Anyone with that link can retrieve the saved input, including identifiers it contains. Shared links expire after 90 days. Expiry blocks retrieval through the link; stored snapshots and usage samples remain in the database.
Shared-link lookups are limited to 60 per minute per IP at each Cloudflare location, and 300 per IP per UTC week across vastlint.org, rtblint.org and pixellint.org. Failed lookups count too. The weekly counter uses a private identifier derived from the IP address and stores only a count and week timestamp. It resets Monday at 00:00 UTC. Raw IP addresses are not stored in the counter. If you need a higher limit, contact aleks@vastlint.org .
When you paste, type, drop, or share a payload in the tester , or when an agent sends a payload to the hosted MCP server at rtblint.org/mcp, rtblint.org stores a copy of that JSON. Known device IDs, IPs, consent strings, geo coordinates, and identity ids are stripped before storage. Cloudflare also supplies the country and the network owner (ASN number and organization name, for example an ISP or a company network). We use that to see which networks send payloads. We do not store the IP address. We may keep a random session id that exists only while this browser tab is open, so payloads from the same tab can be grouped. If you arrived from another site, we may keep that site's hostname. If the tester URL has utm_source or utm_medium , those values may be kept. Built-in sample scenarios are not sent as payloads. Their validation counts are recorded when sharing is on. The local rtblint-mcp stdio server does not send payloads. Payloads are used to improve validation rules and for the research uses described in the terms . Submitted JSON is not published as a public gallery.
## Validation events
Each settled tester run and hosted MCP validation can record the selected version, dialect, profile, engine version, finding codes, severities, paths, and counts. Repeating a validation records a new event while identical redacted samples remain deduplicated. Events identify built-in examples and explicitly labeled synthetic MCP inputs. They record whether a paired request was used, without storing its content in this event table. Web findings are client-reported. MCP findings come from the hosted engine. Events expire after 30 days and are removed by daily cleanup. Turning off payload sharing also stops these tester events.
## How we use stored payloads
We may parse, cluster, and derive fixtures and rules from a submitted payload while developing and testing rtblint. We may also use stored payloads for research and scientific publication: aggregate statistics, issue-level findings (rule identifiers and structural paths, without JSON values), and papers or preprints based on those. For payloads submitted after 26 August 2026, we may quote short redacted excerpts when they illustrate a finding and do not identify a natural person. We do not fetch live bid URLs found in a sample. We do not sell payloads. We do not publish submitted JSON as a public gallery. Details are in the terms .
## Integration help requests
If you use the homepage contact form, we email your address and optional message to the project inbox and store them so we can reply. Contact requests are private and are not combined with submitted OpenRTB payloads or used for marketing. We do not store your IP address in the contact record. Email alex@vastlint.org to ask us to delete your request.
## Opt out
The tester has a control for sharing entered payloads. Turning that off sets a flag in this browser only. It stops new payload sends from that browser, and it also stops session recording and tester activity logs. Stop session recording pauses recordings and activity logs without changing payload sharing. Neither control recalls data already stored or withdraws research use of stored payloads. Neither control applies to the hosted MCP server. Email aleks@vastlint.org to exclude a previously stored sample from research. To keep payloads off the network, use the local rtblint-mcp stdio server or the CLI.
## Session recordings
The homepage and tester record page layout, clicks, scrolling, and timestamps so we can find usability problems. Each browser tab gets a random session id. A separate random id in local storage groups later recordings from the same browser profile. We do not fingerprint the browser. Recordings can include visible page text, text entered on those pages, pasted JSON, full URLs, and validation results. Third-party iframe contents are not recorded. Recordings are stored in a private Cloudflare R2 bucket and may be downloaded for local analysis. No automatic deletion period is configured. Stop session recording, on the homepage, tester, and this page, stops future recordings in this browser.
## Tester activity logs
The tester logs each payload load and each settled validation run, including the submitted JSON and the result. A paired bid request or ARTF envelope is logged with the run when one was entered. Built-in scenarios log only the scenario id. These entries use the same private R2 bucket and browser identifiers as session recordings. No automatic deletion period is configured. Turning off payload sharing, and Stop session recording, both stop future tester activity logs.
## Analytics
The public site uses Google Analytics and Cloudflare Web Analytics for page traffic. That is separate from payload storage.
---
# Terms · RTBlint
URL: https://rtblint.org/terms/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Legal
## Terms
Last updated 26 August 2026.
These terms govern rtblint.org, the hosted tester, the hosted MCP server at rtblint.org/mcp, and related APIs. Using those tools means you accept these terms. If you do not accept them, do not paste, type, drop, share, or send a payload to the hosted MCP endpoint. The CLI, library, and local rtblint-mcp stdio server do not send payloads and are not covered here except where you later submit the same payload through a hosted tool. Privacy describes what we keep. These terms describe what you allow us to do with it.
## Submitting a payload
If you paste, type, drop, or share JSON in the tester, or send a payload to the hosted MCP server, you are submitting that payload. You represent that you have the right to submit it, that you are authorized to let us handle it as described here, and that doing so will not violate any contract, insertion order, privacy law, or third-party right. Do not submit a live production payload unless you accept that we may treat it as a development and research sample.
## License
You grant the operator of rtblint.org a worldwide, royalty-free, irrevocable, non-exclusive license to copy, store, parse, transform, retain, and use submitted payloads, for operating the tools; for developing, testing, and improving validation rules and related products; and for research and scientific publication as described below. That includes replaying, redacting, clustering, and deriving fixtures and rules from the JSON.
We do not fetch live bid URLs found in a sample. We do not sell payloads. We do not publish submitted JSON as a public gallery or as a downloadable raw corpus. We may keep a sample after you opt out in the browser; opt-out stops new sends from that browser, it does not recall payloads already stored.
## Research and scientific use
We may use submitted payloads for research and scientific publication about OpenRTB validation, specification conformance, and related advertising-technology protocols. That includes:
computing and publishing aggregate statistics
publishing preprints, papers, talks, and similar scholarly work
publishing issue-level datasets (rule identifiers and structural paths, without submitted JSON values)
for payloads submitted after this notice is posted, quoting short redacted excerpts when they illustrate a finding and do not identify a natural person
For payloads already stored before this notice, research is limited to uses that do not publish submitted JSON: aggregate statistics, issue-level findings, and papers or preprints based on those. We will not quote submitted JSON from those older samples. Email aleks@vastlint.org if you want a previously stored sample excluded from research.
## No warranty
The site and tools are provided as is, for QA and engineering. We do not warrant that validation is complete, or that a green result will pass any exchange. Use at your own risk.
## Limit of liability
To the maximum extent permitted by law, the operator of rtblint.org is not liable for lost profits, ad spend, campaign delivery, brand-safety flags, third-party vendor charges, or any indirect or consequential loss, whether in contract, tort, or otherwise, arising from use of the tools or from our handling of a submitted payload. Aggregate liability for all claims relating to the free hosted tools is limited to the greater of fees you paid us for those tools (currently none) or one hundred US dollars.
## Indemnity
You will defend and indemnify the operator of rtblint.org, and people working on it, against claims, damages, and costs (including reasonable legal fees) that arise from a payload you submitted or from your breach of these terms, including claims by your employer, a demand partner, an SSP, a DSP, a publisher, or a measurement vendor.
## Changes
We may update these terms. The updated text applies to payloads submitted after it is posted. Continued use of the tools after a change is acceptance of the new terms. The research uses for already-stored payloads are described in Research and scientific use above.
## Contact
Questions: aleks@vastlint.org .
---
# How to validate an OpenRTB bid request · RTBlint
URL: https://rtblint.org/guides/validate-openrtb-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## How to validate an OpenRTB bid request
Paste the request into the bid request tester or run rtblint validate request.json . Either way you get the same findings: parse errors, missing required fields, type mismatches, unknown or moved fields, and enum values the spec does not document. This guide walks through both paths and shows how to read the output.
## What validation catches
An OpenRTB bid request is one JSON object, and most of the ways it goes wrong are mechanical. A validator checks the payload against a tracked snapshot of the spec and reports, in rough order of severity:
Malformed JSON. The payload does not parse, or parses to something other than a single object at the root. Nothing else can be checked until this is fixed.
Missing required fields. OpenRTB 2.6 requires id (the request ID) and imp with at least one Imp object. Each Imp in turn needs its own id .
Type mismatches. at is an integer (auction type, default 2), not the string "2" . tmax is an integer of milliseconds. imp[].bidfloor is a float.
Unknown fields. A key the selected version does not define, usually a typo like bidflor or an exchange-specific field placed outside ext .
Deprecated and moved paths. imp.video.placement was deprecated in favor of plcmt in the 2.6-202303 update, and regs.ext.gdpr became regs.gdpr in 2.6. See placement vs plcmt for the first case.
Out-of-range enum values. Since 2.6 the enumerated lists live in AdCOM 1.0. at allows 1, 2, or exchange-specific values of 500 and above; a bare 9 is invalid. The enums reference collects the lists that matter for requests.
## Validate in the browser
Open the bid request tester . It is the RTBlint Rust core compiled to WebAssembly, so validation runs in your browser. Payloads you enter may be stored; see privacy and terms .
Paste the bid request JSON, or start from the built-in sample.
Pick the spec snapshot to validate against. The default is the latest tracked 2.6 release (2.6-202505); older snapshots exist because behavior changed between them, as the version reference documents.
Read the findings list. Errors mean the request violates the spec; warnings mean it parses but carries something deprecated or inadvisable.
## Validate with the CLI
The same core ships as a Rust CLI:
cargo install rtblint
# validate a file
rtblint validate request.json
# validate from a pipe
cat request.json | rtblint validate --stdin
# pin a spec snapshot
rtblint validate request.json --version 2.6-202505
# machine-readable output
rtblint validate request.json --format json
The exit code is 0 when the request is valid (warnings allowed), 1 when it has errors, and 2 on usage or I/O problems, so it drops straight into scripts. See OpenRTB validation in CI for a GitHub Actions setup and the CLI docs for the library API.
## Reading a finding
Every finding has three load-bearing parts:
Rule ID , such as openrtb.field.moved : a stable name for the class of problem, suitable for grepping or gating. The rule catalog lists them all.
JSON path , such as imp[0].video.placement : exactly where in the payload the problem sits.
Severity : error (spec violation) or warning (legal but deprecated or risky).
## A worked example
This request has three problems that show up constantly in the wild:
{
"id": "req-83f1",
"at": "2",
"imp": [
{
"id": "1",
"video": { "mimes": ["video/mp4"], "placement": 1 }
}
],
"regs": { "ext": { "gdpr": 1 } }
}
RTBlint reports, against 2.6-202505:
FAILED (OpenRTB 2.6-202505): 2 error(s), 1 warning(s).
- [error] at: at expects integer but received string.
(openrtb.type.mismatch)
- [warning] imp[0].video.placement: imp.video.placement is
deprecated in OpenRTB 2.6-202505. (openrtb.field.deprecated)
- [error] regs.ext.gdpr: regs.ext.gdpr moved in OpenRTB
2.6-202505; use regs.gdpr. (openrtb.field.moved)
The fixes: send "at": 2 as an integer, replace placement with plcmt , and move the GDPR flag to regs.gdpr . Requests like this often still get parsed by lenient bidders, which is exactly why the mistakes survive: they fail selectively, on the partners that enforce types, and those partners simply stop bidding.
## FAQ
## What makes an OpenRTB bid request invalid?
Anything that breaks the published spec: JSON that does not parse, a root that is not a single object, a missing required field (id, or the imp array with at least one Imp object), a wrong type such as at sent as a string, a field at a path the selected version does not define, or a value outside a documented enum such as at = 9.
## Does the tester send my bid request to a server?
Validation runs as WebAssembly in your browser. Payloads you paste in the tester, and payloads an agent sends to rtblint.org/mcp, may be stored with device IDs, IPs, and consent strings stripped. Built-in samples are not sent. Opt out on the tester (that does not cover hosted MCP), or use the CLI or local rtblint-mcp if the payload must not leave the machine. See rtblint.org/privacy and rtblint.org/terms.
## Which OpenRTB versions can I validate against?
Rule depth is richest on the OpenRTB 2.6 snapshots (2.6-202204 through 2.6-202505). Object catalogs for undefined-field and type checks cover 2.0 through 3.0.
## Validate it
Paste a request into the bid request tester to see these checks run live, client-side. For repeatable checks, cargo install rtblint and wire rtblint validate into your pipeline. The full list of what runs is in what RTBlint checks .
---
# Common OpenRTB bid request mistakes · RTBlint
URL: https://rtblint.org/guides/common-openrtb-mistakes/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## Common OpenRTB bid request mistakes
Ten bid request mistakes that show up in production traffic again and again, each with the exact field path and the fix per the OpenRTB 2.6 spec. Most of them do not throw errors anywhere; they just cost bids from whichever partners enforce the rule.
## 1. Missing the imp array
A bid request requires exactly two things at the top level: id and imp , an array with at least one Imp object. Requests with an empty imp array, or with a single impression object instead of an array, are invalid. Each Imp also needs its own id , unique within the request, and at least one of banner , video , audio , or native to say what is for sale. Full field list in the bid request reference .
## 2. Sending at as a string
at is the auction type: an integer, where 1 = First Price, 2 = Second Price Plus, and values of 500 or greater are exchange-specific. It defaults to 2 when omitted, so leaving it out is fine. Sending "at": "2" is not: a typed parser rejects the whole request. The same string-vs-integer bug appears on test , tmax , and the flag fields; JSON has real numbers, use them.
## 3. Still using imp.video.placement instead of plcmt
The 2.6-202303 update deprecated imp.video.placement in favor of imp.video.plcmt , with new values from the AdCOM 1.0 list Plcmt Subtypes - Video (1 = Instream, 2 = Accompanying Content, 3 = Interstitial, 4 = No Content / Standalone). The two lists do not map one to one, so this is a re-declaration, not a rename. Buyers increasingly key instream classification off plcmt . Details in placement vs plcmt .
## 4. GDPR flag left at regs.ext.gdpr
OpenRTB 2.6 promoted the GDPR applicability flag from the extension into the core Regs object: it is regs.gdpr (integer, 0 = no, 1 = yes, omitted = unknown). The companion consent string moved too, from user.ext.consent to user.consent . Requests built on 2.5-era code keep writing regs.ext.gdpr , and 2.6-native consumers never see it. The privacy signals reference covers GDPR, us_privacy , and the GPP fields ( regs.gpp and regs.gpp_sid , added in 2.6-202211).
## 5. schain under source.ext.schain instead of source.schain
OpenRTB 2.6 pulled the SupplyChain object into the core spec: it lives at source.schain and is marked recommended. Under 2.5 it traveled as source.ext.schain per the separate SupplyChain object spec. Writing the old path on a 2.6 request, or duplicating the object at both paths with divergent nodes, breaks sellers.json validation downstream. See the supply chain reference .
## 6. Both site and app present
The spec is blunt: a bid request must not contain more than one of a site , app , or dooh object. They answer the same question (what kind of inventory is this) and a request carrying two of them is ambiguous, so many bidders drop it outright. This usually comes from a request builder that merges publisher defaults with placement data. Pick the one that matches the inventory and omit the others.
## 7. Assuming bidfloorcur follows the request currency
imp.bidfloor is the minimum CPM, and imp.bidfloorcur is its currency, defaulting to "USD" . It does not inherit from cur or from anything else. A floor of 120 that you meant as Japanese yen but sent without "bidfloorcur": "JPY" reads as a 120 USD floor and kills every bid. Deals carry their own independent bidfloor and bidfloorcur on each entry in imp.pmp.deals , with the same USD default. More in the floors reference .
## 8. Misreading imp.secure
imp.secure is an integer flag: 1 means the impression requires HTTPS creative assets and markup, 0 means non-secure is acceptable. Two mistakes recur. First, sending true instead of 1 ; it is an integer, not a boolean. Second, assuming omission implies secure: per the spec, if the field is omitted the secure state is unknown and non-secure HTTP support can be assumed. Publishers on HTTPS pages (which is nearly everyone) should send "secure": 1 explicitly.
## 9. Misunderstanding tmax
tmax is the maximum time in milliseconds the exchange allows for bids to be received, including internet latency. It is set by the exchange, describes the whole round trip, and supersedes any prior guidance. It is not the bidder's compute budget: a bidder that spends tmax milliseconds thinking has already timed out, because the network ate part of the budget. Bidders should also not overwrite it when forwarding a request downstream except to decrease it. More in the tmax reference .
## 10. Malformed category values in cat and bcat
Content and advertiser categories ( site.cat , app.cat , bcat , and its allowlist counterpart acat ) are arrays of IAB Tech Lab taxonomy IDs, and the taxonomy in use is declared by the adjacent cattax field, which defaults to 1 (Content Category Taxonomy 1.0, the familiar "IAB1-1" style IDs). The common failures: free-text values like "News" , lowercase "iab1" , or Content Taxonomy 2.x/3.x IDs sent while cattax is absent and therefore still means taxonomy 1.0. Whatever taxonomy you use, say so in cattax and keep the IDs from that list.
## Why these persist
None of these mistakes produce an error message. A request with regs.ext.gdpr or a string at still gets accepted by lenient parsers, so the sender sees traffic flowing and assumes all is well, while stricter partners silently no-bid. Half of the list exists because fields moved between 2.5 and 2.6; the 2.5 vs 2.6 guide maps those migrations in one place.
## Validate it
Every mistake on this page is a stable RTBlint finding: the moved GDPR flag triggers openrtb.field.moved , the string at triggers a type mismatch, the deprecated placement triggers openrtb.field.deprecated , and site plus app is flagged as mutually exclusive. Paste a request into the bid request tester to check yours client-side, or run the same rules in CI with the CLI .
---
# placement vs plcmt in OpenRTB video · RTBlint
URL: https://rtblint.org/guides/placement-vs-plcmt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## placement vs plcmt in OpenRTB video
video.placement was deprecated in the OpenRTB 2.6-202303 update in favor of video.plcmt . They are different fields with different enums: placement uses the old five-value list (1 In-Stream through 5 Interstitial/Slider/Floating), plcmt uses a new four-value list (1 Instream, 2 Accompanying Content, 3 Interstitial, 4 No Content/Standalone). The values do not map one to one. During migration, send both.
## Two fields, two lists
Both fields live on the Video object of the bid request and both draw their values from AdCOM 1.0, where all 2.6 enums are maintained. placement points to List: Placement Subtypes - Video, which AdCOM now marks deprecated as of the 2.6-202303 release. plcmt points to List: Plcmt Subtypes - Video, written to match the updated IAB Digital Video Guidelines. The spec entry for placement now reads simply: deprecated as of OpenRTB 2.6-202303, use plcmt instead.
## Old list: placement (deprecated)
Value Name Definition
1 In-Stream Played before, during or after the streaming video content that the consumer has requested (pre-roll, mid-roll, post-roll).
2 In-Banner Exists within a web banner that uses the banner space to deliver a video experience. Relies on display inventory on the page for delivery.
3 In-Article Loads and plays dynamically between paragraphs of editorial content, existing as a standalone branded message.
4 In-Feed Found in content, social, or product feeds.
5 Interstitial/Slider/Floating Covers the entire or a portion of screen area, but is always on screen while displayed (cannot be scrolled out of view).
## New list: plcmt
Value Name Definition
1 Instream Pre-roll, mid-roll, and post-roll ads played with streaming video content the consumer requested. Must be sound-on by default at player start, or have explicit user intent to watch. The video must be the focus of the visit and the only in-view player capable of audio while playing.
2 Accompanying Content Pre-roll, mid-roll, and post-roll ads with streaming video content, where the player loads before, between, or after paragraphs of text or graphical content and starts playback only on entering the viewport. May convert to a floating or sticky player when scrolled off the page.
3 Interstitial Video ads played without video content. Must be the primary focus of the page during playback, take up the majority of the viewport, and cannot be scrolled out of view.
4 No Content/Standalone Video ads played without streaming video content, in placements such as slideshows, native feeds, in-content, or sticky and floating units.
## Why the change happened
The old list described where a player sat on the page. It said nothing about whether the user asked for the video or whether the sound was on, and over time a large share of muted autoplay outstream inventory was sold as placement=1 In-Stream. The updated IAB Digital Video Guidelines, following the MRC's tightened definition of instream, made user intent and audio the test: under the new list, Instream ( plcmt=1 ) requires sound-on by default at player start or explicit intent to watch, with the video as the focus of the visit. Everything that fails that test is now Accompanying Content, Interstitial, or No Content/Standalone. The point is transparency in monetization: buyers paying instream CPMs get inventory that meets the instream definition.
That is also why the two enums cannot be converted mechanically. Old In-Stream splits into new Instream or Accompanying Content depending on audio and focus. The IAB implementation guide's own examples show placement=1 paired with plcmt=1 for true instream, and placement=3 In-Article paired with plcmt=4 No Content/Standalone. Classify each placement against the new definitions; do not write a lookup table.
## Migration guidance
The IAB's transition pattern is to send both fields, each with the correct value from its own list:
{
"imp": [{
"id": "1",
"video": {
"mimes": ["video/mp4"],
"placement": 1,
"plcmt": 1
}
}]
}
Audit each video placement against the new definitions: is sound on by default, did the user request the content, is the player the focus of the visit?
Set plcmt from the new list on every video request. For CTV, full-episode and live streams are plcmt=1 .
Keep sending placement with its legacy value while demand partners still read it. Buyers on the updated definitions read plcmt ; legacy DSPs read placement .
Drop placement once your partners confirm they key on plcmt . New integrations should not read placement at all.
Downgrading previously "instream" inventory to plcmt=2 is not a penalty: honest signals keep the supply biddable by buyers who now filter on the new field. The CTV page covers how plcmt interacts with pod bidding fields, and the 2.5 vs 2.6 guide puts the change in context of the other dated updates.
## FAQ
## Do I send both placement and plcmt?
Yes, during the transition. The IAB implementation guide shows exactly this pattern: keep the legacy value in video.placement for buyers still reading the old list, and set video.plcmt from the new list. Buyers on updated definitions read plcmt; once your demand partners confirm they do, you can drop placement.
## What is plcmt 2 (Accompanying Content)?
Video with streaming content that plays alongside text or graphical content rather than being the reason for the visit. It starts playback only on entering the viewport and may convert to a floating or sticky player. Much inventory that claimed placement=1 In-Stream under the old list, such as muted autoplay players in articles, belongs in plcmt=2 under the new definitions.
## Is plcmt required in OpenRTB 2.6?
The spec does not mark it required. In practice video buyers increasingly key pricing and eligibility on plcmt because it separates true sound-on instream from accompanying and standalone video, so omitting it costs money on CTV and instream web supply.
## Validate it
Paste a video bid request into the bid request tester and RTBlint flags the deprecated field at its exact path, for example imp.0.video.placement , via its deprecated and moved field checks ( openrtb.field.deprecated , openrtb.field.moved ), and checks plcmt against the documented AdCOM values. The CLI runs the same rules in CI: rtblint validate request.json .
---
# OpenRTB no-bid reason codes (nbr) · RTBlint
URL: https://rtblint.org/guides/openrtb-no-bid-reasons/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB no-bid reason codes (nbr)
A bidder that passes on an impression can answer with an empty HTTP 204, or return a BidResponse whose nbr field carries a no-bid reason code: 0 Unknown Error, 1 Technical Error, 2 Invalid Request, and so on up to 17, with 500 and above reserved for exchange-specific values. The full table is below.
## Three ways to say no-bid
The OpenRTB 2.6 spec gives a bidder these options when it does not want the impression:
HTTP 204 with an empty body. The spec says calls returning no content in response to valid requests should return HTTP 204. This is the most bandwidth-friendly form and what most production bidders send.
An empty or bid-less response. A response with no actual bids (an empty seatbid , or a body the exchange cannot parse) is also interpreted as a no-bid. Malformed bodies count as no-bid too, which is why broken responses fail silently.
A BidResponse with nbr . If the bidder wants to tell the exchange why it passed, it returns just a BidResponse object with the request id and a reason code in nbr . The spec encourages this because it makes no-bids debuggable.
A minimal reasoned no-bid looks like this:
{
"id": "9d2f2b1e-7a41-4b8c",
"nbr": 2
}
One versioning quirk: OpenRTB 2.6 defines the nbr field but points to the No-Bid Reason Codes list maintained in the OpenRTB 3.0 document, the same place its other enums point to AdCOM 1.0. The values below come from that list. See the bid response anatomy page for where nbr sits relative to seatbid .
## The no-bid reason code table
Value Name Meaning
0 Unknown Error Something failed and the bidder cannot say what.
1 Technical Error An internal failure on the bidder side (timeout, crash, dependency down).
2 Invalid Request The bid request itself was malformed or failed the bidder's validation.
3 Known Web Crawler The user agent matched a known spider or bot list.
4 Suspected Non-Human Traffic IVT filters flagged the request as likely bot traffic.
5 Cloud, Data Center, or Proxy IP The IP resolved to hosting infrastructure, not an end user.
6 Unsupported Device The bidder does not buy on this device or OS.
7 Blocked Publisher or Site The site, app, or publisher is on the bidder's block list.
8 Unmatched User No usable user ID or cookie match, so the bidder cannot target.
9 Daily User Cap Met Frequency cap for this user already reached today.
10 Daily Domain Cap Met Spend or impression cap for this domain already reached today.
11 Ads.txt Authorization Unavailable The bidder could not retrieve an ads.txt file to verify the seller.
12 Ads.txt Authorization Violation The seller is not authorized in the publisher's ads.txt.
13 Ads.cert Authentication Unavailable No ads.cert signature was available to authenticate the request.
14 Ads.cert Authentication Violation The ads.cert signature failed verification.
15 Insufficient Auction Time Not enough time left inside tmax to run the bidder's own auction.
16 Incomplete SupplyChain The SupplyChain object is missing nodes (complete != 1).
17 Blocked SupplyChain Node A node in the SupplyChain object is on the bidder's block list.
500+ Exchange-specific Private values; the spec says to communicate them with buyers beforehand.
Codes 9 and 10 (the daily caps) were added in the OpenRTB 2.5 era; 11 through 17 cover ads.txt, ads.cert, auction timing, and SupplyChain checks. Anything at 500 or above is private to the exchange and only meaningful if it was agreed with the buyer beforehand.
## Debugging systematic no-bids
A bidder that never bids is usually not a demand problem. Work through the codes in order of likelihood:
nbr 2 (Invalid Request) first. Run the exact bid request you send through a validator. Malformed JSON, a missing imp , a device.devicetype outside the documented list, or a field left at a pre-2.6 path can all trip a bidder's request parser. The validate a bid request guide walks through this.
nbr 15 (Insufficient Auction Time). Check your tmax and measured network latency to that bidder. A 120 ms budget with 80 ms of transit leaves little room.
nbr 11, 12, 16, 17. Supply path checks: confirm your ads.txt entries and that source.schain (moved from source.ext.schain in 2.6) is complete.
nbr 8 (Unmatched User). Expected on cookieless traffic; a high rate on web traffic suggests a broken cookie sync.
If the bidder only sends 204s and no nbr , you are debugging blind. Ask the integration team to enable reason codes in test, then validate on your side anyway: most nbr 2 cases are visible in the request before it ever leaves your servers.
## Loss reason codes are the other half
No-bid reasons flow bidder to exchange. The reverse channel exists too: when a bid was made but lost, the exchange can fire the bid's lurl loss notice and substitute a Loss Reason Code into the ${AUCTION_LOSS} macro. That list (0 Bid Won, 100 Bid was Below Auction Floor, 102 Lost to Higher Bid, 200-range creative filtering, and more) also lives in the OpenRTB 3.0 document. Different list, different direction; do not mix the two when logging. The full table is in the loss reason codes guide .
## FAQ
## Is nbr required in a no-bid response?
No. nbr is optional. The most common no-bid signal is an empty HTTP 204 response with no BidResponse at all. A bidder only sends a BidResponse with nbr when it wants to tell the exchange why it passed, which mainly matters during integration and debugging.
## What does nbr 2 (Invalid Request) mean?
The bidder rejected the bid request itself: malformed JSON, a missing required field, a wrong type, or a value outside the documented enums. If one bidder returns nbr 2 systematically, validate the requests you send it against the OpenRTB spec before digging into that bidder's docs.
## Why do bidders answer with HTTP 204 instead of a body?
Bandwidth and simplicity. The OpenRTB spec says calls returning no content in response to valid requests should return HTTP 204, and an empty response is the most bandwidth-friendly form of a no-bid. At billions of requests per day, skipping the JSON body is a real saving.
## Validate before you debug
Since nbr 2 is the code you can fix unilaterally, start there. Paste a bid request into the bid request tester and RTBlint will flag malformed JSON ( openrtb.payload.invalid_json ), undefined fields ( openrtb.field.undefined ), and fields at moved or deprecated paths ( openrtb.field.moved , openrtb.field.deprecated ) against the OpenRTB 2.6 spec. The same checks run in CI via the CLI : rtblint validate request.json .
---
# OpenRTB loss reason codes (lurl) · RTBlint
URL: https://rtblint.org/guides/openrtb-loss-reason-codes/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB loss reason codes (lurl)
When a bid loses, the exchange can call the bid's lurl loss notice and substitute a Loss Reason Code into the ${AUCTION_LOSS} macro: 102 Lost to Higher Bid, 100 Below Auction Floor, the 200-range creative filters, and the rest. The full table is below, along with how the notice works and how to read the ranges when you are debugging a falling win rate.
## How a loss notice works
A bidder that wants loss telemetry puts a loss notice URL in bid.lurl , with macros where the facts should go:
{
"id": "1",
"impid": "imp-1",
"price": 9.43,
"lurl": "https://dsp.example.com/loss?auction=${AUCTION_ID}&reason=${AUCTION_LOSS}&mtw=${AUCTION_MIN_TO_WIN}",
"adm": "..."
}
If the bid loses and the exchange supports loss notices, it expands the macros and calls the URL: ${AUCTION_LOSS} becomes the reason code, ${AUCTION_PRICE} is only meaningful on wins, and exchanges that support ${AUCTION_MIN_TO_WIN} fill in the price that would have turned the loss into a win. The macro reference covers the full substitution table.
Three caveats before you build dashboards on this. Loss notices are optional, so absence of a notice is not evidence of a win. Exchanges differ on which codes they send and when (some batch, some sample, some only send economic losses). And the code list itself lives in the OpenRTB 3.0 document, which is where 2.6 points for both this list and the no-bid reason codes ; the values below come from that list.
## The loss reason code table
Value Name Meaning
0 Bid Won Not a loss at all; exists so one notice pipeline can report every bid outcome.
1 Internal Error Something failed inside the exchange while handling the bid.
2 Impression Opportunity Expired The auction or impression window closed before the bid could be used.
3 Invalid Bid Response The response failed the exchange's parsing or validation.
4 Invalid Deal ID The dealid on the bid did not match any deal known to the exchange.
5 Invalid Auction ID The bid's id did not match the request id of a live auction.
6 Invalid Advertiser Domain The adomain was missing, malformed, or not allowed.
7 Missing Markup No adm and no way to resolve markup for a bid that needed it.
8 Missing Creative ID The crid was absent and the exchange requires it.
9 Missing Bid Price No price on the bid object.
10 Missing Minimum Creative Approval Data The exchange needed creative approval attributes that were not supplied.
100 Bid was Below Auction Floor The bid did not clear bidfloor for the impression.
101 Bid was Below Deal Floor The bid referenced a deal but came in under that deal's floor.
102 Lost to Higher Bid Straight economic loss; someone paid more.
103 Lost to a Bid for a Deal A deal-backed bid took priority over this open-auction bid.
104 Buyer Seat Blocked The publisher or exchange blocks this seat on this inventory.
200 Creative Filtered - General; Reason Unknown The creative was filtered and the exchange is not saying why.
201 Creative Filtered - Pending Processing by Exchange The creative is still in scanning or approval and cannot serve yet.
202 Creative Filtered - Disapproved by Exchange The creative was reviewed and rejected.
203 Creative Filtered - Size Not Allowed Creative dimensions did not fit the impression.
204 Creative Filtered - Incorrect Creative Format Wrong media type or format for the slot (for example, video markup in a banner slot).
205 Creative Filtered - Advertiser Exclusions The advertiser is on a publisher or deal block list.
206 Creative Filtered - App Store ID Exclusions The promoted app's store ID is excluded.
207 Creative Filtered - Not Secure The creative loads http resources into an https context.
208 Creative Filtered - Language Exclusions Creative language is excluded for this inventory.
209 Creative Filtered - Category Exclusions The creative's category hits bcat or a deal's category blocks.
210 Creative Filtered - Creative Attribute Exclusions A creative attribute (battr) is blocked, such as auto-play or expandable.
211 Creative Filtered - Ad Type Exclusions The ad type is not accepted on this placement.
212 Creative Filtered - Animation Too Long Animation exceeds the publisher's duration limit.
213 Creative Filtered - Not Allowed in Deal The creative violates the terms of the deal it bid into.
214 Creative Filtered - Invalid SKAdNetwork The SKAdNetwork signature or fields failed validation.
215 Creative Filtered - App Bundle Exclusions The promoted app bundle is excluded.
500+ Exchange-specific Private values; the spec says to communicate them with buyers beforehand.
## 206 and 215 depend on which list the exchange implements
The table above is the current list. OpenRTB 2.5 section 5.25 prints loss reason 206 as Creative Filtered - App Bundle Exclusions, and that list ends at 213. In September 2021 the OpenRTB 3.0 list renamed 206 from Bundle to App Store ID Exclusions and added 215 for App Bundle Exclusions. OpenRTB 2.6 does not print its own loss list. ${AUCTION_LOSS} in 2.6 points at this current table.
An exchange that still implements the 2.5 table reports a blocked bundle as 206 . An exchange on the current list reports a blocked store id as 206 and a blocked bundle as 215 . The same integer in two dashboards can be two different filters. OpenRTB 2.5 also marked exchange-specific values at 1000 and above. The current list marks them at 500 and above.
## Reading the ranges
The list is organized in blocks, and the block tells you who owns the fix:
1-10: your response is broken. These are hygiene failures the exchange found in the bid itself: unparseable response, missing price, missing markup, a dealid that does not exist. Every one of these is fixable unilaterally, and most are visible in the response before it leaves your servers. The bid response anatomy page lists what a well-formed bid carries.
100-104: auction economics. Floors, higher bids, deal priority, seat blocks. A spike in 100 or 101 means your pricing model and the floor signals disagree; a spike in 103 means open-auction bids are losing to deals and the inventory you want has moved behind PMP .
200-215: creative filtering. The bid was fine; the creative was not. Size, format, security, category, attributes, app bundle. These are the codes worth alerting on, because they are systematic: a creative that trips 207 (Not Secure) or 203 (Size Not Allowed) will lose every auction it enters until someone fixes the creative or the targeting.
500 and up: exchange-specific. Meaningless without the exchange's documentation. If a partner sends them, get the mapping in writing. OpenRTB 2.5 started this private range at 1000. The current list starts it at 500. Published maps: Unity Exchange , Equativ , Google Authorized Buyers , Chartboost , Digital Turbine , Verve , and Xandr . Google's creative status codes are a separate list, returned in ${CREATIVE_STATUS_CODE} .
## Debugging with loss codes
Separate the ranges first. A falling win rate from 102 is a pricing problem; the same fall from 200-range codes is an ops problem. Aggregating them into one loss metric hides both.
Treat 3, 7, 8, 9 as build failures. They mean the exchange received something malformed. Validate the exact response you send: the tester accepts bid responses as well as requests, and flags missing required fields and type mismatches against the spec.
Cross-check 4 (Invalid Deal ID) against your deal sync. It usually means a deal was paused or renamed on the exchange side while your bidder kept bidding into it.
Use min-to-win where you can get it. In first-price auctions, ${AUCTION_MIN_TO_WIN} on losses is the cleanest shading signal the protocol offers; it turns 102 from a verdict into a calibration point. See the first-price vs second-price guide for how shading fits in.
## FAQ
## Is the loss notice (lurl) guaranteed to fire?
No. lurl is optional on both sides: a bidder may omit it, and an exchange is not obligated to call it or to support every loss reason. Support and semantics are an integration-level agreement. If loss telemetry matters to your bidding, confirm with each exchange which codes it actually sends.
## What is the difference between loss reason codes and no-bid reason codes (nbr)?
Direction. nbr flows from bidder to exchange and explains why the bidder declined to bid at all. Loss reason codes flow from exchange to bidder and explain why a bid that was made did not win. Both lists live in the OpenRTB 3.0 document, but they are different lists with overlapping numbers, so label them clearly in logs.
## Is loss reason 102 related to VAST error 102?
No, coincidence. OpenRTB loss reason 102 means Lost to Higher Bid. VAST error 102 means the player does not support the VAST version of the ad response. They live in different specs at different layers of the stack.
## What is AUCTION_MIN_TO_WIN?
A substitution macro that expands to the minimum price the bid would have needed to win (or, on a win, to keep winning). Exchanges that support it, notably Google's exchange, expose it in loss and billing notices so bidders can calibrate bid shading in first-price auctions without guessing.
## Why do some partners call 206 a bundle exclusion?
OpenRTB 2.5 section 5.25 defines 206 as Creative Filtered - App Bundle Exclusions, and that printed list ends at 213. In September 2021 the current list renamed 206 to App Store ID Exclusions and added 215 for app bundle exclusions. OpenRTB 2.6 points ${AUCTION_LOSS} at the current list. Ask the exchange which list it implements before you alert on 206.
## Validate the bid before the exchange grades it
Codes 1 through 10 are the exchange telling you your response failed validation. RTBlint runs the same class of checks locally: paste a bid response into the tester or run rtblint validate response.json via the CLI to catch missing prices, absent markup, and malformed fields before an exchange turns them into loss codes.
---
# OpenRTB 2.5 vs 2.6: what changed · RTBlint
URL: https://rtblint.org/guides/openrtb-2-5-vs-2-6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB 2.5 vs 2.6: what changed
OpenRTB 2.6 (April 2022) added ad pod bidding for CTV, promoted regs.gdpr , user.consent , source.schain , and user.eids from extensions to first-class fields, moved every enumerated list into AdCOM 1.0, and switched to dated updates instead of new minor versions. GPP and plcmt arrived through those updates. The full comparison is below.
## Side by side
Area OpenRTB 2.5 OpenRTB 2.6
CTV ad pods No pod concept; one imp per slot with no grouping podid, podseq, slotinpod, maxseq, poddur, mincpmpersec, rqddurs on Video and Audio
GDPR flag regs.ext.gdpr (extension) regs.gdpr (first-class)
TCF consent string user.ext.consent (extension) user.consent (first-class)
Supply chain source.ext.schain (extension) source.schain with documented SupplyChain and SupplyChainNode objects
Extended IDs user.ext.eids (extension) user.eids with documented EID and UID objects
Enumerated lists Section 5 of the 2.5 spec itself Removed from the spec; all references point to AdCOM 1.0 lists
User-Agent device.ua string only device.sua structured UserAgent object plus BrandVersion
Keywords Comma-separated keywords string kwarray string arrays on Site, App, Content, and User
Category taxonomy IAB Content Category 1.0 assumed cattax declares the taxonomy on BidRequest, Site, App, Publisher, Content, Producer, Bid
Rewarded and SSAI Exchange-specific extensions imp.rwdd and imp.ssai
Versioning New minor version per change batch Dated updates (2.6-202211 onward); version only increments on breaking changes
## Pod bidding: the headline feature
2.5 had no way to describe a CTV ad break. 2.6 added a set of fields to the Video and Audio objects that group impressions into pods: podid ties impressions in the same break together, podseq gives the pod's position in the stream, and slotinpod signals whether the seller can guarantee a slot position (first, last) inside the pod. Dynamic pods, where the seller sells a block of time rather than fixed slots, use poddur (total fillable seconds), maxseq (max ads in the pod), mincpmpersec (a per-second price floor), and rqddurs (exact permitted durations). The 2.6-202309 update added durfloors , an array of DurFloors objects expressing floor price by duration range. Details and request shapes are on the CTV and pod bidding page.
## Privacy and identity fields got real homes
In 2.5, GDPR signals lived in extensions by IAB advisory: regs.ext.gdpr and user.ext.consent . 2.6 made them first-class as regs.gdpr and user.consent . The 2.6-202211 update then added regs.gpp and regs.gpp_sid for the Global Privacy Platform, which supersedes the per-regulation strings for new integrations. The same promotion happened to identity and supply-path data: source.ext.schain became source.schain with documented SupplyChain and SupplyChainNode objects, and user.ext.eids became user.eids . See privacy signals and the supply chain object for field-level detail.
## Enums moved out, and other structural changes
2.6 deleted its own Section 5. Every enumerated list (device types, API frameworks, creative attributes, placement subtypes) is now maintained in AdCOM 1.0, so new values can ship without touching the OpenRTB document. No-bid and loss reason codes live in the OpenRTB 3.0 document. The enums reference maps each field to its list. Beyond that, 2.6 added imp.rwdd (rewarded inventory), imp.ssai (server-side ad insertion status), device.sua (structured user agent), kwarray keyword arrays, cattax taxonomy declarations, BCP 47 language fields ( langb ), and mtype on the bid so buyers declare the markup type they return.
Deprecations came with it. 2.6 deprecated video.sequence , audio.sequence , the hashed device IDs ( didsha1 , didmd5 , dpidsha1 , dpidmd5 , macsha1 , macmd5 ), user.yob , user.gender , and bid.api . It removed fields already deprecated in 2.5: banner.wmax , hmax , wmin , hmin , video.protocol , and content.videoquality .
## 2.6 evolves through dated updates
Since 2.6-202211, the IAB Tech Lab increments the version number only for breaking changes. Everything else lands as a dated update to 2.6, which is why plcmt and GPP are "2.6 fields" that do not appear in the original April 2022 PDF:
Update What it added
2.6-202211 GPP support (regs.gpp, regs.gpp_sid), DOOH and Qty objects, inventorypartnerdomain promoted from ext. Also established the monthly update cadence.
2.6-202303 plcmt on Video, deprecating placement. Refresh and RefSettings objects, AUCTION_IMP_TS macro.
2.6-202309 DurFloors object: durfloors arrays on Video, Audio, and Deal for duration-based floor pricing. acat on BidRequest.
2.6-202402 poddedupe on Video for pod-level creative deduplication.
2.6-202409 EID object gained inserter, matcher, and mm (match method) attributes.
2.6-202501 gtax and genres for content genre taxonomies.
2.6-202505 cids on the Data object; genres type corrected to a string array.
The placement to plcmt change is the one most likely to bite a migrating video integration; it has its own guide because the two enums do not map one to one.
## Migration checklist: 2.5 to 2.6
Move regs.ext.gdpr to regs.gdpr , user.ext.consent to user.consent , source.ext.schain to source.schain , and user.ext.eids to user.eids . Many partners read both paths during transition, but new integrations expect the first-class fields.
Add regs.gpp and regs.gpp_sid if you handle US state privacy laws or want one consent transport going forward.
For video, set plcmt from the new AdCOM list and keep placement only for legacy buyers.
Drop removed fields: banner.wmax/hmax/wmin/hmin , video.protocol , content.videoquality . Stop populating the deprecated hashed device IDs, user.yob , and user.gender .
If you transact CTV, populate the pod fields ( podid , podseq , slotinpod , and the dynamic-pod trio) instead of exchange-specific extensions.
Point your enum validation at AdCOM 1.0 lists rather than the 2.5 Section 5 tables, and declare cattax if you send category IDs from a taxonomy newer than 1.0.
For the wider version story, including 3.0, see OpenRTB versions and the 2.6 vs 3.0 guide .
## FAQ
## Is OpenRTB 2.6 backward compatible with 2.5?
Largely, yes. A valid 2.5 request is structurally close to a valid 2.6 request. The gaps: fields deprecated in 2.5 (banner wmax/hmax/wmin/hmin, video.protocol, content.videoquality) were removed in 2.6, extension fields like regs.ext.gdpr and source.ext.schain have first-class homes, and enum references now point to AdCOM 1.0.
## Will there be an OpenRTB 2.7?
Only if the IAB Tech Lab ships a breaking change. Since 2.6-202211, the version number is frozen and non-breaking additions land as dated updates (2.6-202303, 2.6-202309, and so on). New fields and enum values arrive without a version bump.
## Where did the enumerated lists in Section 5 go?
OpenRTB 2.6 removed its own enum section. Device types, API frameworks, video placement subtypes, and the rest now live in AdCOM 1.0, and the 2.6 spec links to those lists. No-bid and loss reason codes are the exception: they live in the OpenRTB 3.0 document.
## Validate the migration
The fastest way to find 2.5 leftovers is to run a real request through the bid request tester : RTBlint validates against OpenRTB 2.6 and flags fields at moved paths ( openrtb.field.moved ), deprecated fields ( openrtb.field.deprecated ), and anything the spec does not define ( openrtb.field.undefined ). The same checks run in CI with the CLI : rtblint validate request.json .
---
# OpenRTB 2.6 vs 3.0 · RTBlint
URL: https://rtblint.org/guides/openrtb-2-6-vs-3-0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB 2.6 vs 3.0
OpenRTB 3.0 is not the version after 2.6. It is a ground-up redesign from 2018: a thin transaction envelope ( Openrtb.request with item and context ) that delegates all domain objects to AdCOM 1.0 and builds in ads.cert request signing. It is not backward compatible with 2.x, adoption never took off, and the IAB Tech Lab keeps shipping dated updates to 2.6 instead. In practice, 2.6 is the protocol; 3.0 supplies its enum lists and reason codes.
## A different architecture, not a sequel
OpenRTB 2.x is one monolithic spec: the BidRequest object defines the auction fields and the domain fields (site, app, device, user, video) in a single document. 3.0 splits that into layers. Layer 1 is transport (HTTPS), layer 2 is format (JSON), layer 3 is the transaction, which is all the OpenRTB 3.0 document defines, and layer 4 is the domain model, delegated to AdCOM 1.0 by default. The envelope names its domain layer explicitly: domainspec (default "adcom" ) and domainver .
A minimal 3.0 request makes the layering visible:
{
"openrtb": {
"ver": "3.0",
"domainspec": "adcom",
"domainver": "1.0",
"request": {
"id": "0123456789ABCDEF",
"tmax": 150,
"item": [
{ "id": "1", "flr": 2.5, "flrcur": "USD", "spec": { "placement": { /* AdCOM */ } } }
],
"context": { "site": { /* AdCOM */ }, "device": { /* AdCOM */ }, "user": { /* AdCOM */ } }
}
}
}
The transaction layer only knows it is selling item entries under some context . What an item is (a video placement, a banner slot, a DOOH screen) is entirely AdCOM's business, described in item.spec . In 2.6, by contrast, the imp object and its video or banner children are defined inline; see the bid request anatomy for that shape.
## Concept mapping: 2.6 to 3.0
OpenRTB 2.6 OpenRTB 3.0 Note
BidRequest (top-level object) Openrtb envelope with a request attribute (Request object) The envelope carries ver, domainspec (default "adcom"), and domainver
imp array request.item array (Item objects) An item is anything offered for sale, not only an ad impression
imp.banner / imp.video / imp.audio / imp.native item.spec holding an AdCOM Placement object Media-type detail moves entirely into the domain layer
imp.bidfloor / imp.bidfloorcur item.flr / item.flrcur Same semantics, renamed
site / app on the BidRequest request.context.site / context.app (AdCOM), plus context.dooh One distribution channel per request
device, user, regs request.context.device / user / regs (AdCOM) Same concepts, defined by AdCOM instead of OpenRTB
bcat, badv, battr spread across the request context.restrictions (AdCOM Restrictions object) Blocking rules consolidated in one place
source (tid, pchain, schain) request.source, extended with ads.cert fields: ts, ds, dsmap, cert, digest Cryptographic request signing is built in
BidResponse with seatbid.bid Openrtb envelope with response, then seatbid.bid bid.item references the item id it answers
bid.adm markup string bid.media holding an AdCOM Ad object The creative is a structured object, not opaque markup
Auction mechanics carry over with familiar names: id , tmax , at , cur , and seat all live on the Request object.
## Built-in security: ads.cert
3.0 was designed alongside ads.cert Signed Bid Requests. The Source object carries a digital signature ( ds ), the fields it covers ( dsmap ), the signer's certificate reference ( cert ), and optionally the full digest for debugging, so a buyer can verify the request originated from the claimed publisher and was not modified along the path. 2.x has no equivalent mechanism in the protocol; it addresses supply-path trust with ads.txt, sellers.json, and the SupplyChain object instead.
## Why adoption stayed on 2.x
A protocol change with no backward compatibility needs every exchange, DSP, and SSP to run dual stacks during a long transition, and the payoff in 2018 was mostly architectural cleanliness plus ads.cert, which itself needed ecosystem-wide key infrastructure. Meanwhile the things buyers and sellers actually wanted (CTV pod bidding, GPP, structured user agents, DOOH) shipped in 2.6 and its dated updates. The IAB Tech Lab formalized that reality: since the 2.6-202211 update, the 2.x line receives monthly-cadence updates and the version number only changes on breaking changes. See OpenRTB versions for the full timeline and 2.5 vs 2.6 for what the current line added.
3.0 still matters in three ways. First, AdCOM: since 2.6, every enumerated list your 2.x integration validates against (device types, placement subtypes, creative attributes) is maintained in AdCOM 1.0, the domain half of the 3.0 design; the enums reference maps them. Second, no-bid and loss reason codes used by 2.6 are maintained in the OpenRTB 3.0 document. Third, a few greenfield or specialized integrations do speak native 3.0, so you may still meet an Openrtb envelope in the wild.
## FAQ
## Is OpenRTB 3.0 newer than 2.6?
As a document, 3.0 was published in 2018 and predates 2.6 (2022). It is a parallel redesign, not the next release. The IAB Tech Lab keeps evolving 2.6 through dated updates, so 2.6 is where new capabilities like GPP, DOOH, and duration floors actually land.
## Is OpenRTB 3.0 backward compatible with 2.x?
No. The object model is different from the root down: an Openrtb envelope instead of a bare BidRequest, item instead of imp, and AdCOM objects for all domain data. A 2.6 request cannot be reinterpreted as a 3.0 request; supporting both means running two parsers.
## Does OpenRTB 2.6 use AdCOM?
For enumerated lists, yes. Since 2.6, device types, placement subtypes, API frameworks, and the other enums are maintained in AdCOM 1.0 and the 2.6 spec links to them. The 2.6 object model itself (BidRequest, imp, site, app) remains defined in the OpenRTB 2.6 document.
## Validate what you actually send
RTBlint validates OpenRTB 2.6 bid requests today, in the browser and in CI. Paste a request into the bid request tester to catch undefined fields ( openrtb.field.undefined ), moved paths, and type mismatches against the current 2.6 snapshot. OpenRTB 3.0 validates too: pick 3.0 in the tester and the whole openrtb envelope is checked, down through request.item and response.seatbid . Send a 2.x payload to the 3.0 validator and it tells you which objects moved where. The AdCOM layer under item.spec , bid.media , and request.context is checked against the AdCOM 1.0 catalog.
---
# OpenRTB validation in CI · RTBlint
URL: https://rtblint.org/guides/openrtb-validation-in-ci/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB validation in CI
Install the CLI with the GitHub Action or cargo install rtblint , run rtblint validate over your bid request fixtures, and fail the build on a nonzero exit code. That is the whole idea. The rest of this guide covers exit codes, JSON output, a GitHub Actions example, and why you should pin a spec snapshot.
## Why validate fixtures in CI at all
Most bidder and SSP codebases carry a directory of bid request fixtures: golden files for integration tests, sample payloads for partners, request builders exercised in unit tests. Those files rot. Someone hand-edits one and typos a field name. A partner upgrades from 2.5 to a 2.6 snapshot and suddenly regs.ext.gdpr should be regs.gdpr and imp.video.placement should be plcmt . The 2.6 line itself moves: the tracked snapshots run from 2.6-202210 to 2.6-202606, and fields like regs.gpp (added in 2.6-202211) appear along the way.
The failure mode is silent. A request that drifted from the spec usually does not throw anywhere; the strictest partner just stops bidding on it, and you find out weeks later as a revenue dip. See OpenRTB no-bid reasons for how little signal comes back. A validation step in CI turns that silent drift into a red build at the pull request that introduced it.
## Exit codes and JSON output
rtblint validate exits 0 when the request is valid (warnings are allowed), 1 when it has spec errors, and 2 on usage or I/O problems. That is enough for a plain shell gate. When you want to inspect or filter findings, --format json emits a machine-readable report:
{
"version": "2.6-202606",
"valid": false,
"issues": [
{
"id": "openrtb.field.moved",
"severity": "error",
"message": "regs.ext.gdpr moved in OpenRTB 2.6-202606; use regs.gdpr.",
"path": "regs.ext.gdpr"
}
]
}
Each issue carries a stable rule id , a severity , a message , and the JSON path . The diagnostic reference documents the IDs.
## GitHub Actions example
name: Validate OpenRTB fixtures
on: [push, pull_request]
permissions:
contents: read
jobs:
validate-fixtures:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate bid request fixtures
uses: aleksUIX/rtblint@v0.13.4
with:
path: fixtures/bid-request.json
version: v0.13.4
spec-version: 2.6-202606
This example pins the action and CLI release to v0.13.4. Save the workflow as .github/workflows/validate-openrtb.yml. spec-version is the OpenRTB snapshot; leave it off to use the latest tracked 2.6. For multiple fixtures, use a workflow matrix with one path per entry. The same CLI contract works in GitLab CI, Buildkite, or a Makefile: exit 0 valid, 1 spec errors, 2 usage or I/O. cargo install rtblint is still available when you are not on GitHub Actions.
## Validating piped payloads
--stdin reads the request from the pipe instead of a file, which is handy when fixtures are generated, templated, or extracted from logs on the fly:
# validate a generated request without touching disk
./gen-request --seat 42 | rtblint validate --stdin --format json
# spot-check a request pulled from a log line
jq -c '.request' sampled.log | head -1 | rtblint validate --stdin
## Pin a spec snapshot
Without --version , RTBlint validates against the latest tracked 2.6 snapshot, which changes when a new spec release lands. In CI that means an RTBlint upgrade can move the goalposts mid-week. Pin the snapshot instead:
rtblint validate request.json --version 2.6-202606
Now a spec upgrade is a deliberate one-line diff that reviewers can see, run, and discuss, exactly like bumping a dependency. When you do bump it, the new findings (a freshly deprecated field, a moved path) arrive in one reviewable batch.
## Gating on rule IDs
Exit-code gating treats every error the same. With JSON output you can be more selective. This policy temporarily allows only openrtb.field.moved among errors. Save the following as scripts/check-openrtb.sh . It requires the RTBlint CLI and jq on PATH:
#!/usr/bin/env bash
set -euo pipefail
fixture="${1:?Usage: bash scripts/check-openrtb.sh path/to/request.json}"
report="$(mktemp)"
trap 'rm -f "$report"' EXIT
# Exit 1 is a validation verdict. Let the rule policy below decide.
status=0
rtblint validate "$fixture" --version 2.6-202606 --format json >"$report" || status=$?
case "$status" in
0|1) ;;
*) echo "RTBlint failed before policy evaluation (exit $status)." >&2; exit "$status" ;;
esac
# Temporarily allow moved fields. Reject other errors and malformed reports.
jq -e '
type == "object"
and (.valid | type == "boolean")
and (.issues | type == "array")
and all(.issues[];
(.id | type == "string")
and (.severity == "error" or .severity == "warning" or .severity == "info"))
and (.valid or any(.issues[]; .severity == "error"))
and ([.issues[] | select(.severity == "error"
and .id != "openrtb.field.moved")] | length == 0)
' "$report"
Run it with a fixture path:
bash scripts/check-openrtb.sh fixtures/bid-request.json
The CLI can exit 1 for an allowed moved-field error, so the script captures that status before applying the policy. Exit 2 and unexpected failures stop the gate immediately. Missing or malformed reports also fail. Warnings pass this policy.
Rule IDs such as openrtb.payload.invalid_json , openrtb.field.undefined , openrtb.field.deprecated , and openrtb.field.moved are stable, so allowlists survive upgrades. Keep the allowlist short and dated; it is a migration tool, not a mute button.
## FAQ
## Does RTBlint need network access in CI?
Validation itself is offline. The GitHub Action downloads a CLI tarball once from GitHub Releases. cargo install also needs network, and you can cache either.
## How fast is it? Will it slow the pipeline down?
The validator is Rust operating on parsed JSON, and a single bid request validates in well under a millisecond of CPU time. Even a fixtures directory with thousands of requests finishes in seconds. The Action download is a small tarball; cargo install dominates until you cache it.
## Validate it
Try a fixture in the bid request tester first to see what the findings look like, then wire the same checks into CI with the CLI . If you are new to the request format itself, start with the bid request reference and the guide on validating a bid request .
---
# OpenRTB bid request best practices · RTBlint
URL: https://rtblint.org/guides/openrtb-bid-request-best-practices/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB bid request best practices
Most of what makes a bid request good is not in the field list; it is in the transport around it and the discipline behind it. This is the practices side of common mistakes : how to send a clean, cheap, verifiable OpenRTB 2.6 request, with the reason and the spec section behind each rule. Written for the exchange or SSP building the request, though bidders reading one will recognize what good looks like.
## 1. Get the transport right before the JSON
The single highest-leverage change is not a field. The spec calls it out in Section 2.1 as its one bolded best practice: use HTTP persistent connections, also known as Keep-Alive. Bid requests are POSTed at high frequency to a stable set of bidders, so reusing connections "has a profound impact on overall performance by reducing connection management overhead as well as CPU utilization on both sides of the interface." Opening a fresh TCP and TLS handshake per auction, at real QPS, is the most expensive mistake you can make and it never shows up in a validator.
Alongside it, two more transport rules from Sections 2.1 and 2.2:
POST, and honest status codes. Bid requests must be HTTP POST. Return 200 for a response with content, 204 for no content (one valid way to signal a no-bid), and 400 for a malformed payload. Mapping a parse failure to 200 hides bugs on both sides.
HTTPS only. HTTPS is not technically required by the protocol, but the spec is blunt: it is strongly recommended that exchanges and bidders use only HTTPS. There is no reason to run a bid stream in the clear in 2026.
## 2. Compress in both directions
Section 2.4 is explicit that compression should be enabled on the bid request as well as the response, and that "even binary data formats can benefit from being compressed." The response side is easy: the exchange sends Accept-Encoding: gzip and a correctly configured bidder replies with Content-Encoding: gzip . The request side is the one teams forget, because it has to be agreed in advance: the exchange sets Content-Encoding: gzip on the request itself, and the bidder has to know to expect it.
# response compression (standard, always worth enabling)
accept-encoding: gzip # exchange -> bidder, on the request
content-encoding: gzip # bidder -> exchange, on the response
# request compression (must be pre-agreed with the bidder)
content-encoding: gzip # exchange -> bidder, on the request body
On real bid streams the request body is where the bytes are, so request-side gzip is often the larger saving. It also pairs with the payload discipline in rule 8: a smaller, well-scoped request compresses better than a bloated one.
## 3. Always send the version header
Section 2.5 asks exchanges to send the protocol version in an HTTP header so a bidder can branch before it parses:
x-openrtb-version: 2.6
It costs nothing and it saves a bidder from guessing. Note that the header carries only major.minor ( 2.6 ), not the dated snapshot . Since 2.6-202211 the version number only moves on breaking changes, so 2.6 covers every snapshot from 202211 through 202606. Which snapshot you actually emit is a matter for your partner docs and your validation config, not the wire.
## 4. Treat new fields as additive and never reject unknowns
The 2.6 versioning model (Section 2.6) says an exchange should start transmitting a new field as soon as it implements support, and a bidder consumes it at its discretion. Nobody negotiates an "upgrade." The practical consequence sits on the reading side: your parser must tolerate attributes it does not recognize. A JSON schema set to additionalProperties: false will reject a request the moment a new snapshot adds a field, or worse, drop it silently. That is exactly how a bidder stops seeing content.data[].cids or the new content.realtime without a single error in the log. Validate against the spec, not against a frozen schema that treats the future as invalid.
## 5. Make the required core correct and complete
A bid request requires exactly two things at the top level: id and imp , an array with at least one impression. Each Imp needs its own id , unique within the request, and exactly one media type object among banner , video , audio , or native to say what is for sale. Two small type traps that drop bids without erroring:
at (auction type) is an integer, not a string. "1" is wrong; 1 is right.
Send site or app or dooh , never more than one. A request with both site and app is contradictory and some buyers reject it outright.
The full object-by-object list, and which fields are required versus recommended, is in the bid request reference .
## 6. Put privacy signals in their first-class 2.6 paths
Every regulatory signal moved out of ext and got a real home in 2.6. Sending the old extension paths is the most common way to have consent silently ignored by a buyer that reads only the current ones:
regs.gdpr and user.consent , not regs.ext.gdpr / user.ext.consent .
regs.gpp with regs.gpp_sid . Send the GPP string and its section IDs together; one without the other is not actionable.
regs.us_privacy and regs.coppa where they apply.
Exact paths, versions, and the DSA fields are in the privacy signals reference . Getting these wrong is not a dropped bid, it is a compliance exposure.
## 7. Carry a complete, well-formed supply chain
Buyers increasingly gate spend on a clean source.schain . In 2.6 the object lives at source.schain , not the old source.ext.schain . Two things buyers actually check:
complete: 1 means every hop from publisher to exchange is represented. Set it truthfully; a complete: 1 chain with a gap is worse than an honest complete: 0 .
Each node needs a real asi and sid , no empty identifiers and no duplicate adjacent nodes.
The schain does not stand alone. It should reconcile with your ads.txt / app-ads.txt and your sellers.json , and those four together are what a careful buyer verifies. Node-by-node detail is in the supply chain reference .
## 8. Price and time the auction honestly
Always pair the floor with its currency. Send imp.bidfloor and imp.bidfloorcur together. If you omit bidfloorcur it defaults to USD , which silently turns a floor expressed in another currency into the wrong number. See the bid floors reference .
Set a realistic tmax . It is the time the exchange will wait for a response. Too low and honest bidders time out and look like no-bids; a non-positive or absurd value is just a bug. The tmax reference covers whether it includes network time and typical values.
## 9. Send less, but not too little
Bid request size is a direct cost: bandwidth on every auction, parse time on every bidder, and QPS multiplied across a fanned-out stream. The discipline is to send what a buyer can act on and trim what it cannot:
Drop deprecated and removed fields rather than dual-sending them forever. The enum reference notes where AdCOM lists took over.
Do not pad arrays "just in case." An empty imp.pmp.deals or a data array full of blank segments is bytes with no signal.
But do not strip signals a buyer prices on. The goal is a lean request, not a starved one: identity, privacy, and supply chain earn their bytes.
Remember the spec convention from Section 2.3: the absence of an attribute has a formal meaning, usually "unknown." Omitting a field is a statement, so omit deliberately.
## 10. Validate continuously, not once
Almost none of the above throws an error at runtime. A stale placement enum, a floor in the wrong currency, a consent string in ext : they all parse fine and just cost bids from whichever partner enforces the rule. The only way to catch them is to check requests against the spec on an ongoing basis.
Spot-check a request in the browser tester , entirely client-side.
Gate builds and sample live traffic with the CLI : rtblint validate request.json , with --format json for machine-readable output.
Wire it into CI so a fixture that drifts from the spec fails a build, not a campaign. See OpenRTB validation in CI .
## Sources
OpenRTB 2.6 specification: Section 2.1 (Transport), 2.2 (Security), 2.3 (Data Format), 2.4 (Data Encoding), 2.5 (Version Header), 2.6 (Versioning Behavior)
OpenRTB implementation guide (best practices and examples)
---
# Agentic buying and OpenRTB: how AI ad agents meet the bid stream · RTBlint
URL: https://rtblint.org/guides/agentic-buying-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## Agentic buying and OpenRTB: how AI ad agents meet the bid stream
"Agentic advertising" is the year's loudest phrase, and most explainers stop at the announcements. This one answers the question a bid-stream engineer actually has: when an AI agent buys media, what reaches the bidder, and how do you check it? The short version is that agents mostly negotiate above OpenRTB, and what they agree on still executes as an ordinary bid request. For a point-in-time take on the standards politics, see the news analysis ; this is the durable how-it-fits.
## What "agentic buying" actually means
In the traditional flow, a human sets up a campaign in a DSP UI and the DSP bids into exchanges over OpenRTB. In the agentic flow, software agents do the negotiating: a buyer's agent describes an objective in natural language and structured constraints, a seller's agent offers inventory and terms, and the two settle a deal by talking to each other over an agent protocol. The transport underneath is usually Anthropic's Model Context Protocol (MCP) or Agent2Agent (A2A). The important part for OpenRTB: this conversation happens at planning and negotiation time, not inside the microsecond auction.
## Two stacks, two theories of where agents belong
There are two competing efforts, and they disagree about where an agent sits relative to the auction.
Ad Context Protocol (AdCP) , launched October 2025 and governed by AgenticAdvertising.org (AAO). Built on MCP with A2A as a second transport, it defines tasks for media buying, creative, signals, and audience activation. It is split into a negotiation layer (agents discovering inventory and agreeing terms at planning time) and a serve-time layer called Trusted Match. The reference sell-side implementation lives at Prebid.org as the Prebid Sales Agent.
Agentic Advertising Management Protocols (AAMP) from IAB Tech Lab, v1.0 in January 2026. Its stated approach is to extend OpenRTB, AdCOM, VAST, and GPP rather than introduce new standards. Under its umbrella, the Agentic RTB Framework (ARTF) takes the opposite bet from AdCP: it puts agent services inside the auction path, co-located with an exchange or DSP, enriching and modifying bid requests mid-flight over gRPC.
So one camp keeps agents above the bid stream and lets the deal execute through existing pipes; the other wants agents rewriting the request as it flows. That distinction is the whole story for anyone who validates OpenRTB.
## Where each one touches the bid request
Above the stream (AdCP). An AdCP media buy is negotiated between agents, and what comes out the other end executes through the pipes that already exist: a deal ID in imp.pmp.deals , a programmatic guaranteed line, or a direct tag. If your job is parsing OpenRTB, agentic demand arrives looking like any other deal. Nothing new appears in the JSON; the novelty is upstream, in how the deal was struck.
Inside the auction (ARTF). Here the request that reaches a bidder may have been enriched or rewritten by a third-party container between the publisher and the auction. The fields still have to be valid OpenRTB, but their provenance becomes a live question: which agent touched imp , device , or the supply chain, and how is that audited. Validation stops being a one-time gate at the edge and becomes something you want after each stage that can mutate the request.
Either way, the invariant holds: whatever the agents agree, the transaction still has to come out as a valid bid request on the wire. Agents changed who decides; they did not replace the protocol the decision executes on.
## The trust stack agents are adding to
Agentic buying introduces one genuinely new artifact worth tracking now: adagents.json , served at /.well-known/adagents.json . It is a publisher's declaration of which sales agents may represent its inventory, with scoped authorization (placement IDs, country restrictions, date windows, signing keys) that goes well beyond what ads.txt can express. It does not replace anything; it joins the stack a careful buyer already reconciles:
ads.txt / app-ads.txt which sellers may sell this inventory
sellers.json who each seller ID actually is
source.schain the hop-by-hop path of this specific request
adagents.json which agents may represent this inventory (new)
The first three are pure OpenRTB-adjacent supply-chain checks RTBlint already covers through schain validation . adagents.json is the agentic addition, and buyers will eventually want to verify all four line up.
## Why validation matters more, not less
When a human built a campaign, a mistake in the request was a human error you could trace to a config screen. When an agent assembles or rewrites the request, the output is generated, and generated OpenRTB drifts in the same ways any generated JSON does: a plausible-looking field in the wrong path, a consent string left in ext , an enum value that used to be valid. None of it throws; it just costs bids or breaks compliance. An agent that can construct a bid request should be able to check it against the spec before it ships one, the same way a developer runs a linter.
RTBlint is built for exactly that. The validator runs client-side in the tester and as a CLI for pipelines, and it also runs as an MCP server at rtblint.org/mcp . Because it speaks MCP, the same protocol AdCP and many agent frameworks are built on, an AI buying or selling agent can call it as a tool and validate its own OpenRTB output inline. The server exposes three tools:
validate_bid_request : pass a bid request payload (and an optional OpenRTB version) and get back the issues, with rule IDs and JSON paths.
validate_bid_response : the same for a bid response.
list_openrtb_versions : the versions the validator supports, so an agent can pin the snapshot it validates against.
An agent negotiating an AdCP deal can confirm the resulting bid request is valid before it enters the auction; an ARTF-style host can revalidate after a container rewrites a request. Same spec, same rule IDs, whether a human or an agent is holding the JSON.
## What to do now
Treat agentic demand as deals. If you parse OpenRTB, AdCP inventory shows up in imp.pmp.deals and PG lines; no parser change is required today.
Start watching adagents.json if you already reconcile ads.txt and sellers.json . It is where agentic authorization is accumulating.
If any stage in your path can rewrite a request (an ARTF-style agent, an enrichment service), validate after it, not just at the edge.
If you are building an agent, wire OpenRTB validation in as a tool so it checks its own output. Start with the tester to see the issue shape, then the CLI or the MCP endpoint for automation.
Whichever agentic stack wins, the transactions still resolve to OpenRTB on the wire. The protocol is the stable layer under all the agent news, which is exactly why it is worth validating.
## Sources
IAB Tech Lab: Agentic Advertising and AI initiatives (AAMP, currently v2.0)
IAB Tech Lab: Agentic RTB Framework (ARTF)
Ad Context Protocol specification repository
AgenticAdvertising.org: adagents.json
Model Context Protocol (MCP)
---
# IAB Tech Lab's agentic advertising standards, explained: AAMP, ARTF, Agentic Audiences · RTBlint
URL: https://rtblint.org/guides/iab-agentic-advertising-standards/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## IAB Tech Lab's agentic advertising standards, explained: AAMP, ARTF, Agentic Audiences
IAB Tech Lab spent 2025 and 2026 building a stack of agentic advertising standards, and the names blur together fast: AAMP, ARTF, Agentic Audiences. This is the map. What each one is, how they relate, and the single strategic choice underneath all of them, which is to extend OpenRTB, AdCOM, VAST, and GPP rather than start over. For the rival stack, see the AdCP explainer ; for how both touch the bid stream in practice, see agentic buying and OpenRTB .
## The one idea underneath everything
IAB Tech Lab's agentic strategy starts from a position, not a product: the industry already has shared standards, and the fastest path to agents is to extend them. CEO Anthony Katsur has framed it as building "on an existing shared foundation, not introducing multiple new standards that create fragmentation." In practice that means OpenRTB stays the execution layer, AdCOM stays the object model, VAST stays the video envelope, and GPP stays the privacy transport. The agentic pieces sit on top and around those, adding negotiation, trust, and audience layers rather than replacing the bid stream. If you maintain OpenRTB integrations, that is the reassuring part: the protocol you already run is the thing they are building on.
## AAMP: the umbrella
The Agentic Advertising Management Protocols (AAMP) reached v1.0 on January 28, 2026 and v2.0 in June 2026, which is the release that made the buyer and seller agent SDKs transaction-ready and brought programmatic into scope. It is the umbrella program, organized into three pillars:
Foundations. The shared vocabulary and object model agents use to describe inventory, audiences, and outcomes, anchored to AdCOM so an agent and an exchange mean the same thing by the same field.
Protocols. How agents talk: discovery, negotiation, and the handoff from a negotiated agreement to something that executes over existing rails such as deals in an OpenRTB bid request.
Trust. Authorization and provenance, so a buyer can verify that an agent is allowed to represent the inventory it is offering, extending the same supply-chain thinking behind ads.txt, sellers.json, and schain .
AAMP ships with buyer-agent and seller-agent SDKs published on GitHub, so the reference behavior is code, not just prose, plus an Agent Registry in the Tools Portal for discovering who is running what. Early adopters are real: PMG wired its Alli platform to the buyer-agent architecture, and Kochava folded the buyer-agent SDK into an open-source workspace. The point of the three-pillar split is that a team can adopt the foundations and trust work without rewriting how auctions clear.
## ARTF: agents inside the auction path
The Agentic RTB Framework (ARTF) is the most consequential piece for anyone who validates bid streams, because it is the one that touches the request in flight. Where most agentic activity happens at planning time, ARTF specifies a containerized execution model: a host, an exchange or a DSP, runs third-party agent services co-located in its own infrastructure, communicating over gRPC with Protocol Buffers, and those agents can enrich and modify a bid request mid-auction. Proponents claim large latency wins over server-to-server hops, because the agent runs next to the auction instead of across a network.
For OpenRTB, the implication is provenance. Under ARTF, the request that reaches a bidder may have been rewritten by a third-party container between the publisher and the auction. Which fields an agent may touch, and how that is audited, becomes as important as the transport itself. ARTF went through public comment closing January 15, 2026, and a version 2.0 is already underway, so the boundaries are still being drawn. The practical takeaway: if an ARTF-style stage sits in your path, validation stops being a one-time edge check and becomes something you want after each stage that can mutate the request. The mutation vocabulary itself, eight intents against OpenRTB objects, is broken down in ARTF lets agents rewrite the bid request in flight .
## Agentic Audiences: the targeting layer
Agentic Audiences reached v1.0 in November 2025. It is the audience-activation side of the program: a standard way for an agent to describe and request an audience so that targeting can be negotiated and executed without every buyer and seller inventing their own vocabulary. It sits alongside the existing data and segment fields in the bid request rather than replacing them, which keeps it consistent with the same extend-don't-replace philosophy.
## Where OpenRTB sits in all of this
Across the three pieces, OpenRTB is not deprecated anywhere. AAMP anchors its vocabulary to AdCOM, which OpenRTB already uses for every enumerated list. ARTF rewrites bid requests but they remain OpenRTB bid requests on the wire. Agentic Audiences describes audiences that still travel in the request. The through-line is that agents change who decides and how deals are struck, and the decision still executes as a bid request that has to be valid. That is exactly why the roadmap this program came from spent most of its energy on agents while OpenRTB kept shipping ordinary dated snapshots ; the two tracks are complementary, not competing. Our roadmap analysis covers the timeline in detail.
## What to do now
Read the buyer and seller agent SDKs if you are prototyping. They are the fastest way to see what AAMP actually expects on the wire.
If you might host an ARTF-style agent, plan for request provenance: log what each stage changed, and validate the request after any stage that can rewrite it.
Keep your OpenRTB validation current regardless of which agent stack you adopt. The request still has to come out valid, so run it through the tester or the CLI .
## Sources
RTBlint is independent and not affiliated with IAB Tech Lab. Program names and structure below are drawn from IAB Tech Lab's own materials; the analysis is our own.
IAB Tech Lab: Agentic Advertising and AI initiatives (AAMP, currently v2.0)
IAB Tech Lab: Agentic RTB Framework (ARTF)
The Current: IAB Tech Lab releases an agentic advertising framework
---
# ARTF explained: the Agentic RTB Framework and where it sits in the auction · RTBlint
URL: https://rtblint.org/guides/artf-explained/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## ARTF explained: the Agentic RTB Framework and where it sits in the auction
Most agentic advertising happens before the auction: an agent plans a campaign, negotiates a deal, confirms a buy. ARTF is the exception. It defines how agent services run inside the auction path, next to the exchange, with a typed vocabulary for changing a bid request or bid response while the auction is happening. If you operate an exchange or a bidder, this is the agentic specification that touches your hot path.
## Where ARTF sits
The Agentic RTB Framework is the execution pillar of AAMP , IAB Tech Lab's umbrella for agentic advertising standards. AAMP covers the planning and trust layers: buyer and seller agent SDKs, agentic audiences, diligence and privacy gates. ARTF covers the part where an agent has milliseconds rather than minutes.
AdCP is the comparison people reach for, and the two sit at different altitudes. AdCP lets agents discover inventory, negotiate and transact, over MCP with JSON payloads and human-scale latency. ARTF is a co-located mutation API over gRPC with an auction-scale time budget. A stack can run both without either one competing for the same job.
ARTF v1.0 went out for public comment in November 2025. It continues under the Agentic Task Force through subsequent AAMP releases rather than being finished and frozen.
## The execution model: containers, not callouts
The architectural decision that defines ARTF is that agent services run inside the host's own infrastructure. An exchange or a DSP hosts third-party agent containers co-located with its auction, rather than calling an agent over the public internet.
The reason is latency. A server-to-server enrichment hop costs a round trip you cannot afford inside a tmax budget, and the framework claims large reductions in round-trip time from co-location. The tradeoff is operational: you are running someone else's code beside your auction, which is a security and capacity question before it is a protocol question.
Transport is gRPC with Protocol Buffers. That is a deliberate departure from the JSON over HTTP that the rest of the agentic stack uses, and it is the right call for this altitude.
## The data model, which is small
A host sends an RTBRequest carrying:
lifecycle , the stage of the auction this call belongs to.
id , for correlation.
tmax , bounding the mutation round trip including latency. This is the agent's entire budget, and it is separate from the auction's own tmax.
the OpenRTB bid_request or bid_response itself.
originator : publisher, SSP, exchange, or DSP.
applicable_intents , the list of things this agent is permitted to answer with.
The agent returns an RTBResponse containing zero or more Mutation messages plus metadata naming its API version and model version. Zero mutations is a valid answer and should be the common one.
A mutation is four things: an intent , an op (add, remove, or replace), a path , and a typed payload chosen by intent. The payload types import OpenRTB directly. The metrics payload is a list of OpenRTB Metric objects; the content data payload is a list of OpenRTB Data objects. This is not a parallel object model. It is a patch protocol for the bid stream you already run.
## One round trip, concretely
The protobuf reads abstractly until you see what a single exchange looks like. A host sends the payload with a budget and a permission list; the agent answers with a patch or with nothing:
host -> agent RTBRequest
lifecycle BID_REQUEST
id "req-8891"
tmax 12 # ms, includes network
originator EXCHANGE
applicable_intents [ACTIVATE_SEGMENTS, ADD_METRICS]
bid_request { ...OpenRTB 2.6-202505... }
agent -> host RTBResponse
api_version "1.0"
model_version "seg-2026-07"
mutations[0]
intent ACTIVATE_SEGMENTS
op ADD
path "user.data"
payload [ { id: "prov-4", name: "Provider", segment: [...] } ]
Three things in that exchange decide whether the integration is safe. The host granted two intents, so a mutation carrying a third is out of scope and should be rejected rather than applied. The budget is 12 milliseconds including network, so an agent that occasionally takes 40 does not slow the auction, it drops out of it. And the payload is a list of OpenRTB Data objects, which means it can be malformed OpenRTB in every way an ordinary bid request can.
## The eight intents
applicable_intents is the permission model: a host declares what an agent may attempt, and anything else is out of scope for that call. Mapped onto the OpenRTB fields they land on:
Intent Lands on
ACTIVATE_SEGMENTS user.data[] and content.data[] segments
ACTIVATE_DEALS imp.pmp.deals[]
SUPPRESS_DEALS imp.pmp.deals[], removal
ADJUST_DEAL_FLOOR deals[].bidfloor
ADJUST_DEAL_MARGIN commercial layer, no OpenRTB field
BID_SHADE bid.price on the response
ADD_METRICS imp.metric[]
ADD_CIDS content.data[].cids and user.data[].cids
Six of the eight touch the request. BID_SHADE touches the response, which means a price can change after the bidder set it. ADJUST_DEAL_MARGIN is the odd one out: no OpenRTB field carries margin, so its effect is not visible in the payload at all, which makes it the hardest to audit after the fact.
## What ARTF does not specify
The framework says what an agent may change. It does not say that the result is still a valid bid request for the version the exchange runs, and there is no conformance step in the loop.
ADD_CIDS shows the shape of the problem: a legal intent whose legality as OpenRTB depends on which dated 2.6 snapshot the exchange parses, since cids arrived in 2.6-202505. Two related gaps matter before you integrate. path is a free-form string, so it can address something your version does not have. And composition is undefined, so a host running several agents can receive two individually reasonable mutations that contradict each other.
Each of those is worked through with the failure cases in the post on ARTF mutations , and the missing version handshake in the version negotiation post .
## Integrating safely
Validate after every stage that can rewrite the payload. Publisher emit, agent mutation, exchange forward. The mutation is the new boundary and it belongs in the same category as the others.
Keep the pre-mutation payload. Long enough to answer questions about it. When a bidder reports something impossible, the difference between the two documents is the answer.
Pin the snapshot per integration. An agent should validate what its mutation produces against the version its host actually runs, not the newest spec its author read.
Scope applicable_intents narrowly. It is the only permission control the framework gives you. Grant the intents an agent needs, not the set it supports.
Budget the agent tmax honestly. It bounds the round trip including latency, so an agent that occasionally takes longer does not slow the auction, it drops out of it. Decide what a timeout means before it happens.
The mechanical part of all of this is one call: watch the hop in the ARTF simulator , paste a payload into the tester , run the CLI in the same container as the agent, or give the agent the MCP server as a tool so it checks its own output before it answers.
## Validating ARTF with RTBlint
RTBlint reads the ARTF messages directly, in three passes that answer three different questions.
The envelope. Required members, lifecycle against the payloads actually carried, tmax plausibility for a call that runs inside an auction the exchange is already timing out, and the enum values on originator and applicable_intents . The bid request and bid response it carries are validated in full, under bid_request. and bid_response. paths.
The mutation set, against the auction it targets. Whether the response id echoes the extension point request id rather than the bid request id, whether the declared intent is one applicable_intents offered, whether the operation and payload match the intent, and whether each semantic path resolves to an impression, deal, seat, and bid the auction actually carries.
The result, after the mutations are applied. The mutations are written into the payloads and the result revalidated, reporting the OpenRTB findings the mutations introduced and filtering out the ones the payload already had. That is the question an orchestrator has: not what arrived broken, but what this agent would break.
rtblint validate --type artf-request rtb-request.json
rtblint validate --type artf-response --apply --request rtb-request.json rtb-response.json
The same three passes are available as the validate_artf_request and validate_artf_response tools on the MCP server , so an agent can check its own mutation set before returning it, and as ValidateArtfEnvelope and ValidateArtfMutations on the gRPC service, which is where an orchestrator wants them: ARTF mandates gRPC for the extension point, so the connection is already open.
Two things are worth knowing before you read the output. ADJUST_DEAL_MARGIN has no OpenRTB field to write to , so the value is applied out of band and nothing downstream can verify it. And the v1.0 document's worked examples use a different vocabulary from the .proto in the same repository, camelCase intents and a value: {IDsPayload} wrapper against enum names and top-level oneof members. A mutation written from the document is mapped and reported as artf.mutation.legacy_spec_encoding rather than dismissed as an unknown intent.
One more thing catches people wiring an agent for the first time. ARTF carries its OpenRTB payloads as protobuf, and the IAB OpenRTB protobuf schema declares 28 of the specification's integer flag fields as bool . So "secure": true is correct inside an ARTF envelope and wrong in a JSON bid request, and "secure": 1 is the reverse: a protojson parser rejects the whole message. RTBlint validates ARTF payloads in the protobuf JSON dialect automatically, and reports the mismatch as a dialect finding rather than a bare type error, because the payload is usually correct and the assumption about the reader is not.
## Further reading
IAB Tech Lab's agentic advertising standards
Agentic buying and OpenRTB
The AdCP to OpenRTB field mapping
Will agents replace OpenRTB?
IABTechLab/agentic-real-time-framework: specification, protobuf definitions, and Rust reference implementation
---
# The Ad Context Protocol (AdCP), explained · RTBlint
URL: https://rtblint.org/guides/ad-context-protocol-explained/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## The Ad Context Protocol (AdCP), explained
The Ad Context Protocol is the industry's most visible attempt at agent-to-agent media trading, and it is backed by a different coalition than IAB Tech Lab. This is what it actually is: who governs it, how the pieces fit, and where a negotiated AdCP buy ends up touching OpenRTB. For the IAB alternative, see the AAMP explainer .
## Who is behind it
AdCP launched on October 15, 2025 with six founding members: Yahoo, Optable, PubMatic, Scope3, Swivel, and Triton Digital, alongside a longer list of launch partners including Magnite, Raptive, and The Weather Company. It is governed by AgenticAdvertising.org (AAO), a trade organization formed in 2025 specifically to steward the protocol. That governance split matters: AAO owns the specification, and the reference sell-side software moved to Prebid.org in January 2026 as the Prebid Sales Agent, so Prebid maintains the code while AAO keeps the protocol. The spec sits on a 3.0 release line under an Apache 2.0 license.
## How it is built
AdCP is built on Anthropic's Model Context Protocol (MCP), the same protocol many AI agents already speak, with Agent2Agent (A2A) as a second transport. On top of that it defines tasks for the major jobs in a media buy:
Media buying: an agent discovers inventory and negotiates terms with a seller's agent.
Creative: handling and describing the assets to be served.
Signals: the contextual and measurement inputs a buyer reasons over.
Audience activation: turning an audience definition into something a seller can act on.
The protocol splits into two layers, and the distinction is the key to understanding it:
A negotiation layer , where agents discover inventory and agree on terms at planning time. This is where most of AdCP's activity happens, and it is well above the real-time auction.
Trusted Match , a serve-time layer for impression-level decisions, the part that has to line up with what happens inside the auction.
## adagents.json: the trust artifact to watch
The one genuinely new file AdCP introduces to the public web is adagents.json , served at /.well-known/adagents.json . It is a publisher's declaration of which sales agents may represent its inventory, with scoped authorization that goes well beyond ads.txt: placement IDs, country restrictions, date windows, and signing keys. It sits naturally beside ads.txt, sellers.json, and schain , and buyers will eventually reconcile all four to decide whether an agent-sourced deal is legitimate.
## Where AdCP meets OpenRTB
AdCP mostly lives above the bid stream. A media buy is negotiated between agents over MCP or A2A, and what comes out the other end executes through the pipes that already exist: a deal ID in imp.pmp.deals , a programmatic guaranteed line, or a direct tag. If your job is parsing OpenRTB, AdCP demand arrives looking like any other deal. Nothing new appears in the bid request; the novelty is entirely upstream in how the deal was struck. That is the opposite design choice from IAB's ARTF, which puts agents inside the auction path. The practical consequence is covered in agentic buying and OpenRTB : whatever the agents agree, it still has to come out as a valid bid request.
## What to do now
Treat AdCP demand as deals. It shows up in imp.pmp.deals and PG lines, so no parser change is required today.
If you already publish or consume ads.txt and sellers.json, start tracking adagents.json ; it is where agentic authorization is accumulating.
If you are building an AdCP agent, wire OpenRTB validation in as a tool so the deal you negotiate resolves to a valid bid request. Start with the tester , then automate with the CLI .
## Sources
RTBlint is independent and not affiliated with AgenticAdvertising.org or IAB Tech Lab. Membership and structure below are drawn from AAO and partner announcements; the analysis is our own.
Ad Context Protocol specification repository
AgenticAdvertising.org: adagents.json
VideoWeek: Industry coalition launches Ad Context Protocol (October 15, 2025)
Prebid announces the Prebid Sales Agent, in collaboration with AgenticAdvertising.org
---
# From an AdCP media buy to an OpenRTB bid request: the mapping · RTBlint
URL: https://rtblint.org/guides/adcp-to-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## From an AdCP media buy to an OpenRTB bid request: the mapping
Every agentic buying stack ends at the same place. An agent discovers inventory, negotiates terms, and creates a media buy, and then something has to serve an impression, which means something has to emit a bid request. AdCP is explicit about this: several of its own fields are defined by reference to OpenRTB 2.6, and its real-time execution layer speaks in OpenRTB-shaped requests. This guide is the handoff, field by field, and the places where a clean negotiation still produces a payload a bidder will drop. For the standards landscape, see the AdCP explainer and IAB Tech Lab's agentic stack .
## The layer split, stated precisely
AdCP is a task protocol between agents, organised into protocol families: media-buy, creative, signals, governance, brand, sponsored-intelligence, and an experimental measurement family in 3.1. A buyer agent calls tasks such as get_products , create_media_buy , and sync_creatives on a seller agent, over MCP or A2A. None of those messages are a bid request, and none of them clear an auction.
OpenRTB is the wire protocol for the auction itself. When an AdCP media buy transacts against programmatic inventory, the agreement it produced has to be expressed as something an exchange and a bidder already understand: a deal id in imp.pmp.deals , a placement signalled in imp.video or imp.audio , a supply path in source.schain . The agents agree on terms. The bid stream carries them.
That split is why validation moves rather than disappears. Nothing in an AdCP task response tells you whether the bid request that eventually results is well formed against the OpenRTB version the exchange is running.
## Placement types: AdCP names, OpenRTB integers
The cleanest example of the handoff is video placement. AdCP's video_placement_types , used both as a get_products filter and as a declaration on a placement, is defined in the specification as using OpenRTB 2.6 video.plcmt semantics with AdCP-native names. The mapping is one to one:
AdCP name OpenRTB video.plcmt Meaning
instream 1 Instream: sound on by default, video is the primary content
accompanying_content 2 Player beside editorial content, plays on entering the viewport
interstitial 3 No video content; takes over the viewport
standalone 4 No content or standalone: feeds, slideshows, sticky and floating players
Two failure modes follow directly. First, a product negotiated as instream that executes as a request carrying only the deprecated video.placement has lost the signal the buyer selected on, because placement and plcmt do not share an enum. Second, an aggregate placement may legitimately declare several types, but the bid request describes one impression, so exactly one plcmt value has to be chosen at emit time. The enum tables and the migration are in placement versus plcmt .
## Audio: the same pattern, a longer list
AdCP's audio_distribution_types is defined against OpenRTB 2.6 audio.feed , the AdCOM Feed Types list, again with readable names: music_streaming_service , fm_am_broadcast , podcast , catch_up_radio , web_radio , video_game , and text_to_speech . A buyer that filtered products to podcast is entitled to a request whose imp.audio.feed says podcast. If the emitted request omits feed entirely, which is common in audio integrations built before 2.6, the negotiated constraint exists only in the paperwork. See how audio ads work in OpenRTB .
## The media buy becomes a deal
AdCP models inventory as products, packages, and placements, with per-placement format support and pricing. Programmatic execution of that agreement lands in the fields OpenRTB already has for private supply:
What was agreed Where it executes What can go wrong
The agreement itself imp.pmp.deals[].id A bid naming a deal that was never offered in the request is dropped (loss reason 4); RTBlint reports openrtb.bid.dealid_unknown on the pair
Negotiated price deals[].bidfloor , bidfloorcur , at Deal-backed bids clear the deal floor, not the impression floor; a mismatch produces loss reason 101
Guaranteed versus auction deals[].guar , pmp.private_auction , at 3 A guaranteed buy executed as an open-auction impression is a different commercial product than the one that was agreed
Who may buy it deals[].wseat , request wseat / bseat Seat restrictions that do not match the buyer agent's seat filter the bid (loss reason 104); openrtb.seatbid.seat_not_allowed
Creative constraints imp.video / imp.audio / imp.banner duration, mimes, protocols, sizes A format accepted at sync_creatives time that violates the emitted impression's constraints is filtered at auction (loss reasons 203, 204)
Duration-priced video and audio durfloors , mincpmpersec Pod fields declared without pod context are a builder bug RTBlint flags directly
Deal semantics field by field are in OpenRTB deals and PMP . The sell-side packaging question that sits next to this one is curation : a curated deal and an agent-negotiated deal are structurally identical in the payload, which is exactly why the payload has to be checked rather than trusted.
## Trust: adagents.json meets the supply chain
AdCP's authorization primitive is adagents.json , published by a publisher to declare which sales agents may sell which properties, with attested signing keys per agent, and paired on the brand side with brand.json . It answers a question ads.txt never did: is this agent allowed to represent this inventory?
It does not answer the question the bid stream asks, which is whether the chain of intermediaries that actually handled this impression is complete and authorised. That is still source.schain reconciled against ads.txt and sellers.json. The two layers are complements: agent authorization at negotiation time, seller authorization at execution time. A stack that verifies the first and skips the second has an auditable agreement attached to an unauditable impression. See the supply chain trust stack and supply path optimization .
## AXE: where AdCP touches an actual request
AdCP's Agentic eXecution Engine is the part that runs at impression time rather than planning time. The documented flow has the ad server or a Prebid real-time data module send an OpenRTB-style request to an AXE endpoint, which returns segment decisions the ad server turns into targeting: axei to include a segment, axex to exclude for suitability, and axem to carry creative macro data.
Two practical notes for anyone wiring this. The request going to AXE is OpenRTB-shaped, so it is validatable with the same tooling as the auction request, and it is worth validating, because a malformed context object degrades segment lookup silently rather than loudly. And axem data ends up substituted into creative URLs, which puts it in the same class of problem as OpenRTB substitution macros : AdCP's own macro specification carries a normative percent-encoding contract and published test vectors precisely because unencoded values break URLs and open injection paths.
## Where the mapping silently breaks
Version drift. An agent stack built against 2.6 language emitting into an exchange pinned to an older snapshot produces fields that do not exist yet in that version. RTBlint reports openrtb.field.not_yet_available for exactly this, and it is invisible in any AdCP-level test.
Names that look mapped but are not. video_placement_types maps to plcmt , not to the deprecated placement . Sending the old field with the new intent loses the constraint.
Constraint loss. Everything narrowed during negotiation (format, duration, seat, geo, suitability) has to be re-expressed in the impression. Anything not expressed is not enforced, no matter how precisely it was agreed.
Privacy signals dropped at the handoff. A media buy carries no consent string. regs.gdpr , user.consent , regs.gpp and gpp_sid are emitted by the seller's ad stack, and a half-populated pair is treated as unusable by buyers. See privacy signals .
Type drift from generated code. Agent stacks assemble JSON programmatically, and the classic failures are a string where the spec says integer, a single object where an array is required, and a boolean coerced from a flag.
## Why a generated payload needs a verifier, not a reviewer
One more reason the emitted request deserves a hard check: increasingly it is not written by a template, it is written by a model. A system assembling a bid request by pattern completion is very good at shape and indifferent to constraint, so what comes out looks right the way a forged signature looks right. The recognisable defects follow from that: "at": "1" as a string because most values in most JSON are strings, a field placed under ext because that is where it lived in an older integration, a 2.6 field inside a request an exchange will read as 2.5, an enum value that does not exist but sounds like it should.
Asking a second model to review the first does not resolve it. Both have the same relationship to the specification, which is that they have read a lot of payloads and hold no ground truth. Two plausibility engines agreeing is not verification.
A validator is different in kind, because the questions it answers are decidable. The JSON parses or it does not. The field exists in this version or it does not. The value is in the AdCOM list or it is not. That makes the output usable as a feedback signal rather than an opinion: an agent emits a request, calls the validator, gets back rule ids with JSON paths, repairs those exact defects, and calls again. Because the errors are structural, the loop converges quickly. It is the same reason coding agents run tests instead of asking a model whether the code compiles, and it is why RTBlint ships as an MCP server : the cheap correct check belongs in front of the expensive confident generator.
## What to check, and where
The useful discipline is to treat the emitted bid request as the contract's only observable output, and to check it at three points:
In CI, against fixtures. One fixture per product type your agent can transact, validated against the exact OpenRTB snapshot each exchange runs. The pattern is in validation in CI .
At the emit boundary. Validate the bytes you send, after serialization, not the object you think you built.
On the pair. Cross-validate the bid response against the request that produced it, so deal id, seat, currency, and media type are checked against what was actually offered rather than what was negotiated.
RTBlint does all three from one core: in the browser in the tester , in CI from the CLI , in Node through rtblint-core , and as an MCP server so a buying or selling agent can validate its own output as a tool call rather than waiting for a partner to complain.
## Sources
Ad Context Protocol specification (media-buy and creative task references, agentic execution engine, universal macros)
adcontextprotocol/adcp: schemas, including the OpenRTB-referenced placement and audio distribution enums
OpenRTB 2.6: Imp (3.2.4), Pmp (3.2.11), Deal (3.2.12), Video (3.2.7), Audio (3.2.8), Source (3.2.2)
IAB Tech Lab: AAMP, for the parallel stack and its OpenRTB-extension strategy
---
# OpenRTB vs Prebid and header bidding: how they fit together · RTBlint
URL: https://rtblint.org/guides/openrtb-vs-prebid-header-bidding/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB vs Prebid and header bidding: how they fit together
"OpenRTB vs Prebid" is one of the most common searches in programmatic, and it is a category error, in a useful way. They are not alternatives you choose between. One is a protocol, one is an auction technique, and one is software that implements the technique using the protocol. Once you see the layering, the confusion goes away.
## Three different kinds of thing
OpenRTB is a protocol : the IAB Tech Lab message format for a real-time auction, the JSON bid request an exchange sends and the bid response a bidder returns. It defines the vocabulary, not the plumbing. See what OpenRTB is .
Header bidding is an auction technique : letting a publisher offer an impression to several demand sources at once, before calling its primary ad server, so those sources compete instead of being ranked in a fixed waterfall.
Prebid is software : the dominant open-source implementation of header bidding, governed by Prebid.org. It is not a protocol and not a demand source of its own.
## What header bidding actually does
Before header bidding, publishers ranked demand in a waterfall: ask partner A, and if it passes, ask B, and so on. That leaves money on the table because a lower-priority partner might have bid more. Header bidding replaces the sequence with a parallel auction: all participating demand sources are asked to bid at the same time, and the winner competes in the ad server on price. It runs in one of two places:
Client-side , in the browser, where a script runs the auction before the page calls the ad server.
Server-side , where the browser makes one call to a server that runs the auction against many demand sources, trading some transparency for speed and a lighter page.
## What Prebid is, concretely
Prebid is a family of components, not one program:
Prebid.js : the client-side library that runs the in-browser auction and manages bidder adapters.
Prebid Server : the server-side auction (with Go and Java implementations) that runs the same idea in the cloud.
Prebid Mobile : SDKs for in-app header bidding.
The important detail for this comparison: Prebid Server talks to its bidder adapters using OpenRTB. Its auction endpoint takes an OpenRTB request and it exchanges OpenRTB bid requests and responses with demand partners under the hood. Prebid does not compete with OpenRTB; it is one of the largest emitters of it.
## How they stack
Read from the publisher down to the bidder, the layers nest rather than compete:
Publisher page / app
Header bidding <- the technique: run a unified auction
Prebid <- the software running that auction
OpenRTB <- the protocol Prebid uses to ask each bidder
Exchange / SSP
OpenRTB <- the same protocol, exchange to DSP
DSP / bidder
OpenRTB shows up twice because it is the common tongue at every hop where one party asks another to bid. Header bidding and Prebid decide who gets asked and where the auction runs. OpenRTB is how the asking is phrased.
## Side by side
OpenRTB Header bidding Prebid
What it is A protocol / message format An auction technique Software
Owned by IAB Tech Lab Nobody; an industry practice Prebid.org
Layer The wire between any two auction parties Upstream, at the publisher Implements header bidding
Uses OpenRTB? It is OpenRTB Yes, to call each demand source Yes, Prebid Server speaks it
## Where validation fits
Because Prebid Server and every SSP in the chain emit OpenRTB, the same validation applies wherever a bid request is produced. If you build or operate a Prebid Server deployment, a bidder adapter, or an exchange, the requests you send are OpenRTB and can drift from the spec in the usual ways: a stale placement enum, a consent string in ext , a floor without its currency. See common OpenRTB mistakes for the frequent ones.
Paste a request or response into the tester to check it client-side.
Gate a Prebid adapter or exchange build with the CLI and validation in CI .
## Sources
Prebid.org: Prebid Server
Prebid Server OpenRTB2 auction endpoint documentation
OpenRTB 2.6 specification
---
# SSP, DSP, and ad exchange: the OpenRTB ecosystem, explained · RTBlint
URL: https://rtblint.org/guides/openrtb-ssp-dsp-ad-exchange/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## SSP, DSP, and ad exchange: the OpenRTB ecosystem, explained
SSP, DSP, and ad exchange are the three acronyms every programmatic explainer throws at you at once. The clearest way to keep them straight is to anchor each to a role in the OpenRTB auction, because that is the protocol they all speak. Here is who does what, and why the boundaries are fuzzier than the diagrams suggest.
## The three roles
SSP (supply-side platform). Works for publishers. It takes a publisher's inventory and makes it available for sale programmatically, handling yield, floors, and demand connections. Its job is to get the highest price for an impression.
DSP (demand-side platform). Works for advertisers. It decides, per impression, whether to bid and how much, based on targeting, budget, and the signals in the request. Its job is to buy the right impressions at the right price.
Ad exchange. The marketplace that runs the auction. It receives an impression opportunity, asks buyers to bid, picks a winner, and returns the winning ad. Many SSPs operate their own exchange, which is where the confusion starts.
## How they map to OpenRTB
OpenRTB does not use the marketing acronyms. Its reference model names the roles functionally, and the mapping is direct:
The Exchange in the spec is the party that sends the bid request and runs the auction. An ad exchange, or the exchange side of an SSP, plays this role.
The Bidder is the party that receives the request and returns a bid response. A DSP is a bidder.
The Seat is the advertiser or agency on whose behalf a bidder acts, identified in wseat and seatbid.seat .
The Publisher owns the inventory, described in site.publisher or app.publisher . An SSP represents it.
So a single OpenRTB auction is: an exchange (run by or connected to an SSP) sends a bid request to many bidders (DSPs), each bidding for its seats (advertisers), over one impression from a publisher.
## The request flow
Publisher has an impression to sell
-> SSP packages it, applies floors, connects demand
-> Exchange broadcasts an OpenRTB bid request to bidders
-> DSP(s) each returns a bid response (or a 204 no-bid)
<- Exchange picks the winner, fires win/billing notices
<- SSP returns the winning ad to the page
Every arrow between the exchange and the DSPs is an OpenRTB message: a bid request out, a bid response back.
## Why the lines blur
The clean three-box diagram rarely survives contact with a real supply path. SSPs run exchanges, so "SSP" and "exchange" often name the same company. Large platforms operate on both sides. And an impression frequently passes through more than one SSP or reseller before it reaches a DSP, which is exactly why the supply chain trust stack (ads.txt, sellers.json, schain) exists: to make that path auditable. Upstream of all of this, publishers often run header bidding to call several SSPs at once. The roles are functions, not fixed companies.
## Side by side
SSP Ad exchange DSP
Works for Publishers The marketplace itself Advertisers
Goal Maximize yield Clear the auction Buy efficiently
OpenRTB role Publisher side / exchange Exchange Bidder
Sends or receives Builds the request Sends the request Returns the response
## Where validation fits
Whichever role you sit in, the bytes crossing between exchange and bidder are OpenRTB. An SSP or exchange builds bid requests; a DSP builds bid responses. Both drift from the spec in the same ways, and neither side gets an error when they do, only fewer bids or rejected responses. Paste either into the tester , or gate a build with the CLI . The common mistakes guide covers what usually goes wrong.
## Sources
OpenRTB 2.6 specification: Section 1.5 (Terminology) and Section 2 (Reference Model)
---
# First-price vs second-price auctions in OpenRTB · RTBlint
URL: https://rtblint.org/guides/openrtb-first-price-vs-second-price/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## First-price vs second-price auctions in OpenRTB
The auction type decides what a winning bidder actually pays, and it is one integer in the bid request. OpenRTB itself is neutral about which auction you run; it just carries the type and reports the clearing price. Here is what first-price and second-price mean, the field that signals them, and why almost the whole industry moved to first-price.
## The two auction types
Second-price (second price plus). The highest bidder wins but pays just above the second-highest bid, not their own bid. Bidders can bid their true value, because they will not overpay: the price is set by the competition, not by them.
First-price. The highest bidder wins and pays exactly what they bid. There is no discount from the runner-up, so bidding your true value means paying your true value.
The practical difference is bidder behavior. Under second-price, the winning strategy is to bid what the impression is worth to you. Under first-price, bidders lower (or "shade") their bids toward what they think it will take to win, because every dollar bid is a dollar paid.
## The field: BidRequest.at
The auction type lives in one attribute at the top of the request:
at (integer, default 2)
1 = First Price
2 = Second Price Plus
500+ = exchange-specific auction types
The default is 2 , a historical artifact from when second-price was the norm. An exchange running a first-price auction must set at: 1 explicitly. A deal can also override the request-level type: the Deal object has its own at , and a value of 3 there means the price in bidfloor is the agreed, fixed deal price rather than an auction outcome. Sending at as a string, "1" , is a common and silent error; it is an integer.
## Why the industry moved to first-price
Second-price made sense when one exchange saw all the demand. Header bidding broke that: once an impression is auctioned in several places at once, a second-price auction in each silo produces prices that are neither comparable nor trustworthy, and sellers suspected their clearing prices were being manipulated. First-price is transparent by comparison, you win, you pay your bid, so publishers and exchanges shifted to it through 2017 to 2019. Google Ad Manager, the last major holdout, moved to a unified first-price auction in 2019. First-price is now the default reality of open-market programmatic, even though the OpenRTB field still defaults to 2 .
## Reading the clearing price
Whatever the auction type, the winning bidder learns the final price through substitution macros in the win, billing, and loss notice URLs:
${AUCTION_PRICE} : the clearing price, in the bid's currency and units. In a first-price auction this equals the bid; in second-price it is lower.
${AUCTION_MIN_TO_WIN} : the minimum bid that would have won. Added in OpenRTB 2.6, it is most useful in first-price auctions, where it helps a bidder calibrate future bid shading without the exchange revealing other bidders' prices.
Exchange policy can strip ${AUCTION_PRICE} to a zero-length string if it declines to disclose the clearing price, so a bidder should handle an empty expansion gracefully rather than assume a number is always there.
## Side by side
Second-price (at=2) First-price (at=1)
Winner pays Just above the second bid Their own bid
Optimal strategy Bid true value Shade toward expected clearing price
Transparency Price set by hidden competition Win equals pay
Prevalence today Legacy and some private deals Open-market default
## What to check
If you run an exchange, make sure at reflects the auction you actually run; a first-price exchange still emitting the default 2 is misinforming every bidder. If you bid, confirm your response handling reads ${AUCTION_PRICE} correctly and tolerates an empty value. Validate a request or response in the tester , and see the macro reference for the full expansion table.
## Sources
OpenRTB 2.6 specification: BidRequest.at (Section 3.2.1), Deal.at (Section 3.2.12), Substitution Macros (Section 4.4)
Google: moving Ad Manager to a first-price auction (2019)
---
# Migrating to SupplyChain v1.1: hp=0 custody nodes, checklist and pitfalls · RTBlint
URL: https://rtblint.org/guides/openrtb-schain-1-1-migration/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## Migrating to SupplyChain v1.1: hp=0 custody nodes, checklist and pitfalls
SupplyChain has been at version 1.0 since 2019, which is long enough that most implementations treat its rules as facts rather than as one document's decisions. Version 1.1 is in public comment and changes the one rule everybody hardcoded: that every node in the chain is in the payment flow. This is the migration checklist, for both sides of an integration.
## The change, in one sentence
Entities that take technical custody of a bid request but never touch the money can now appear in the same nodes array as everybody else, marked with hp=0 .
It is the smallest change that could work. No parallel array, no new object type, no extension field. The systems it names are already in every path and disclosed in none of them: header bidding wrappers, publisher ad servers, server-side ad insertion platforms, SDKs.
## Why the field was inert
hp has always been a required integer on every node: 1 for in the payment flow, 0 for not. But 1.0 also says the property should always be 1, so it has been a boolean with one legal value for six years. Builders hardcode it, validators assert it, and buy-side audit walks every node against sellers.json because in a 1.0 chain every node is a seller account. Those three habits are what the migration is about. Field definitions are in the schain reference .
## What else moves with it
ver carries a new value, so any comparison against the literal string 1.0 needs to accept 1.1 or reject it loudly.
complete gains new enumerations, so the flag stops being a plain boolean. Read the final text before branching on it.
ads.txt scope narrows. Custody nodes are not expected to pass ads.txt validation. Referencing a sellers.json entry for a non-payment handler is described as strongly recommended rather than required.
sellers.json wording changes around the INTERMEDIARY seller type and the is_passthrough parameter.
Documentation moves. Implementation guidance consolidates into the Supply-Chain-Validation repository and the original OpenRTB Supply Chain Object page is deprecated.
## If you build chains (sell side, wrappers, SSAI, SDKs)
Find every hardcoded hp: 1 . Each one is now a claim your code has not evaluated. Decide per system whether it is in the payment flow and make the answer configuration rather than a constant.
Decide whether you are a custody node. If your system receives and forwards a bid request without being paid for the inventory, you are exactly what hp=0 was added to describe. Appending your node is the point of the release.
Append once. Longer chains mean more appenders and more chances that two systems write the same hop. Adjacent duplicate nodes fail path checks and read as padding. RTBlint reports it as openrtb.schain.duplicate_node .
Publish a sellers.json entry for the custody identity. Not required, strongly recommended, and the difference between a node a buyer can resolve and one that makes your chain look unverifiable.
Never emit a placeholder. An empty asi or sid satisfies a schema check and identifies nothing. Fail the node instead. That is openrtb.schain.node.identifier_empty , and it is an error rather than a warning because one broken node poisons the whole chain.
Coordinate the version bump. The rollout guidance is staged testing with a receiving partner, not a unilateral switch.
## If you read chains (buy side, SPO, verification)
Accept ver 1.1 or reject it with a logged reason. The option you cannot afford is the third one, where an unrecognised version routes the chain into an unhandled branch and the request proceeds without it. RTBlint flags unexpected values as openrtb.schain.ver_unexpected .
Split hop counting from money counting. Any policy phrased as reject chains longer than N has to say which N it means before longer chains start arriving. If the policy is about extraction, count hp=1 nodes.
Scope ads.txt authorization to the payment path. Running it over hp=0 nodes manufactures violations that are artifacts of your own reader.
Stop requiring every node to resolve in sellers.json. Reasonable under 1.0, too strict under 1.1.
Re-baseline your supply path scoring. A partner that adopts 1.1 will suddenly present a longer chain for identical inventory. If your model penalises length without filtering on hp , you will down-rank the partners who disclosed more.
Use the custody data. Duplicate bid detection gets materially better when the same request arriving by two routes carries evidence of which systems it crossed.
## What to grep for
The migration is mostly a search-and-decide exercise, and these five patterns find almost all of it in a typical stack:
hp.*[:=]\s*1 # hardcoded payment-flow claims
"1\.0" # ver comparisons that will reject 1.1
schain.*length # hop-count policies that need an hp filter
adsTxt|ads_txt # authorization checks to scope to hp=1
sellers\.json # per-node resolution that should stop being required
Every hit is a decision rather than a mechanical replacement, which is why this is worth doing before a partner starts sending 1.1 chains rather than during the incident that follows.
## The chain before and after
1.0 (publisher ad server, SSAI, exchange: only two get paid)
"nodes": [
{ "asi": "pubadserver.example", "sid": "8842", "hp": 1 },
{ "asi": "exchange.example", "sid": "pub-42", "hp": 1 }
]
1.1 (same path, custody disclosed)
"nodes": [
{ "asi": "pubadserver.example", "sid": "8842", "hp": 1 },
{ "asi": "ssai.example", "sid": "net-19", "hp": 0 },
{ "asi": "exchange.example", "sid": "pub-42", "hp": 1 }
]
The second chain is longer and more honest. Whether that is rewarded or punished depends entirely on what the reader on the other end does with length, which is why the reader checklist above matters as much as the builder one.
## Where to check and where to comment
Paste a request into the bid request tester , run the CLI over a corpus of what you emit today, or give an agent the MCP server so it validates its own output. Background on the surrounding artifacts is in the supply chain trust stack and the field reference is at the schain doc . The analysis of what breaks is in the post on nodes that never touch the money .
Public comment runs through 21 August 2026 in the Supply-Chain-Validation repository , which carries sub-issues for the open questions. A parser-level objection lands better there than in a support ticket six months from now.
---
# sellers.json, ads.txt, and schain: the OpenRTB supply chain trust stack · RTBlint
URL: https://rtblint.org/guides/openrtb-supply-chain-trust-stack/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## sellers.json, ads.txt, and schain: the OpenRTB supply chain trust stack
Programmatic has a trust problem: a bid request can pass through several intermediaries before it reaches a buyer, and any of them could be misrepresenting whose inventory it is. Three artifacts exist to make that path auditable, and they only work together. ads.txt says who may sell, sellers.json says who each seller is, and the OpenRTB schain object records the actual path this request took. Here is how they interlock.
## ads.txt: who is allowed to sell
ads.txt is a plain text file a publisher hosts at the root of its domain ( example.com/ads.txt ), listing the advertising systems authorized to sell its inventory and the publisher's account ID in each. The app equivalent is app-ads.txt . If a bid request claims to be selling example.com through an exchange that is not listed in example.com/ads.txt , a buyer has grounds to treat it as unauthorized. It is the publisher's public allowlist of sellers.
## sellers.json: who each seller actually is
sellers.json is hosted by the advertising system, the SSP or exchange, at its own domain ( ssp.com/sellers.json ). It maps each seller account ID that can appear in that system to a real identity: a name, a domain, and whether the seller is a publisher selling its own inventory or an intermediary reselling someone else's. Where ads.txt is the publisher's list of its sellers, sellers.json is the seller's disclosure of its accounts. The two are designed to be cross-referenced.
## schain: the path this request took
The first two files are static disclosures. The OpenRTB SupplyChain object, source.schain in 2.6, is dynamic: it travels inside each bid request and records the ordered list of every system that handled it, from the publisher out to the exchange sending it. Each node carries:
asi : the advertising system identifier, the domain of the system, which should match a sellers.json host.
sid : the seller ID within that system, which should match a seller entry in that system's sellers.json .
hp : whether this node is paid directly for the impression.
The chain also carries a complete flag: 1 asserts that every hop from the publisher is represented, 0 admits the chain is partial. A complete: 1 chain with a gap is worse than an honest 0 .
## How they cross-check
The three artifacts form a loop a buyer can verify without trusting any single party:
For each node in source.schain:
node.asi -> is there a sellers.json at that domain?
node.sid -> is that seller ID listed in that sellers.json?
seller -> does the publisher's ads.txt authorize this system + account?
If every hop resolves, the path is accountable end to end.
A break at any step is a red flag, not necessarily fraud, but worth blocking.
This is also the foundation of supply path optimization (SPO): once the path is legible, a buyer can prefer the shortest, cleanest route to a given publisher and drop redundant or opaque intermediaries.
## Where adagents.json fits
The agentic era adds a fourth file. adagents.json , served at /.well-known/adagents.json , is a publisher's declaration of which sales agents may represent its inventory, with scoped authorization beyond what ads.txt can express. It extends the same idea, verifiable authorization, into agent-brokered deals. See the AdCP explainer for the agent side.
## Common failures worth checking
schain in the wrong path. In 2.6 it is source.schain , not the older source.ext.schain . Buyers reading the current path miss a chain in the old one.
asi that does not resolve. An asi with no sellers.json, or a sid not listed in it, defeats the whole verification.
Empty or duplicate nodes. A blank asi / sid or two identical adjacent nodes is a malformed chain.
Dishonest complete . Marking a partial chain complete is the failure that undermines trust the most.
## Validate the chain
RTBlint checks source.schain structure, node hygiene, duplicate adjacent nodes, missing hp , and empty identifiers as part of its semantic rule set. Paste a request into the tester to see it, or run the CLI over sampled traffic. The object-by-object breakdown is in the schain reference .
## Sources
IAB Tech Lab: ads.txt and app-ads.txt
IAB Tech Lab: sellers.json
OpenRTB 2.6 specification: SupplyChain and SupplyChainNode (Section 3.2.25, 3.2.26)
---
# OpenRTB deals and PMP, explained: preferred, private auction, programmatic guaranteed · RTBlint
URL: https://rtblint.org/guides/openrtb-deals-pmp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB deals and PMP, explained: preferred, private auction, programmatic guaranteed
"PMP," "preferred deal," and "programmatic guaranteed" are commercial terms, not OpenRTB objects. The spec gives you a small set of fields, and the deal types are conventions expressed through them. This guide maps each commercial deal to the exact JSON that carries it, so you can read a pmp block and know what kind of deal you are looking at.
## The four deal types, commercially
Open auction. The public marketplace: any eligible buyer can bid, no prearrangement. No deal at all.
Private auction (PMP). A closed auction among invited buyers, often at a higher floor, competing on price.
Preferred deal. A fixed, negotiated price offered to one buyer who gets first look at the inventory but is not obligated to buy.
Programmatic guaranteed (PG). A committed buy: fixed price, fixed volume, the buyer is obligated to purchase, closest to a traditional direct deal executed programmatically.
## The objects that carry them
Deals hang off an impression in the Pmp object (Section 3.2.11), which holds two things:
private_auction : 0 means open bids are still accepted alongside any deals; 1 means bidding is restricted to the deals listed and their terms.
deals : an array of Deal objects.
Each Deal (Section 3.2.12) carries the terms:
id (required): the deal ID, the join key both sides agree on in advance.
bidfloor / bidfloorcur : the deal price or floor. Note this does not inherit from imp.bidfloorcur ; it defaults to USD on its own.
at : an optional per-deal auction type override. 1 first price, 2 second price plus, and 3 means the value in bidfloor is the agreed fixed deal price.
guar : 1 marks a guaranteed deal the bidder must bid on; 0 is the default.
wseat / wadomain : restrict which buyer seats or advertiser domains may bid on the deal.
## Mapping commercial deals to fields
Deal type private_auction Deal.at Deal.guar Price
Open auction 0 (no deal) request at n/a Auction clears
Private auction 1 1 or 2 0 Floor, competitive
Preferred deal 1 3 (fixed) 0 Fixed, first look
Programmatic guaranteed 1 3 (fixed) 1 Fixed, committed
The exact combination varies by exchange, since these are conventions rather than spec-mandated encodings, but the axes are always the same: is bidding restricted ( private_auction ), is the price fixed or auctioned ( at ), and is the buyer obligated ( guar ).
## The deal ID is the join key
Everything hinges on Deal.id . It is negotiated out of band, then the seller puts it in the bid request and the buyer matches on it to apply the agreed terms. If the IDs do not match on both sides, the deal simply never triggers, and the impression falls through to open-auction pricing with nobody noticing an error. A mismatched or missing deal ID is the most common reason a deal "isn't working."
## Common mistakes
Assuming Deal.bidfloorcur inherits. It does not. Omitting it means USD, which silently mis-prices a non-USD deal. See bid floors .
Marking a deal guar: 1 without meaning must-bid. A guaranteed deal obligates the bidder; setting it loosely breaks bidder logic.
Setting private_auction: 1 but expecting open bids. That value restricts bidding to the listed deals only.
## Validate the pmp block
Deal terms are easy to get subtly wrong and hard to notice, because a broken deal falls through silently. Paste a request with a pmp block into the tester to check the structure, and read the auction-type mechanics in first-price vs second-price .
## Sources
OpenRTB 2.6 specification: Object: Pmp (Section 3.2.11) and Object: Deal (Section 3.2.12)
---
# What is AdCOM? OpenRTB's companion object model · RTBlint
URL: https://rtblint.org/guides/what-is-adcom/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## What is AdCOM? OpenRTB's companion object model
If you have read the OpenRTB 2.6 spec you have hit dozens of links that point out of the document to something called AdCOM. That is not a footnote; it is where half the meaning of a bid request now lives. AdCOM is the Advertising Common Object Model, and understanding the split between it and OpenRTB explains why enum values moved and where to look them up.
## The one-line definition
AdCOM is an IAB Tech Lab companion specification that defines common objects and values expected to be used across many IAB Tech Lab specifications. Instead of every protocol redefining what a "device type" or a "creative attribute" is, they all reference one shared model. OpenRTB is one consumer of it; so are other Tech Lab standards.
## Why OpenRTB 2.6 moved its lists there
Through OpenRTB 2.5, the enumerated lists, device types, connection types, API frameworks, creative attributes, and the rest, lived in Section 5 of the OpenRTB document itself. OpenRTB 2.6 removed that section entirely and pointed every reference at AdCOM instead. The spec is explicit about the reason: keeping the lists in AdCOM lets them iterate more rapidly than the base protocol. A new device type or API framework can be added to an AdCOM list without cutting a new OpenRTB version, which fits the dated-snapshot model where the version number only moves on breaking changes.
## What AdCOM defines
Two kinds of thing, and the enumerated lists are the part most OpenRTB integrations touch daily:
Enumerated lists. The value tables OpenRTB fields reference: device types, connection types, placement positions, playback methods, API frameworks, creative attributes, category taxonomies, and more. When a 2.6 field says "refer to List: Creative Attributes in AdCOM 1.0," the numbers behind battr come from AdCOM, not OpenRTB.
Context and placement objects. AdCOM also models the site, app, DOOH, user, and device context and the placement of an ad. In OpenRTB 2.6 these still appear as native OpenRTB objects, but in OpenRTB 3.0 the request is built directly on AdCOM objects.
Fields like cattax (which taxonomy bcat uses), battr (blocked creative attributes), and pos (ad position) all resolve their legal values against AdCOM lists. The enum reference notes where each one moved.
## AdCOM and OpenRTB 3.0
AdCOM is also the foundation of OpenRTB 3.0. Where 2.x is a single self-contained protocol, 3.0 is a layered design: a thin transaction layer (the bid request and response envelope) sits on top of AdCOM, which supplies the domain objects. That is why 2.6 and 3.0 are better understood as different architectures than as an upgrade, and why most traffic still runs 2.6. AdCOM is the shared layer that both versions, and the newer agentic work, build on.
## What it means for validation
Because the value tables live in AdCOM, validating a bid request means checking some fields against AdCOM lists, not the OpenRTB document. A device type or placement value that was valid under an old list, or that a validator hard-codes from an outdated copy, is exactly the kind of drift that costs bids without erroring. RTBlint tracks documented enum values as part of its rule set; paste a request into the tester or run the CLI to check them.
## Sources
AdCOM v1.0 specification (InteractiveAdvertisingBureau/AdCOM)
OpenRTB 2.6 specification: Related Specifications and the AdCOM list references
---
# bid.adm vs nurl: how the winning ad gets delivered in OpenRTB · RTBlint
URL: https://rtblint.org/guides/openrtb-adm-vs-nurl/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## bid.adm vs nurl: how the winning ad gets delivered in OpenRTB
When a bid wins, the exchange needs the actual ad and a way to count the impression. OpenRTB gives a bidder two ways to hand over the creative and three notice URLs to track what happens next. Getting the choice between them right is the difference between a fast render and an extra round trip, or a missed impression count.
## Two ways to deliver the markup
adm (inline). The bidder includes the ad markup directly in the bid response. If the bid wins, the exchange already has the creative and can render it immediately, with no extra call back to the bidder.
nurl (win notice). The bidder omits the markup and gives a win notice URL instead. If the bid wins, the exchange calls nurl , and the bidder can return the markup in that response. It defers creative generation until the impression is actually won.
The spec settles the ambiguity: if markup is present in both, adm supersedes the win notice. So you send one or the other, not both expecting the nurl to win.
## The tradeoff
Inline adm is one fewer round trip: the markup travels with the bid, so a win renders without waiting on the bidder again. The cost is that the bidder generates creative for every bid, including the ones that lose. nurl inverts that: no wasted markup generation, but a win incurs a second call back to the bidder before the ad can render, adding latency at the worst moment. Most display goes inline; deferred markup is chosen when generation is expensive or must be personalized at win time.
## The three notice URLs
Beyond delivering markup, the bid response carries up to three tracking URLs the exchange fires at different moments:
nurl : called on a win . A win is not the same as a rendered, viewed, or billable ad; it just means this bid was selected.
burl : called when the win becomes billable under the exchange's policy, typically on delivery or viewability. This, not the win, is what a careful bidder counts as spend.
lurl : called on a loss , optionally with a loss reason code. Exchange policy may withhold it or strip the clearing price from it.
The distinction between win and billable is the one bidders most often collapse. Pricing algorithms should learn from nurl ; actual spend should follow burl . See the bid response reference for the full object.
## mtype: telling the exchange what the markup is
The mtype field on the bid states the creative type so the exchange can associate it with the right impression sub-object:
mtype (integer)
1 = Banner
2 = Video
3 = Audio
4 = Native
Setting mtype lets the exchange validate that a video bid is answering a video impression rather than trusting the markup to declare itself. A bid whose mtype contradicts the impression it answers is a bug worth catching.
## Macros in the markup and notices
All of these fields, adm , nurl , burl , and lurl , may contain substitution macros that the exchange expands before firing. The most important is ${AUCTION_PRICE} , the clearing price. Because exchange policy can replace it with a zero-length string when it declines to disclose the price, markup and tracking that depend on it must tolerate an empty value rather than break.
## What to check
Send adm or nurl , not both expecting nurl to win.
Set mtype to match the impression you are answering.
Count spend on burl , not nurl .
Handle an empty ${AUCTION_PRICE} expansion gracefully.
When mtype is 2, adm is usually a VAST document. The JSON check does not read that XML. Validate the document the player will see .
Validate a bid response, including its adm and notice fields, in the tester , or gate responses with the CLI .
## Sources
OpenRTB 2.6 specification: Object: Bid (Section 4.2.3), adm, nurl, burl, lurl, mtype
---
# OpenRTB user identity: eids, buyeruid, and the cookieless transition · RTBlint
URL: https://rtblint.org/guides/openrtb-user-identity-eids/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## OpenRTB user identity: eids, buyeruid, and the cookieless transition
Identity is the most contested part of a bid request. A buyer wants to recognize a user; privacy rules and the decline of third-party cookies keep changing what it is allowed to see. OpenRTB carries several identity mechanisms at once, from a legacy cookie-synced ID to the modern extended-identifier array. Here is what each field is and how they relate.
## The legacy mechanism: user.id and buyeruid
The User object has carried identity since the earliest OpenRTB versions through two fields:
user.id : the exchange's own identifier for the user.
user.buyeruid : a buyer-specific ID, mapped by the exchange for a particular buyer. Unless the two parties arranged it directly, this value comes from a cookie sync, the ID-matching process described in the spec's Appendix on cookie-based syncing.
This model depends on third-party cookies and match tables, exactly the plumbing that has been eroding across browsers. That is why the extended-identifier model exists.
## The modern mechanism: user.eids
user.eids is an array of Extended Identifier ( EID ) objects, each grouping one or more IDs from a single source. It is the standard way to carry third-party and first-party identity solutions (the various universal ID initiatives) in a single structured field instead of a tangle of extensions. Each EID carries:
source : the canonical domain of the ID provider, so a buyer knows which identity system a value belongs to.
uids : an array of UID objects, each with an id (the actual identifier) and an atype (the agent type the ID came from, a browser versus an app-native context, which DSPs need for resolution).
inserter , matcher , and mm : provenance fields that record who added the ID to the array and by what match method, so a buyer can reason about how trustworthy a match is.
"user": {
"eids": [
{
"source": "idprovider.com",
"uids": [
{ "id": "a1b2c3d4", "atype": 1 }
]
}
]
}
## Why the shift matters
Cookie-synced buyeruid is tied to the browser cookie and the exchange's match table; when third-party cookies go away, so does that ID. Extended identifiers are deliberately source-agnostic: a universal ID, a hashed-email-based ID, or a publisher-provided ID all travel the same way in eids , tagged by source so the buyer knows what it is looking at. The bid request format did not have to change per identity vendor; they all fit the same object.
## Identity does not override privacy
None of these fields exists in isolation from consent. Whether an exchange may send an ID at all depends on the regulatory signals in the request, and sending identity without the consent to back it is a compliance problem, not just a data one. The exact paths for regs.gdpr , user.consent , GPP, and US Privacy are in the privacy signals reference . Treat identity and consent as a pair.
## Common mistakes
eids in an extension. It is a first-class user.eids array, not user.ext.eids . Buyers reading the standard path miss IDs stuffed in ext .
Missing atype . Many DSPs require the agent type to resolve an ID; omitting it can make an otherwise valid ID unusable.
Unnamed source . An ID with no source domain is unmatchable; the buyer cannot tell which system it belongs to.
## Validate the identity block
Paste a request with a user.eids array into the tester to check structure and paths, or run the CLI over sampled traffic. Identity errors are silent: a misplaced or malformed ID just fails to match and lowers your bid density with no error.
## Sources
OpenRTB 2.6 specification: Object: User, Object: EID (Section 3.2.27), Object: UID (Section 3.2.28)
AdCOM v1.0: List: Agent Types (values for atype)
---
# VAST and OpenRTB: how video ad creatives are delivered · RTBlint
URL: https://rtblint.org/guides/vast-and-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## VAST and OpenRTB: how video ad creatives are delivered
VAST and OpenRTB are both IAB Tech Lab specs, they both show up in a video ad, and they are constantly confused. They do different jobs: OpenRTB runs the auction that decides which ad plays; VAST describes what that ad is and how the player should fetch and track it. This guide draws the boundary and shows exactly where they connect.
## Two specs, two jobs
OpenRTB is the real-time auction protocol: the bid request describing a video opportunity and the bid response naming a winner. It is JSON, exchanged between an exchange and bidders.
VAST (Video Ad Serving Template) is the creative-delivery format: an XML document a video player reads to know where the media file lives, how long it runs, what is clickable, and which tracking events to fire. It is consumed by the player, not the exchange.
OpenRTB decides the winner in milliseconds; VAST plays out over the seconds the ad is on screen. Different layers, different consumers.
## Where they meet: bid.adm
The connection point is the winning bid's markup. For a video impression ( mtype 2), the ad markup a bidder returns in bid.adm is typically a VAST XML document, or the bidder returns a nurl that resolves to one. The exchange passes that VAST to the player, which takes over from there.
OpenRTB bid request imp.video { ... } "here is a video slot"
OpenRTB bid response bid.adm = ... "here is the winning ad"
|
v exchange hands the VAST to the player
Video player parses VAST, fetches media, fires trackers
So VAST rides inside an OpenRTB field. The auction envelope is OpenRTB; the payload for a video win is VAST. See how adm works in adm vs nurl .
## How the request constrains the creative
The Video object in the bid request tells bidders what kind of VAST is acceptable before they ever bid. The fields that matter most for compatibility:
protocols : which VAST versions and wrapper modes the player supports. A bidder returning VAST 4 markup to a player that only listed VAST 2 will fail to render.
mimes : acceptable media file formats.
api : supported API frameworks (for interactive video such as VPAID or the newer SIMID and OMID measurement).
minduration / maxduration : the allowed ad length, which the VAST creative must fit.
plcmt : the placement type, which affects what creative is appropriate. See placement vs plcmt .
A bid whose VAST violates the constraints the request advertised is a rendering failure waiting to happen, and it does not announce itself in the JSON.
## Wrappers and the redirect chain
VAST can be inline (the ad and its media in one document) or a wrapper that redirects to another VAST document, chaining through ad servers before reaching the final creative. That chain lives entirely on the VAST side, after the OpenRTB auction is over, but it is where a lot of video latency and error originates. OpenRTB's job ends when the winning adm is delivered; what happens inside the VAST is a separate problem with its own tooling. A legal bid.adm wrapper can still terminate in no ads (player error 303). Walk hops on the VAST inspector . The wrapper checklist is How to Validate VAST Wrappers . The same split applies to SIMID envelopes and companion sizes: see A spec-valid video bid can still fill with empty VAST .
## Two validations, two layers
Because the layers are separate, so is their validation. RTBlint checks the OpenRTB side: that imp.video is well formed, that protocols , api , and durations are sane, and that the bid response envelope is valid. Whether the VAST document inside adm is itself valid is a distinct check, handled by a VAST validator, not an OpenRTB one. Validate the auction envelope in the OpenRTB tester . Fetch a live tag URL in the VAST tester ; do not substitute a paste-only check when the creative still has to unwrap.
## Sources
OpenRTB 2.6 specification: Object: Video (Section 3.2.7)
IAB Tech Lab: VAST (Video Ad Serving Template)
---
# What is programmatic advertising? A plain-English explainer · RTBlint
URL: https://rtblint.org/guides/what-is-programmatic-advertising/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## What is programmatic advertising? A plain-English explainer
Programmatic advertising is the automated buying and selling of digital ads, decided by software in an auction that runs in the time it takes a page to load, instead of by salespeople negotiating insertion orders. This is the short, honest version: who is involved, how one impression gets sold, and where the protocol underneath, OpenRTB, fits.
## The core idea
Traditionally, a publisher's sales team sold ad space directly: a fixed number of impressions at a negotiated price, booked in advance. Programmatic replaces that manual step with automation. When a person opens a page or app, the ad slot is offered for sale and buyers compete for that single impression in real time. The whole transaction, offer, bids, winner, and served ad, happens in roughly the low tens of milliseconds, before the content finishes loading.
## Who is involved
Publishers and SSPs on the sell side, offering inventory.
Advertisers and DSPs on the buy side, deciding what to bid.
Ad exchanges in the middle, running the auction.
Data and identity providers supplying the signals buyers reason over.
The full breakdown of the sell-side, buy-side, and marketplace roles is in SSP, DSP, and ad exchange .
## How one impression gets sold
1. A person opens a page or app with an ad slot.
2. The publisher's SSP offers the impression to an exchange.
3. The exchange sends a bid request to many buyers at once.
4. Each buyer's DSP decides, in milliseconds, whether and how much to bid.
5. The exchange picks the highest eligible bid.
6. The winning ad is returned and rendered on the page.
Steps 3 through 5 are real-time bidding (RTB), the auction at the heart of programmatic. The messages in steps 3 and 4 are OpenRTB.
## It is not all open auctions
"Programmatic" does not mean "open free-for-all." The same automated pipes carry several kinds of deal, from the fully open auction to committed, fixed-price buys that look like traditional direct sales executed through software:
Open auction: any eligible buyer competes.
Private marketplace (PMP): a closed auction among invited buyers.
Preferred deal: a fixed price offered to one buyer with first look.
Programmatic guaranteed: fixed price, fixed volume, committed.
How OpenRTB expresses each of these is covered in deals and PMP .
## Where OpenRTB fits
None of this works without a shared language. If every exchange and every DSP spoke a different format, no buyer could bid across the market. OpenRTB is the IAB Tech Lab standard that lets thousands of exchanges and bidders interoperate: the common structure of the bid request an exchange sends and the bid response a buyer returns. It is the layer that makes "programmatic" a single market rather than a thousand incompatible ones. For the protocol itself, see what OpenRTB is .
## Where validation fits
Because the whole market runs on those messages, a malformed bid request or response costs real money, in dropped bids and rejected inventory, without throwing an error anywhere. That is what a validator is for. Paste a bid request into the tester to see it checked against the spec, or start with how to validate a bid request .
## Sources
OpenRTB 2.6 specification: Section 2 (Reference Model)
---
# tmax and bidder timeouts: why OpenRTB bids arrive too late · RTBlint
URL: https://rtblint.org/guides/openrtb-tmax-timeouts/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Guides
## tmax and bidder timeouts: why OpenRTB bids arrive too late
A bid that arrives after the deadline is worth nothing, no matter how high it is. That deadline is tmax , a single integer in the bid request, and misreading it is one of the most common reasons a bidder looks like it is not participating when it is. Here is what tmax actually governs and how to debug bids that keep arriving late.
## What tmax means
BidRequest.tmax is the maximum time, in milliseconds, the exchange will wait for a bid response, and the spec is explicit that this budget includes Internet latency: the network time to deliver the request and return the response counts against it, not just the bidder's own compute. It also supersedes any prior guidance the exchange gave out of band; the value in the request is the one that binds for this auction.
That network-inclusive definition is the part bidders get wrong. If tmax is 100 milliseconds and the round-trip network time between exchange and bidder is 40, the bidder has 60 milliseconds to decide, not 100. Budget compute against what is left after the wire, not against the whole number.
## A timeout is not a no-bid
These look identical in the logs, an impression the bidder did not win, but they are different failures with different fixes:
No-bid. The bidder responded in time and chose not to bid, ideally with a reason code. Covered in no-bid reason codes .
Timeout. The bidder's response did not arrive before tmax , so the exchange discarded it, whatever it contained. This is a latency problem, not a decisioning one.
Conflating the two sends you debugging the wrong system. A rising timeout rate points at infrastructure and network; a rising no-bid rate points at targeting and floors.
## Typical values, and a sane floor
There is no single correct tmax ; it depends on the channel and the supply path. Web display auctions often sit in the low hundreds of milliseconds; server-side and CTV paths may allow more. What matters is that the value is realistic and positive. A tmax of zero, a negative value, or an implausibly tiny number is simply a malformed request, and RTBlint flags non-positive or implausible tmax as a plausibility issue for exactly that reason. See the tmax reference for the full semantics.
## Debugging bids that arrive late
Measure the network RTT between exchange and your endpoint. Subtract it from tmax to find your real compute budget.
Check geographic placement. A bidder far from the exchange loses the race on the wire before it computes anything. Co-location or regional endpoints are the usual fix.
Profile the slow path, not the average. Timeouts live in the tail. A p50 well under budget with a fat p99 still bleeds impressions.
Fail fast internally. Cap your own decisioning below the remaining budget and return a no-bid rather than blowing the deadline with a bid that gets discarded anyway.
Enable Keep-Alive and compression. Connection reuse and gzip cut wire time directly; see bid request best practices .
## What to check
If you run an exchange, confirm tmax is present, positive, and accounts for the latency to your bidders; a value that ignores network time starves honest bidders. If you bid, instrument the gap between tmax and your delivered response time. Validate that tmax is well formed in the tester or the CLI .
## Sources
OpenRTB 2.6 specification: BidRequest.tmax (Section 3.2.1) and Section 2.1 (Transport)
---
# What is supply path optimization (SPO)? · RTBlint
URL: https://rtblint.org/answers/what-is-supply-path-optimization/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What is supply path optimization (SPO)?
Short answer
Supply path optimization is a buyer's practice of deciding which intermediaries to buy an impression through, then cutting the rest. The same impression is usually offered by several exchanges and resellers at once, at different prices and fees, so buyers compare paths on cost, win rate, and how verifiable the seller chain is, then concentrate spend on the shortest defensible path. In OpenRTB the evidence for that decision lives in source.schain, cross-checked against the publisher's ads.txt and each intermediary's sellers.json.
## Why the same impression reaches a buyer more than once
A publisher rarely sells through one exchange. A page runs header bidding with several demand partners, the ad server has its own programmatic demand, and some of those partners resell to other exchanges. The result is that a single impression opportunity fans out and arrives at a large DSP through multiple paths, each with its own fee stack and its own claim to be selling the same thing.
OpenRTB anticipates this. source.tid is a transaction id shared by every participant offering the same impression, so a buyer can recognise duplicates, and source.fd says whether the exchange sending the request is the entity that makes the final decision or is passing it along. Both fields exist because the entity talking to you is often not the one who owns the inventory. See OpenRTB versus header bidding for how the duplication arises.
## What SPO actually optimises
Supply path optimization means picking which of those paths to keep. The comparisons that matter, in rough order of how much money they move:
Net cost. Every hop takes a cut. Two paths to the same impression can differ by double digits in what actually reaches the publisher.
Win rate on identical inventory. If two paths offer the same source.tid and one wins consistently cheaper, the other is noise you are paying to process.
Request quality. A path that drops schain , sends stale video.placement instead of video.plcmt , or omits privacy signals forces you to bid blind or not at all.
Latency. A path that arrives late against tmax loses auctions you priced correctly. See tmax and bidder timeouts .
Auditability. A chain that cannot be reconciled against ads.txt and sellers.json is a chain you cannot defend to a client.
The sell-side mirror image is demand path optimization: publishers and SSPs cutting the demand sources that cost more to serve than they return.
## The fields that make a path checkable
SPO decisions are only as good as the evidence in the request. Three artefacts do the work together, and each covers a gap the others leave:
Artefact Where it lives What it establishes
ads.txt / app-ads.txt Publisher domain Which sellers the publisher authorises to sell its inventory, and as what
sellers.json Each intermediary's domain Who the seller account ids belong to, and whether they are publishers or intermediaries
source.schain The bid request itself The ordered chain of sellers that handled this specific impression
The SupplyChain object requires complete , nodes , and ver ; each SupplyChainNode requires asi and sid , and sets hp when the node is in the payment path. complete: 1 asserts that every intermediary between publisher and buyer is present. Full field semantics are in the schain reference , and the cross-checking model is in the supply chain trust stack .
## What you can catch before the analysis starts
Half of the paths that look unattributable are just malformed. RTBlint flags the structural failures directly from a payload: openrtb.schain.duplicate_node when the same asi and sid pair appears twice in one chain, openrtb.schain.node.identifier_empty when a node ships an empty asi or sid , and openrtb.schain.node.hp_missing when a node omits the payment-path flag. Run a real request through the tester before concluding a partner is hiding something.
## Sources
OpenRTB 2.6: Source (3.2.2), SupplyChain (3.2.25), SupplyChainNode (3.2.26)
IAB Tech Lab: ads.txt and app-ads.txt
IAB Tech Lab: sellers.json
---
# What is bid shading and how does it work? · RTBlint
URL: https://rtblint.org/answers/what-is-bid-shading/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What is bid shading and how does it work?
Short answer
Bid shading is a buy-side pricing technique that submits a bid below the buyer's true maximum, estimating the lowest price that still wins. It exists because the industry moved from second-price to first-price auctions: under first price (OpenRTB at=1) the winner pays exactly what it bid, so bidding your full valuation means overpaying on every win. OpenRTB has no bid shading field. The model lives inside the DSP and is trained on auction feedback, mainly loss notices (lurl) carrying ${AUCTION_MIN_TO_WIN} and loss reason codes.
## The auction change that created it
Under a second-price auction the winner pays just above the second-highest bid, so a buyer can safely bid its true valuation: the mechanism itself removes the overpayment. When the industry converted to first price, that protection disappeared. The winner now pays exactly what it submitted, so a buyer bidding its maximum on every impression pays its maximum on every impression it wins.
In OpenRTB the auction type is declared in BidRequest.at : 1 is first price, 2 is second price plus, and 3 means the value in imp.bidfloor is the agreed deal price. Full semantics and the history of the transition are in first-price versus second-price auctions .
## What a shading model is actually estimating
A shading model answers one question per impression: what is the lowest price that still wins? That requires a win probability curve, the chance of winning at each candidate price for this kind of impression on this supply path. The bidder then picks a point on the curve that maximises expected value, given how much it wants the impression.
The hard part is that auction data is censored. You observe the clearing price when you win, and by default nothing at all when you lose. That is why loss feedback matters so much: without it, a bidder only learns about the region of the price curve where it already wins.
## The OpenRTB signals that feed it
Signal Where What it tells a shading model
at Bid request Whether shading applies at all: pointless under a true second-price auction
imp.bidfloor , bidfloorcur Bid request The hard lower bound; shading below it wastes the bid
${AUCTION_PRICE} Win notice (nurl or burl) The clearing price on wins, the observed half of the curve
${AUCTION_LOSS} Loss notice (lurl) Why the bid lost: price (102), floor (100 or 101), filtering (2xx)
${AUCTION_MIN_TO_WIN} Loss notice (lurl) The minimum price that would have won, the censored half of the curve
Distinguishing loss reasons matters more than the raw loss count: a bid filtered for a creative attribute (loss code 210) carries no pricing information at all, and training on it teaches the model to shade down for no reason. The full tables are in loss reason codes and the macro reference .
## Where shading gets contentious
Buy-side shading inside your own DSP is uncontroversial: you are pricing your own money. The disputes are about shading applied somewhere in the middle, where an intermediary reduces the bid it passes on and keeps part of the difference, or where a fee is charged on the pre-shaded price. Both are business-model questions, not protocol questions: OpenRTB carries the price that was submitted and the price that cleared, and nothing in the payload reveals a margin taken between them.
That is the practical link to supply path optimization : comparing the same source.tid across paths is how buyers detect the gap without needing anyone's cooperation.
## Before you blame the model
A drop in win rate is often mistaken for shading gone wrong when the real cause is a malformed or incomplete request that never got priced properly. Check the payload first: the tester flags missing floors, non-positive tmax , currency format errors, and media-type mismatches that all depress win rate independently of price. See also why is my fill rate low .
## Sources
OpenRTB 2.6: BidRequest.at (3.2.1), Bid.lurl (4.2.3), substitution macros (4.4)
OpenRTB loss reason code list
---
# What is curation in programmatic advertising? · RTBlint
URL: https://rtblint.org/answers/what-is-curation-in-programmatic/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What is curation in programmatic advertising?
Short answer
Curation is the packaging of inventory plus data into a ready-to-buy deal, assembled on the sell side by a curator: a data company, an agency, a retail media network, or the SSP itself. The buyer sees one deal ID; the audience segments and inventory filters behind it are applied upstream, before the request is sent. In OpenRTB a curated deal arrives as an ordinary entry in imp.pmp.deals with no marker saying it was curated, which is exactly why curation is hard to audit. IAB Tech Lab's Curation object addresses that in the separate Deal Sync API, not in the bid request.
## What a curator assembles
A curator takes supply it does not own, applies a filter, and sells the result as a package. The filter can be audience data (segments from a data provider or a retail media network), inventory quality criteria (an allowlist of domains or apps, an MFA exclusion list), or contextual and attention signals. The output is a deal id that a buyer can target in its DSP like any other private marketplace deal.
Two things make this different from a publisher-direct PMP. The selection happens on the sell side, before the bid request leaves the SSP, so the buyer never sees the impressions that were filtered out. And the curator sits in the middle of the money: its fee is taken from the same transaction, on top of the exchange fee.
## How it looks in the bid request
It looks like a deal, because it is one. The relevant fragment of the request is the same one every PMP uses:
"imp": [{
"id": "1",
"pmp": {
"private_auction": 1,
"deals": [{
"id": "curator-deal-8842",
"bidfloor": 12.5,
"bidfloorcur": "USD",
"at": 1
}]
}
}]
There is no curator field, no fee field, and no description of the filter that produced this impression. The Deal object carries id (required), bidfloor , bidfloorcur , at , wseat , wadomain , guar , mincpmpersec , and durfloors . That is the whole vocabulary. See OpenRTB deals and PMP for how the four deal types map onto those fields.
Audience data attached to the impression travels separately, in user.data or content.data , where each Data object has an id and name identifying the provider and an array of segment entries. A curator that passes its segments through the request is identifiable there. A curator that applies them purely as an upstream filter is not identifiable at all.
## Where the Curation object actually lives
IAB Tech Lab's answer to curation opacity is a Curation object carrying terms, inventory scope, and fee disclosure. It is defined in the Deal Sync API, a one-directional SSP-to-DSP push of static deal metadata that runs alongside the bidstream. The specification states plainly that it is not included in the OpenRTB request or response, and that criteria sent through it are not guaranteed to match what arrives in the live bid request.
For anyone building against OpenRTB, the practical consequence is that curation transparency is a sidecar feed to reconcile against, not a field to parse. More context in what the IAB Tech Lab 2026 roadmap means for OpenRTB .
## What a buyer can still check
Deal id integrity. A bid that names a dealid never offered in the request is invalid, and exchanges drop it (loss reason 4, Invalid Deal ID).
The right floor. A deal-backed bid clears the deal's bidfloor , not the impression's. Bidding against the wrong one produces loss reason 101.
Seat restrictions. wseat on the deal, and wseat or bseat on the request, decide whose bids are eligible.
Supply path. Curated supply still carries source.schain , so the chain can be reconciled the same way as any other. See supply path optimization .
RTBlint validates a bid response against the request that produced it, which is where those checks live: openrtb.bid.dealid_unknown and openrtb.seatbid.seat_not_allowed both fire on a paired request and response in the tester .
## Sources
OpenRTB 2.6: Pmp (3.2.11), Deal (3.2.12), Data (3.2.21), Segment (3.2.22)
IAB Tech Lab Deal Sync API, including Object: Curation
---
# What are MFA (made for advertising) sites? · RTBlint
URL: https://rtblint.org/answers/what-are-mfa-sites/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What are MFA (made for advertising) sites?
Short answer
MFA stands for made for advertising: sites and apps built to monetise acquired traffic rather than to serve an audience. The tells are commercial, not technical: very high ad density, auto-refreshing slots, slideshow or clickbait content, and paid traffic acquisition. Nothing in OpenRTB marks a request as MFA, and MFA inventory usually passes ads.txt, sellers.json, and payload validation cleanly, so buyers filter it with inventory lists and quality vendors, using signals like imp.refresh, site.cat, and per-domain performance to build those lists.
## What the label actually means
MFA stands for made for advertising. It describes properties whose business model is buying traffic cheaply and monetising it with ads, rather than attracting an audience and monetising the attention. The content is a vehicle for the ad slots, not the reason anyone is there.
The category is contested at the edges. There is no industry-wide definition with a bright line, and the same site can be judged differently by two vendors. What is not contested is the economics: a large share of programmatic spend has been shown to land on inventory that delivers impressions efficiently and outcomes poorly.
## Why OpenRTB cannot flag it
A bid request describes an impression opportunity. It has fields for who is selling, what the slot is, what device is on the other end, and which rules apply. It has no field for whether the content deserves an audience, and it never will, because that judgement is commercial and contested rather than technical.
MFA operators also tend to be scrupulous about the parts that are checkable. They publish ads.txt, appear correctly in sellers.json, send a complete source.schain , and emit clean payloads, because failing those checks would cut them off from demand. This is the key mental separation: protocol validity and inventory quality are orthogonal. RTBlint answers the first question only, and says so.
## The fields that carry a signal
Field What it tells you
imp.refresh.count , refsettings.reftype , minint How many times this slot has already refreshed, what triggers a refresh, and the minimum interval. Added in OpenRTB 2.6 precisely because refresh behaviour was invisible and buyers were paying for it blind.
site.domain , app.bundle The key every inventory list is built on, and the thing to normalise first
site.cat , sectioncat , pagecat , cattax Declared content categories, in the taxonomy named by cattax (default 1)
site.page , site.ref The exact URL and referrer, which is where paid-traffic patterns show up
imp[] count, imp.instl , imp.pos How many slots are being sold at once, and how prominent each claims to be
Note that all of these are declarations by the seller. They are useful as inputs to a model and useless as guarantees. The one thing you can enforce is consistency: a request claiming a premium placement while imp.refresh.count says the slot has already cycled eleven times is telling you something.
## Where validation does help
Not with the MFA judgement itself, but with the noise around it. Inventory lists key on site.domain and app.bundle , so requests that omit them, send a full URL where a domain belongs, or leave site and app ambiguous quietly bypass the list you built. Those are structural errors a validator does catch. Run a sample of live requests through the tester and check the fields your filters depend on actually arrive populated. The broader checklist is in bid request best practices .
## Sources
OpenRTB 2.6: Site (3.2.13), Imp (3.2.4), Refresh (3.2.33), RefSettings (3.2.34)
AdCOM 1.0: Category Taxonomies and Auto Refresh Triggers lists
---
# How do I build an OpenRTB bidder endpoint? · RTBlint
URL: https://rtblint.org/answers/how-to-build-an-openrtb-bidder/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## How do I build an OpenRTB bidder endpoint?
Short answer
A bidder is one HTTPS endpoint that accepts a POSTed JSON bid request and returns a bid response before tmax expires. The minimum viable implementation parses the request, decides on each imp, and returns either HTTP 200 with a BidResponse whose id echoes the request id and whose bids carry impid, price, mtype, and adm or nurl, or HTTP 204 with no body to pass. Everything else, targeting, pacing, shading, sits behind that contract. The hard parts are latency (your compute budget is tmax minus network round trip) and honouring what the request declares: cur, wseat, bcat, badv, and privacy signals.
## The contract, in one paragraph
An OpenRTB bidder is an HTTPS endpoint. The exchange POSTs a JSON bid request to it and waits up to tmax milliseconds. You return either a bid response or nothing. There is no session, no handshake, and no retry: each request is independent, and an answer that arrives late is the same as no answer at all. Everything a DSP is, targeting, pacing, budgeting, creative selection, pricing, lives behind that single request-response.
## The minimum viable bid response
{
"id": "80ce30c53c16e6ede735f123ef6e32361bfc7b22",
"cur": "USD",
"seatbid": [{
"seat": "512",
"bid": [{
"id": "1",
"impid": "1",
"price": 3.75,
"adid": "314",
"adomain": ["advertiser.com"],
"crid": "creative-112",
"mtype": 1,
"adm": "…creative markup…
",
"w": 300,
"h": 250
}]
}]
}
Field by field: id must echo BidRequest.id or the exchange discards the response (loss reason 5, Invalid Auction ID). impid must match an imp.id from the request. price is CPM in the response currency, which must be one the request allowed in cur . mtype declares the markup type (1 banner, 2 video, 3 audio, 4 native) and exists so the exchange does not have to guess from the markup. adomain and crid are optional in the spec and mandatory in practice: exchanges filter bids without them (loss reasons 6 and 8).
Either put the markup inline in adm or serve it from the win notice nurl . The tradeoffs, including where ${AUCTION_PRICE} expands, are in adm versus nurl .
## What the request obliges you to honour
cur lists the currencies the exchange accepts. Bidding in anything else is invalid, and RTBlint flags it as openrtb.response.cur_not_allowed when it cross-validates a response against its request.
wseat and bseat restrict which seats may bid. Bidding from a seat that was not permitted gets the bid dropped (loss reason 104).
bcat , badv , bapp are blocklists for creative categories, advertiser domains, and promoted apps. Filtering these on your side is cheaper than being filtered on theirs.
imp.bidfloor and bidfloorcur set the minimum. Deal-backed bids clear the deal floor in imp.pmp.deals[].bidfloor , not the impression floor.
Privacy signals. regs.gdpr , user.consent , regs.gpp and gpp_sid , regs.coppa , and device.lmt govern what you may do with the data in the request. See the privacy signals reference .
Media type. Bid on what was offered: video markup against an imp that only carried banner is rejected (loss reason 204), and RTBlint reports openrtb.bid.mtype_not_offered .
## Latency is the hard requirement
The spec is explicit that tmax includes internet latency, so your compute budget is what remains after the wire. Three consequences worth designing for from day one: deploy per region so the round trip is short, enforce an internal deadline that returns a no-bid instead of a late bid, and measure the tail rather than the mean, because timeouts live at p99. The debugging sequence is in tmax and bidder timeouts .
Two transport settings pay for themselves immediately: connection reuse (keep-alive or HTTP/2), which removes a TLS handshake from every auction, and gzip, which cuts the bytes on a payload that is mostly repetitive JSON.
## An integration checklist
Parse defensively. Unknown fields must be ignored, not rejected: exchanges add extensions and newer snapshots constantly. See what happens on a version mismatch .
Decide the version you accept and what you do with x-openrtb-version , then check real traffic matches it.
Return 204 for no bid; return 200 with nbr while integrating so the partner can see your reasons. Codes are in no-bid reason codes .
Implement burl handling if you bill on the billing notice rather than the win notice, and expect lurl feedback for pricing.
Validate both directions in CI against fixtures, including a paired request and response so id, seat, currency, deal, and media type are checked together.
Load test at the QPS the exchange expects, with the latency budget enforced.
## Testing it
Start from a known-good payload: the example payloads cover banner, video, CTV pod, native, DOOH, and privacy-heavy requests, and each opens directly in the tester . In CI, the CLI validates requests and responses with --format json so you can gate on specific rule ids, and the JSON Schemas plug into whatever validation layer your service already has. The full CI pattern is in OpenRTB validation in CI .
## Sources
OpenRTB 2.6: Transport (2.1), BidResponse (4.2.1), SeatBid (4.2.2), Bid (4.2.3)
OpenRTB implementation guide
---
# How does DOOH work in OpenRTB? · RTBlint
URL: https://rtblint.org/answers/openrtb-dooh/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## How does DOOH work in OpenRTB?
Short answer
The OpenRTB 2.6-202211 snapshot added BidRequest.dooh as a third inventory context alongside site and app, for digital out-of-home screens. It carries venue identification (venuetype, venuetypetax, referencing the OpenOOH venue taxonomy by default) plus the usual publisher, domain, and content. The structural difference from web and app is imp.qty: one DOOH play is seen by many people, so qty.multiplier states how many impressions that single ad play represents, with qty.sourcetype and qty.vendor saying who measured it. Pricing is per impression, so the multiplier changes what a bid means.
## A third distribution channel
Every OpenRTB bid request answers the question "where is this ad going to run?" with exactly one object. For two decades that meant site or app . The 2.6-202211 snapshot added a third: dooh , for screens in physical space, from airport panels to retail displays to roadside billboards.
The three are mutually exclusive. Sending both app and dooh leaves a bidder with no defensible way to price the impression, which is why RTBlint treats it as an error rather than a warning.
## The dooh object
Field Type Meaning
id string, recommended Exchange-specific identifier for the screen or DOOH network
name string Human-readable name of the screen or venue
venuetype string array Venue classification, such as transit.airports
venuetypetax integer, default 1 Which taxonomy venuetype uses; 1 is the OpenOOH Venue Taxonomy
publisher , domain , keywords , content objects and strings The same seller and content metadata web and app requests carry
Note what is missing: no page , no bundle , no user identity worth speaking of. A DOOH request describes a place, not a person, which is why it is one of the few programmatic channels that is structurally low-signal for privacy purposes.
## The part that surprises bidders: imp.qty
Web and app assume one impression per ad. DOOH does not: one play on a screen in an arrivals hall is seen by whoever is standing there. OpenRTB models that with the Qty object on the impression.
"imp": [{
"id": "1",
"banner": { "w": 1080, "h": 1920, "pos": 7 },
"qty": {
"multiplier": 42.0,
"sourcetype": 1,
"vendor": "geopath.org"
}
}]
multiplier is required and is a float: it is the number of impressions this one play represents, and it can be below 1 for a screen with low expected audience. sourcetype is recommended and names the class of measurement behind the number, using the AdCOM DOOH Multiplier Measurement Source Types list. vendor is required when sourcetype indicates a third-party measurement vendor.
Because the price on a bid is still a CPM, the multiplier is what turns a bid into a cost per play. And because the delivered audience may differ from the estimate at auction time, the notice URLs carry ${AUCTION_MULTIPLIER} , which expands to the total quantity of impressions actually won. See the macro reference .
## What else changes for a bidder
Device. device.devicetype 8 marks an out-of-home device, and device.geo is the fixed position of the screen. There is no ifa , no user agent worth parsing, and no meaningful user.eids .
Creative. Screens are frequently portrait and very large, so banner.w and h land far outside display norms. Video DOOH is usually short, muted, and non-skippable, which constrains video.maxduration , playbackmethod , and skip .
No clicks. There is nothing to click, so performance measurement runs on exposure and attribution rather than click-through, and imp.clickbrowser is meaningless.
Timeouts. Screen loops are scheduled in advance, so DOOH tmax values are often more generous than web display.
## Check a DOOH request
The DOOH example payload is a complete, valid request with a venue type and a quantity multiplier, and it opens directly in the tester . The most common failures on real DOOH traffic are a missing qty.multiplier , a venuetype string that does not exist in the taxonomy named by venuetypetax , and requests that still send site or app alongside dooh from a pre-2.6 code path.
## Sources
OpenRTB 2.6: DOOH (3.2.32), Qty (3.2.31), Imp (3.2.4)
OpenRTB 2.6-202211 release notes
AdCOM 1.0: DOOH Venue Taxonomies, DOOH Multiplier Measurement Source Types, Device Types
---
# How do audio ads work in OpenRTB? · RTBlint
URL: https://rtblint.org/answers/openrtb-audio-ads/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## How do audio ads work in OpenRTB?
Short answer
Audio inventory is offered through imp.audio, a sibling of imp.video with its own object definition. Only mimes is required; the recommended set is minduration, maxduration, protocols, and startdelay, which distinguishes pre-roll, mid-roll, and post-roll. Creatives are VAST: DAAST was folded into VAST 4.1 and later, so the protocols list is the same creative subtype list video uses. Streaming audio uses the same pod fields as CTV (poddur, podid, rqddurs, slotinpod, mincpmpersec), and audio-specific fields cover feed type, whether the ad is stitched server-side, volume normalisation, and companion display units.
## Audio is its own impression object
Programmatic audio, streaming music, radio simulcast, and podcasts, is sold through imp.audio . It sits alongside banner , video , and native on the impression, and like them it can be combined: an impression that carries both audio and banner is offering an audio ad with a companion display unit.
A bid on an audio impression sets mtype to 3, and the markup in adm is VAST XML. If the exchange is going to check that the markup matches what was offered, and most do, an audio bid returning display markup is dropped with loss reason 204.
## The fields, and which ones you cannot skip
Field Status What it decides
mimes Required Which audio formats the player accepts
minduration , maxduration Recommended The length window the creative must fall inside
protocols Recommended Accepted creative subtypes: VAST versions and legacy DAAST
startdelay Recommended Pre-roll (0), mid-roll at a known offset (>0), generic mid-roll (-1), generic post-roll (-2)
feed Optional Music service, broadcast simulcast, podcast, from the AdCOM Feed Types list
stitched Optional Whether the ad is inserted server-side into the stream
nvol Optional Volume normalisation mode applied to the stream
companionad , companiontype Optional Display units shown alongside the audio ad, described as Banner objects
podid , poddur , rqddurs , slotinpod , maxseq , mincpmpersec , durfloors Optional Ad break structure and duration-based pricing, identical in shape to video
## A minimal audio impression
"imp": [{
"id": "1",
"audio": {
"mimes": ["audio/mp4", "audio/mpeg"],
"minduration": 10,
"maxduration": 30,
"protocols": [7, 8],
"startdelay": -1,
"feed": 3,
"stitched": 1,
"companiontype": [1, 2]
},
"bidfloor": 18.0,
"bidfloorcur": "USD"
}]
This says: a mid-roll slot in a podcast, ten to thirty seconds, VAST 4.0 or its wrapper, stitched server-side, companion static or HTML resources accepted, floor of $18 CPM. startdelay of -1 is the generic mid-roll value, used when the exact position in the stream is not known at request time; -2 is generic post-roll.
## What is different about the surrounding request
Context is usually app. Streaming audio lives in mobile apps, smart speakers, and car head units, so app plus device.devicetype and device.ifa carry more weight than any page-level signal.
Content metadata matters more. The Content object's artist , album , isrc , series , and genre fields exist for exactly this channel, and podcast buyers target on them.
No viewability. Audio has no visual surface, so measurement is completion-based. Companion banners are the only visual inventory, and they may never render on a screenless device.
Duration pricing is common. durfloors and mincpmpersec apply to imp.audio exactly as they do to video. See bid floors .
## The mistakes that break audio requests
Three recur. Copying a video builder and leaving visual fields behind produces openrtb.field.undefined for things like plcmt or linearity under audio , which do not exist there. Omitting mimes makes the impression unbiddable and trips openrtb.field.required . And declaring pod fields such as mincpmpersec without any pod context produces a warning, because duration-based pricing with no declared break structure is almost always a builder bug. Paste a real audio request into the tester to see which applies. Pod mechanics are covered in CTV and ad pods , and the field-by-field version of this page is the Audio object reference .
## Sources
OpenRTB 2.6: Audio (3.2.8), Content (3.2.16), DurFloors
IAB Tech Lab VAST, which absorbed DAAST from 4.1
AdCOM 1.0: Creative Subtypes - Audio/Video, Feed Types, Volume Normalization Modes
---
# What is ID bridging in programmatic advertising? · RTBlint
URL: https://rtblint.org/answers/what-is-id-bridging/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What is ID bridging in programmatic advertising?
Short answer
ID bridging is populating a device or user identifier in a bid request with one that was not actually observed on that impression: reusing a stale IFA, filling device.ifa on inventory that cannot legitimately carry one, or passing a probabilistic household match as if it were deterministic. The buyer sees a targetable, cappable identifier and pays accordingly; what it bought was a guess. No validator can detect it from a single payload, but the EID provenance fields added in OpenRTB 2.6-202409 (inserter, matcher, mm) plus consistency between device.ifa, lmt, and dnt make the origin of an ID inspectable.
## What the practice is
A bid request is a set of claims about one impression opportunity. Some of those claims are structural (this is a 1080 by 1920 screen), some are contextual (this is a sports app), and some are about who is on the other end: device.ifa , user.id , user.buyeruid , and the extended identifiers in user.eids .
ID bridging is populating that last category with an identifier that was not observed on this impression. Common shapes: reusing an identifier seen on a different device in the same household, carrying a stale identifier forward long after it was collected, or filling device.ifa on inventory that structurally cannot produce one. The request stays valid. The buyer's model of the world does not.
## Why it pays
Addressable inventory clears higher than anonymous inventory. A CTV impression with a usable device identifier can be targeted to a segment, capped against previous exposures, and attributed to an outcome, so it commands a premium over the same impression sold blind. Anyone in the middle who can attach an identifier captures that premium, and the cost of being wrong lands on the buyer's measurement rather than on the seller's invoice.
That asymmetry, easy to do, hard to detect, valuable when undetected, is what makes this a structural problem rather than a matter of a few bad actors.
## The fields that make provenance checkable
Field Since What it should tell you
user.eids[].source 2.6 The canonical domain of the ID provider, the namespace for the value
user.eids[].uids[].atype 2.6 Agent type: which kind of agent the ID was observed on
user.eids[].inserter 2.6-202409 The entity that inserted the ID into the request
user.eids[].matcher 2.6-202409 The entity that performed the match, which is often not the inserter
user.eids[].mm 2.6-202409 ID match method, from the AdCOM ID Match Methods list
device.ifa , device.lmt , device.dnt 2.x The platform identifier and the user's tracking preference
The 2.6-202409 snapshot exists precisely because buyers asked to know how an identifier was derived. An eids entry that names an inserter, a matcher, and a match method is making an auditable claim. One that supplies a bare id and nothing else is asking to be trusted. Field-level detail is in OpenRTB user identity: eids and buyeruid .
## What you can actually check
Structural validity. Every eids entry has a source and a non-empty uids array, atype and mm hold values defined in the AdCOM lists rather than invented integers, and the whole block is under user.eids rather than the pre-2.6 user.ext.eids path. RTBlint reports these as openrtb.value.invalid , openrtb.field.moved , and openrtb.type.mismatch .
Internal consistency. A populated device.ifa alongside lmt set to 1 is a contradiction: the user asked not to be tracked and an identifier arrived anyway.
Plausibility at fleet scale. Identifier cardinality per app bundle, churn rate per supply path, and the share of requests carrying an ID on device types that rarely expose one. Bridging shows up as a distribution anomaly across millions of requests, never as a single bad payload.
Path accountability. Correlate the anomaly with source.schain nodes to find which intermediary introduces it, then treat it as a supply path decision.
## The honest limit
No payload validator, RTBlint included, can tell you whether an identifier is real. It can tell you whether the request is structurally capable of carrying provenance, and it can hold your fixtures to that standard in CI so the fields you would need for an investigation are present when you need them. Paste a request with an eids block into the tester to see what survives validation and what does not.
## Sources
OpenRTB 2.6: EID (3.2.27), UID (3.2.28), Device (3.2.18)
OpenRTB 2.6 dated snapshot releases, including 2.6-202409
AdCOM 1.0: Agent Types and ID Match Methods lists
---
# Why is my fill rate low? · RTBlint
URL: https://rtblint.org/answers/why-is-my-fill-rate-low/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## Why is my fill rate low?
Short answer
Low fill means bidders are getting your requests and passing, so the question is which filter they hit. Check in this order: floors set above the market clearing price; missing or malformed required fields, which get a request dropped before it is ever priced; stale media-type signalling, above all video.placement without video.plcmt; privacy signals that are absent or self-contradictory, which make buyers drop EEA traffic; a tmax too tight for the path; and blocked categories, advertisers, or seats. Validate one real request before reading any dashboard.
## Split the funnel before changing anything
"Low fill" describes an outcome, not a cause. Four different failures produce the same number, and each has a different fix:
The request never reaches bidders, or reaches them malformed and gets discarded before decisioning.
Bidders receive it and pass. They responded in time and chose not to bid.
Bidders bid and lose, to a floor, to a deal, or to another buyer.
A bid wins and the impression never renders, so it is never counted.
Bid rate separates stage one from stage two. No-bid reason codes separate two from three. Discrepancy between your win count and the buyer's impression count points at four. Everything below assumes you have split the funnel first.
## The order to check things
Check Symptom Where to look
Payload validity One partner reports errors while your logs look clean Validate the exact bytes you send, after serialization and compression, in the tester
Required fields Systematic no-bids across every partner id , imp[] , an imp.id per impression, a media type object on every impression
Media-type signalling Video and CTV fill far below display video.plcmt , mimes , protocols , minduration and maxduration , pod fields
Privacy signals Fill collapses on EEA or specific US state traffic regs.gdpr with user.consent , regs.gpp with regs.gpp_sid , regs.coppa
Floors Healthy bid rate, low win rate, bids clustered under the floor imp.bidfloor , bidfloorcur , deal floors, durfloors on video and audio
Timeouts Responses arrive but arrive late tmax against real round-trip latency per bidder
Blocklists Specific advertisers or categories never appear bcat , badv , bapp , wseat , bseat
Supply chain One path fills, an identical path does not source.schain versus ads.txt and sellers.json
## The failures that hide as demand problems
Some breakage produces no error anywhere. OpenRTB parsers are required to ignore fields they do not recognise, so a field in the wrong place is not rejected: it is silently dropped, and the request continues without the signal. Three examples that cost real fill:
Privacy in the old path. regs.ext.gdpr and user.ext.consent were promoted to first-class fields in 2.6. A buyer reading only the new paths sees consent as absent and stops bidding, while your logs show a perfectly well-formed request.
Deprecated video placement. video.placement without video.plcmt . Covered in placement versus plcmt .
Type drift. "at": "1" as a string instead of an integer, a boolean where the spec says integer, a single object where an array is required. Strict parsers reject the request; lenient ones coerce it unpredictably.
These are exactly what a validator finds in seconds and what dashboards never show. The catalogue is in common OpenRTB mistakes .
## Ask the bidders why
A no-bid can carry a reason. BidResponse.nbr holds a code such as 2 (invalid request), 6 (unsupported device), 8 (unmatched user), 12 (ads.txt authorization violation), or 16 (incomplete supply chain), and the full table is in no-bid reason codes . Not every bidder populates it, but the ones that do turn a guessing exercise into a lookup. A concentration of code 2 across partners is a payload problem, not a pricing one.
## A ten-minute diagnostic
Capture one real bid request for an affected placement, exactly as sent.
Run it through the tester against the OpenRTB version your partners actually use, and fix every error before reading anything else.
Compare the request against a known-good example of the same media type, field by field, looking for what is absent rather than what is wrong.
Segment fill by bidder, by media type, by geo, and by device to localise the drop.
Only then move floors, and move them one variable at a time.
Put the fixed request in CI as a fixture so the regression cannot come back: validation in CI .
## Sources
OpenRTB 2.6: BidRequest (3.2.1), Imp (3.2.4), Regs (3.2.3), BidResponse.nbr (4.2.1)
OpenRTB implementation guide: video signalling and pods
---
# Is bidstream data personal data under GDPR? · RTBlint
URL: https://rtblint.org/answers/is-bidstream-data-personal-data/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## Is bidstream data personal data under GDPR?
Short answer
For a typical bid request, yes. GDPR Article 4(1) counts online identifiers as personal data, and an ordinary OpenRTB request carries several: device.ifa or cookie-derived ids in user.eids, device.ip or ipv6, geo coordinates, and the page or app being viewed, all attached to one browsing event. In 2024 the Court of Justice of the EU held in C-604/22 that even the TCF consent string is personal data when it can be combined with an IP address. This is engineering guidance, not legal advice.
## Why the answer is usually yes
GDPR Article 4(1) defines personal data as information relating to an identified or identifiable natural person, and it names online identifiers explicitly as a way a person can be identified. A standard OpenRTB bid request carries several at once, all tied to a single moment of browsing:
Path What it carries
device.ifa The platform advertising identifier for the device
device.ip , device.ipv6 Network address, often stable enough to identify a household
device.geo.lat , lon , type Location, sometimes precise to a few metres
user.id , user.buyeruid Exchange-side and buyer-side user identifiers from cookie syncs
user.eids[] Extended identifiers, frequently derived from a hashed email
site.page , app.bundle , content.* What the person is reading, watching, or listening to right now
Any one of these might be argued about in isolation. Together, in one message, about one person, at one instant, they are what the definition was written to cover. The field-by-field breakdown is in what is bidstream data .
## What the courts and regulators have said
The most cited decision is the Belgian Data Protection Authority's 2022 finding against IAB Europe's Transparency and Consent Framework, followed by the Court of Justice of the EU in Case C-604/22 in March 2024. The Court held that a TC String is personal data when it can be combined with an identifier such as an IP address, and that IAB Europe is a joint controller for that processing.
Note the shape of that reasoning, because it generalises: the string alone is not obviously about a person, but it travels next to an IP address, and the combination makes the person identifiable. The same logic applies to most of the fields above, which is why arguments of the form "this single field is not personal data" rarely survive contact with how a bid request is actually structured.
## What the protocol gives you to work with
OpenRTB does not decide legality; it carries the declarations. The signals that matter, with their exact paths:
regs.gdpr (0 or 1): whether the request is subject to GDPR, first-class since 2.6, previously regs.ext.gdpr .
user.consent : the TCF consent string, first-class since 2.6, previously user.ext.consent .
regs.gpp and regs.gpp_sid : the Global Privacy Platform string and the section ids it contains. These two are a pair; one without the other is unusable, which is why RTBlint flags openrtb.regs.gpp_without_gpp_sid and openrtb.regs.gpp_sid_without_gpp .
regs.coppa , device.lmt , device.dnt : child-directed treatment and the user's tracking preference.
Full paths, versions, and the migration from the ext locations are in the privacy signals reference .
## The engineering consequences
Correctness of the signal is a compliance artefact. A request that says regs.gdpr is 1 with no user.consent , or a GPP string with no section ids, does not fail safe: it fails ambiguously, and every downstream recipient resolves the ambiguity its own way.
Old paths still leak. Sending consent only at user.ext.consent means partners reading the 2.6 path see no consent at all. RTBlint reports this as openrtb.field.moved .
Minimisation is a field-level decision. Precise coordinates, full IPs, and identifiers with no legitimate downstream use are the ones that draw scrutiny. Coarsening them is a change to the payload, which means it is testable.
Every recipient is a decision. A bid request is broadcast to many bidders at once, so the number of parties receiving the data is a design choice, and it is visible in source.schain and your partner list.
Validate the privacy block on real traffic in the tester , and keep a fixture per market in CI so a refactor cannot silently drop a consent field.
## Scope of this answer
This page describes how the fields work and what has been decided publicly. It is engineering guidance for people building bid requests, not legal advice, and it does not address whether any particular processing has a valid legal basis. That question depends on your role, your jurisdiction, and facts that are not in the payload.
## Sources
GDPR Article 4(1): definition of personal data
Court of Justice of the EU, Case C-604/22, IAB Europe v Gegevensbeschermingsautoriteit
OpenRTB 2.6: Regs (3.2.3), User (3.2.20), Device (3.2.18)
IAB Tech Lab Global Privacy Platform
---
# What does User-Agent deprecation mean for OpenRTB? · RTBlint
URL: https://rtblint.org/answers/openrtb-user-agent-deprecation/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## What does User-Agent deprecation mean for OpenRTB?
Short answer
The User-Agent header was not removed; it was frozen. Chrome's UA reduction replaced the informative parts of the string (exact browser version, platform version, device model) with fixed placeholder values, so parsing device.ua now yields stale or generic answers. OpenRTB 2.6 added device.sua, a structured UserAgent object populated from User-Agent Client Hints headers, carrying browser brands and versions, platform, mobile preference, architecture, bitness, and model as separate fields. When both are present, the spec says to trust sua and ignore ua.
## What was actually deprecated
The phrase “User-Agent deprecation” describes an information reduction, not a removal. Chrome rolled out UA reduction between 2022 and 2023: the browser version in the string is frozen at the major version (a Chrome 138 string reads Chrome/138.0.0.0 ), the reported platform version no longer moves, and the Android device model is replaced by the single letter K . Safari froze parts of its string years earlier. The header still arrives on every request and exchanges still copy it into device.ua ; it just answers fewer questions than it used to.
For a bidder that means any pipeline still deriving device type, model, or exact browser version by parsing device.ua is consuming placeholder values on a large share of traffic and treating them as measurements.
## The structured replacement: device.sua
Browsers that reduced the string expose the same information through User-Agent Client Hints : low-entropy headers ( Sec-CH-UA , Sec-CH-UA-Mobile , Sec-CH-UA-Platform ) sent by default, and high-entropy headers (full version list, model, platform version, architecture, bitness) available on request. OpenRTB 2.6 added device.sua , a UserAgent object that carries those values as structured fields instead of a string to parse:
Field Type Populated from
browsers array of BrandVersion Sec-CH-UA-Full-Version-List : each entry is a brand plus a version array in descending order (major, minor, micro)
platform BrandVersion Sec-CH-UA-Platform and Sec-CH-UA-Platform-Version
mobile integer Sec-CH-UA-Mobile : 1 if the agent prefers mobile-optimised content
architecture , bitness string Sec-CH-UA-Arch and Sec-CH-UA-Bitness (high entropy)
model string Sec-CH-UA-Model : the real device model the reduced string no longer carries
source integer, default 0 How this object was built (see below)
sua has been part of the Device object since the first OpenRTB 2.6 release. The blog post on the sua object walks the history in more detail.
## What the spec tells each side to do
The 2.6 Device definition is explicit in both directions. Exchanges should keep populating ua with the raw User-Agent string whenever the device provides one, for backwards compatibility, and should never put an inferred or approximated string there. Bidders should do the opposite of the old habit: when both fields are present, rely on sua for device and browser detection and ignore ua , because the string may be frozen or reduced while the structured object is not.
## sua.source is the data-quality label
Value Meaning What it implies
0 Unspecified or unknown No provenance claim at all
1 Client Hints, low-entropy headers only Brand, platform, and mobile flag are real; no model or full version
2 Client Hints with high-entropy headers The richest case: full version list, model, architecture
3 Parsed from the User-Agent string Inherits the reduced string's placeholders; treat with the same suspicion
The values come from the AdCOM User-Agent Source list. A sua with source: 3 on Chrome traffic is a repackaged reduced string, not new information, which is why the field is worth reading before trusting the rest of the object.
## Checking what your requests actually say
Paste a live bid request into the tester to see how the device object validates, and use the bid request reference for the surrounding fields. Consistency is worth a manual look too: a request whose sua.mobile says desktop while devicetype claims a phone is telling you one of its sources is stale.
## Sources
OpenRTB 2.6: Device (3.2.18), UserAgent (3.2.29), BrandVersion (3.2.30)
AdCOM 1.0: List: User-Agent Source
User-Agent Client Hints specification (WICG)
Chromium: User-Agent reduction plan and frozen string formats
---
# Where is the official OpenRTB spec? · RTBlint
URL: https://rtblint.org/answers/where-is-the-openrtb-spec/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Answers
## Where is the official OpenRTB spec?
Short answer
The current OpenRTB 2.x specification is the file 2.6.md in IAB Tech Lab's openrtb2.x repository on GitHub, where main always holds the latest dated release and each release is tagged 2.6-YYYYMM. OpenRTB 3.0 lives in a separate repository (openrtb), with its domain model AdCOM in a third (AdCOM). Versions 2.5 and earlier were published as PDFs, linked from iabtechlab.com. Loss reason codes and other community extensions sit under extensions/community_extensions/ inside openrtb2.x.
## The map
You want It lives at
The current 2.x spec 2.6.md at the root of the openrtb2.x repository; main always holds the latest release
A specific dated release The repository's release tags , named 2.6-YYYYMM
Changes not yet released The develop branch of the same repository
OpenRTB 3.0 The separate openrtb repository
AdCOM (the object model and enum lists) The AdCOM repository
Versions 2.5 and earlier PDFs linked from IAB Tech Lab's OpenRTB page
Community extensions (loss reason codes, and more) extensions/community_extensions inside openrtb2.x
Protocol buffer definitions The proto directory inside openrtb2.x
## How the spec ships now
OpenRTB stopped being a sequence of numbered documents in late 2022. The working rule since then: the version number moves only for breaking changes, and everything additive lands as a dated release of 2.6. Each release is tagged 2.6-YYYYMM , the main branch always reflects the most recent one, and development happens on develop . So “OpenRTB 2.6” without a date is ambiguous: 2.6-202204 and 2.6-202606 differ by four years of fields. The post on the dated-snapshot era explains why the numbering stopped, and the version index tracks eighteen documented versions, seventeen with validation support, with what each one added.
## Why the spec is split across three repositories
The 2.x document defines the transaction: bid request, bid response, auction mechanics. Since 2.6 it delegates its enumerated lists (device types, creative attributes, API frameworks, placement subtypes) to AdCOM, the Advertising Common Object Model, which is versioned separately. OpenRTB 3.0 goes further and builds the whole message on AdCOM objects, which is why it lives in its own repository and is not an in-place upgrade of 2.x. The guides on what AdCOM is and 2.6 versus 3.0 cover both splits.
## Machine-readable forms
The normative spec is prose plus tables; the only official machine-readable artifact is the protobuf set in proto/ . For validation and tooling, RTBlint generates JSON Schemas for supported snapshots, listed on the JSON Schemas page , and the tester validates a pasted bid request against 17 supported versions. The 2.6-202204 archive is documented but lacks an extracted object catalog, so exact validation is unavailable. Check the April archive coverage note before choosing the 2.6-202210 baseline.
---
# OpenRTB bid request: objects and required fields · RTBlint
URL: https://rtblint.org/docs/openrtb/bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Bid request anatomy + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## OpenRTB bid request: objects and required fields
An OpenRTB bid request is one JSON object with exactly two required fields: id and a non-empty imp array. Everything else, from site to regs , is recommended or optional. This page walks every major object in the 2.6 request model and flags the fields that break auctions when they are wrong.
## Top-level BidRequest fields
The unnamed outer JSON object is BidRequest . Per the spec, attributes are required only if their omission would break the protocol, and an omitted attribute without a default means unknown. The fields you will actually handle:
id (string, required): request ID assigned by the exchange.
imp (object array, required): one entry per impression offered. Must not be empty.
at (integer, default 2): auction type. 1 is first price, 2 is second price plus. Values 500+ are exchange-specific.
tmax (integer): maximum milliseconds the exchange waits for bids, including internet latency. See tmax and timeouts .
cur (string array): allowed bid currencies as ISO-4217 alpha codes.
test (integer, default 0): 1 marks the auction as non-billable test traffic.
bcat / badv / bapp : blocked advertiser categories (per cattax ), advertiser domains, and app store IDs. Only one of acat or bcat should be present.
source , regs , ext : supply chain provenance, regulatory signals, and exchange extensions, covered below.
## A minimal valid 2.6 banner request
{
"id": "80ce30c53c16e6ede735f123ef6e3236",
"at": 1,
"tmax": 120,
"cur": ["USD"],
"imp": [{
"id": "1",
"bidfloor": 0.5,
"secure": 1,
"banner": { "w": 300, "h": 250, "pos": 1 }
}],
"site": {
"id": "102855",
"domain": "example.com",
"page": "https://example.com/article/1234",
"publisher": { "id": "8953" }
},
"device": { "ua": "Mozilla/5.0 ...", "ip": "203.0.113.7" },
"user": { "id": "55816b39711f9b5acf3b90e313ed29e5" },
"source": { "tid": "6dd7ea62-9b6b-4dc2-b0a6-1a0d21b0f962" },
"regs": { "gdpr": 0 }
}
Strictly, only id , imp , and imp[0].id plus the banner object are required here. The rest is what a real exchange sends so bidders can price the impression.
## Imp: the impression on offer
Each Imp needs an id unique within the request; the bid response references it through bid.impid . The presence of a banner , video , audio , or native subordinate declares the media type. A publisher may include several of them in one Imp, but any given bid must conform to exactly one of the offered types.
bidfloor (float, default 0): minimum bid as CPM, in bidfloorcur (default USD). See bid floors .
secure (integer): 1 means creative assets must be HTTPS. If omitted, non-secure HTTP support can be assumed.
rwdd (integer, default 0): 1 marks a rewarded placement, new in 2.6.
exp (integer): advisory seconds that may elapse between auction and impression.
## Banner
w and h give one exact size in device-independent pixels. The recommended format array of Format objects lists all permitted sizes and is the modern replacement for the removed wmax / hmax fields. pos takes an AdCOM placement position value, api lists supported frameworks (MRAID, OMID), and battr blocks creative attributes. All of these enumerations live in AdCOM 1.0 lists since 2.6.
## Video
mimes is the only required Video field, an array like ["video/mp4"] . plcmt carries the placement type; placement was deprecated in the 2.6-202303 update and RTBlint flags it with openrtb.field.deprecated . minduration (default 0) and maxduration are recommended and mutually exclusive with rqddurs . protocols lists supported VAST versions, startdelay distinguishes pre-, mid-, and post-roll, and skip flags a skippable player. The 2.6 pod fields, podid , podseq , and slotinpod , structure CTV ad breaks; see OpenRTB for CTV . Every field on the object, grouped by what it controls, is in the Video object reference .
## Audio
Audio mirrors Video: mimes is required, minduration , maxduration , and protocols are recommended, and the same pod trio ( podid , podseq , slotinpod ) applies. Audio-specific fields include feed (feed type) and stitched (1 if the ad is server-stitched into the content stream). Full field list at the Audio object reference .
## Native
The request field is required and is a JSON-encoded string, not a nested object: the Native Ad request payload is serialized and escaped inside the OpenRTB JSON. Sending it as an object is one of the most common integration bugs. ver names the Native Ads spec version in use. Details on the payload itself: native ads in OpenRTB .
## Site vs App
A request must not contain more than one of site , app , or dooh . Site carries id (recommended), domain , page , a publisher object, and content . App swaps page for bundle (the app store ID) and storeurl . At minimum, provide a site ID or page URL; bidders that cannot tell where the impression runs rarely bid well.
## Device
ua is the raw user agent; sua is the structured UserAgent object added for a post-User-Agent-reduction world, and is the preferred source when both are present. ip (or ipv6 ) and the recommended geo object locate the device. ifa is the OS-provided advertising ID in the clear, devicetype is an AdCOM device type value, and the recommended lmt flag signals limit ad tracking (1 means tracking must be limited).
## User
id is the exchange-specific user ID and buyeruid the bidder-specific one from cookie sync. eids is a first-class array of extended identifier objects for third-party identity providers. consent holds the TCF consent string when GDPR applies; like regs.gdpr , it moved out of ext into the core object in 2.6.
## Source and Regs
source.fd says who makes the final sale decision (0 exchange, 1 upstream), source.tid is the transaction ID shared by every participant, and source.schain is the SupplyChain object, promoted from source.ext.schain in 2.6. RTBlint reports the old path with openrtb.field.moved . See supply chain in OpenRTB .
regs carries coppa , gdpr (top-level since 2.6), us_privacy , and the GPP pair gpp / gpp_sid added in 2.6-202211. Full walkthrough: privacy signals in OpenRTB .
## Required vs recommended vs optional
Field Status What trips people up
id Required Request ID assigned by the exchange.
imp Required, 1+ entries An empty array breaks the protocol.
imp.id Required Unique within the request; bids reference it via impid.
video.mimes Required (when video present) The only required field inside Video.
native.request Required (when native present) A JSON-encoded string, not a nested object.
site / app / dooh Recommended, at most one Sending two of them is a spec violation.
at Optional, default 2 1 = first price, 2 = second price plus.
imp.bidfloor Optional, default 0 CPM in bidfloorcur, which defaults to USD.
source.tid Recommended Transaction ID common across all participants.
device.geo, device.lmt Recommended Optional by type, elevated for business importance.
regs.gdpr Optional Top-level Regs field in 2.6; previously regs.ext.gdpr.
## FAQ
## Which fields are required in an OpenRTB bid request?
Only two top-level fields are technically required: id and imp with at least one entry. Each Imp needs its own id plus at least one of banner, video, audio, or native. Within those, video.mimes and native.request are required. Everything else is recommended or optional, though exchanges and bidders often enforce more.
## Can a bid request contain both site and app?
No. The OpenRTB 2.6 spec states a bid request must not contain more than one of a Site, App, or DOOH object. Site describes browser inventory, App describes application inventory, and DOOH describes digital out-of-home inventory.
## Can one Imp offer multiple media types?
Yes. A publisher can include banner, video, audio, and native objects in the same Imp at its discretion. Any given bid, however, must conform to exactly one of the offered types.
## Is video.placement still valid in OpenRTB 2.6?
It is deprecated. The 2.6-202303 update deprecated video.placement in favor of video.plcmt, which uses the Plcmt Subtypes - Video list in AdCOM 1.0. Many exchanges still read both during the transition, but new integrations should send plcmt.
## Validate it
Paste any request into the bid request tester to check it against a tracked OpenRTB 2.6 snapshot: missing required fields, unknown fields ( openrtb.field.undefined ), deprecated and moved paths, and type mismatches, each with a JSON path. The same engine runs in the Rust CLI for CI. For the other half of the transaction, see the bid response .
---
# OpenRTB bid response: seatbid, bid, and win notices · RTBlint
URL: https://rtblint.org/docs/openrtb/bid-response/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Bid response anatomy + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## OpenRTB bid response: seatbid, bid, and win notices
A bid response is three nested layers: BidResponse echoes the request id , each SeatBid groups bids under a buyer seat, and each Bid offers a CPM price for one impid . Around that sit the notice URLs ( nurl , burl , lurl ) and the HTTP 204 convention for not bidding.
## Top-level BidResponse
id is required and must carry the ID of the bid request this answers; it exists for logging and correlation. If the bidder wants its own tracking ID, that goes in the optional bidid , which the exchange can echo back as ${AUCTION_BID_ID} in the win notice.
seatbid (object array): 1+ entries required if a bid is to be made.
cur (string, default "USD"): bid currency as an ISO-4217 alpha code. It must be one the request permitted in cur .
customdata (string): base85 cookie-safe data the bidder can ask the exchange to store.
nbr (integer): reason for not bidding, from the No-Bid Reason Codes list kept in OpenRTB 3.0. Decoded values: OpenRTB no-bid reason codes .
## SeatBid
A response can contain multiple SeatBid objects, each bidding on behalf of a different buyer seat. seat is the seat ID (advertiser or agency) coordinated with the exchange in advance, and bid is a required array of 1+ Bid objects; multiple bids may target the same impression. group (default 0) matters for multi-impression requests: 1 means the seat only wants the impressions if it can win them all as a group.
## The Bid object
Three fields are required: id (bidder-generated, for logging), impid (must match an imp.id from the request), and price (a float expressed as CPM; the spec recommends integer math such as BigDecimal when handling currency). The rest describe the creative and how to serve and account for it:
adm : the ad markup itself (HTML, a VAST document, or a native payload), served if the bid wins. When that string is VAST, the JSON check stops at the envelope. The document the player reads is a separate contract .
nurl / burl / lurl : win, billing, and loss notice URLs, covered below.
adomain : advertiser domains for block-list checks, e.g. ["ford.com"] . Exchanges can mandate a single entry.
cid and crid : campaign and creative IDs for ad quality review.
w / h : creative size in device-independent pixels.
mtype : markup type added in 2.6 (1 banner, 2 video, 3 audio, 4 native) so the exchange can tie the bid to the right Imp sub-object.
dealid : references deal.id from the request for private marketplace bids.
exp : advisory seconds the bidder will wait between auction and impression.
apis : supported API frameworks; the singular api field is deprecated in 2.6 in its favor.
## Markup: adm vs the win notice
OpenRTB allows two delivery paths. Markup served in the bid puts the creative in adm , which reduces the risk of forfeiting a won impression to an HTTP failure. Markup served on the win notice omits adm ; the exchange calls nurl and the response body must contain the markup and only the markup. If both are present, adm takes precedence. Either way, the exchange substitutes macros in the markup before delivery.
## Win, billing, and loss notices
Field Fired Notes
nurl When the bid wins the auction Not necessarily a delivered, viewed, or billable ad. Its response body can carry the ad markup.
burl When the win becomes billable Per exchange policy, typically on delivery or view. Best practice is firing it server-side, close to where revenue is booked.
lurl When the bid is known to have lost Carries ${AUCTION_LOSS} with a loss reason code. Exchanges may withhold clearing prices by blanking ${AUCTION_PRICE}.
Before calling any notice URL, the exchange replaces substitution macros: ${AUCTION_ID} , ${AUCTION_IMP_ID} , ${AUCTION_PRICE} (the clearing price), ${AUCTION_MBR} , ${AUCTION_LOSS} , and ${AUCTION_MIN_TO_WIN} among others. Unknown optional values are replaced with an empty string, and "AUDIT" is the best-practice stand-in when rendering for test purposes. Full list and encoding rules: OpenRTB substitution macros .
## No bid: HTTP 204 and nbr
To pass on an auction, return an empty body with HTTP 204. To tell the exchange why, return a minimal BidResponse with just id and an nbr code instead. Exchanges monitor no-bid rates either way, so a malformed request that silently 204s everywhere is lost revenue; that is the failure mode common OpenRTB mistakes catalogs.
## A short valid response
{
"id": "80ce30c53c16e6ede735f123ef6e3236",
"bidid": "resp-8f2a01",
"cur": "USD",
"seatbid": [{
"seat": "512",
"bid": [{
"id": "bid-0001",
"impid": "1",
"price": 9.43,
"adm": "...markup...
",
"adomain": ["advertiser.com"],
"cid": "campaign-111",
"crid": "creative-112",
"mtype": 1,
"w": 300,
"h": 250,
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}"
}]
}]
}
Note impid matching the request's imp[0].id , the CPM price , and the billing macro left literal for the exchange to substitute.
## FAQ
## How does a bidder signal no bid in OpenRTB?
The standard option is an empty response body with HTTP 204 No Content. If the bidder wants to tell the exchange why, it returns a bare BidResponse object with a reason code in the nbr field, using the No-Bid Reason Codes list maintained in OpenRTB 3.0.
## If a bid contains both adm and win notice markup, which is served?
The adm contents take precedence. Per the 2.6 spec, if both the adm attribute and the win notice return contain markup, adm wins. When serving markup on the win notice instead, the nurl response body must contain the ad markup and nothing else, and adm must be omitted.
## Does BidResponse.id have to match the request?
Yes. BidResponse.id is required and is defined as the ID of the bid request to which this is a response. The bidder-generated tracking ID goes in bidid instead.
## Is bid.price gross or net, and per what unit?
price is expressed as CPM, the cost per thousand impressions, even though the transaction is for a single impression. The currency is BidResponse.cur, which defaults to USD and must be one the request allowed via cur.
## Validate it
RTBlint validates OpenRTB bid requests today; bid response validation is on the roadmap. Check the request side of your integration in the bid request tester or with the CLI ( rtblint validate request.json ), and see what RTBlint checks for the rule families involved.
---
# OpenRTB enumerated lists reference · RTBlint
URL: https://rtblint.org/docs/openrtb/enums/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Enum reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## OpenRTB enumerated lists reference
The integer codes an OpenRTB 2.6 bid request uses for auction type, device type, connection type, video placement, playback, API frameworks, creative attributes, protocols, position, and linearity, with the exact values from the AdCOM 1.0 lists the 2.6 spec references.
## Where the lists live now
As of OpenRTB 2.6, the request-side enumerated lists are kept in the AdCOM 1.0 specification (no-bid and loss reason codes live in the OpenRTB 3.0 document) so they can change without a new OpenRTB release. Field tables in 2.6 say things like "Refer to List: Device Types in AdCOM 1.0". In OpenRTB 2.5 and earlier the same lists sat in section 5 of the spec itself, so older integration docs cite section numbers (5.21 Device Types, 5.9 Video Placement Types) for values that are now AdCOM lists. The values below reflect OpenRTB 2.6 with the current AdCOM lists, including the 2.6-202303 plcmt update. Where a list reserves 500 and above for exchange-specific or vendor-specific values, the table says so. See OpenRTB versions for what changed when.
## Auction type (at)
BidRequest.at , integer, default 2. This one is defined in the OpenRTB spec itself, not AdCOM.
Value Name Meaning
1 First Price Winner pays what they bid.
2 Second Price Plus Winner pays just above the second-highest bid; the spec default.
500+ Exchange-specific Custom auction types agreed with buyers.
## Device type (device.devicetype)
AdCOM List: Device Types, derived from the TAG Inventory Quality Guidelines. Getting this right matters most for CTV requests , where buyers filter on devicetype: 3 .
Value Name Meaning
1 Mobile/Tablet - General Interchangeable mobile class when 4 or 5 is unknown.
2 Personal Computer Desktop and laptop browsers.
3 Connected TV Smart TVs; the CTV signal exchanges key on.
4 Phone Specifically a phone, more precise than 1.
5 Tablet Specifically a tablet, more precise than 1.
6 Connected Device Consoles, streaming boxes and similar non-TV devices.
7 Set Top Box Operator set top boxes.
8 OOH Device Digital out-of-home screens.
## Connection type (device.connectiontype)
AdCOM List: Connection Types.
Value Name
1 Ethernet; Wired Connection
2 WIFI
3 Cellular Network - Unknown Generation
4 Cellular Network - 2G
5 Cellular Network - 3G
6 Cellular Network - 4G
7 Cellular Network - 5G
## Video placement: plcmt and the legacy placement
video.plcmt uses AdCOM List: Plcmt Subtypes - Video, added alongside the 2.6-202303 update that deprecated video.placement . The two lists are not a rename: the old five values map onto four new ones with stricter definitions (sound-on is part of what makes something Instream now). Full story in placement vs plcmt , and the field reference, including which snapshot each value is actually valid in, in video.plcmt . AdCOM 1.0-202607 extended the list with 5 through 9 for the CTV Ad Portfolio formats, covered in the 202607 release notes .
## plcmt (current)
Value Name Meaning
1 Instream Sound on by default, video is the primary content.
2 Accompanying Content Player beside text or graphical content, plays on entering the viewport.
3 Interstitial No video content; takes over the viewport, cannot scroll away.
4 No Content/Standalone No video content; slideshows, feeds, sticky or floating players.
5 Pause Added in AdCOM 1.0-202607. Shown when the viewer pauses requested video content.
6 Screensaver Added in AdCOM 1.0-202607. Shown when an OS or app screensaver starts.
7 Overlay Added in AdCOM 1.0-202607. Over program content, outside the traditional break.
8 Squeezeback Added in AdCOM 1.0-202607. Content is resized to share the screen with the ad.
9 In-scene Added in AdCOM 1.0-202607. Branded elements composited into the content itself.
## placement (deprecated, 2.6-202303)
Value Name Meaning
1 In-Stream Pre-, mid-, post-roll against requested video content.
2 In-Banner Video inside display banner inventory.
3 In-Article Player loading between paragraphs of editorial content.
4 In-Feed Inside content, social, or product feeds.
5 Interstitial/Slider/Floating Always on screen while displayed.
## Playback methods (video.playbackmethod)
AdCOM List: Playback Methods. The field is an integer array, but the 2.6 spec advises relying on the first element only, since it may become a single integer in a future version.
Value Name Meaning
1 Initiates without any specific user interaction with Sound On Reworded in AdCOM 1.0-202607; was "Initiates on Page Load".
2 Initiates without any specific user interaction Sound Off by Default Reworded in AdCOM 1.0-202607; was "Initiates on Page Load".
3 Initiates on Click with Sound On
4 Initiates on Mouse-Over or cursor over with Sound On Reworded in AdCOM 1.0-202607.
5 Initiates on Entering Viewport or scrolling into view with Sound On Reworded in AdCOM 1.0-202607.
6 Initiates on Entering Viewport or scrolling into view with Sound Off by Default Reworded in AdCOM 1.0-202607.
7 Continuous Playback Player keeps playing additional media until the user stops it.
8 Initiated by user pausing content, Sound on Added in AdCOM 1.0-202607.
9 Initiated by user pausing content, Sound off Added in AdCOM 1.0-202607.
10 Initiated by idling (e.g. screensaver), Sound on Added in AdCOM 1.0-202607.
11 Initiated by idling (e.g. screensaver), Sound off Added in AdCOM 1.0-202607.
## API frameworks (banner.api, video.api, audio.api, native.api)
AdCOM List: API Frameworks. Declares what the placement supports; an API not listed is assumed unsupported.
Value Name Meaning
1 VPAID 1.0
2 VPAID 2.0
3 MRAID 1.0
4 ORMMA
5 MRAID 2.0
6 MRAID 3.0
7 OMID 1.0 Open Measurement.
8 SIMID 1.0
9 SIMID 1.1
500+ Vendor-specific codes
## Creative attributes (battr, attr)
AdCOM List: Creative Attributes, values 1 through 23 plus vendor-specific 500+. Used as battr (blocked attributes) on banner, video, audio, and native request objects, and as attr (declared attributes) on the response Bid . The commonly seen values, plus everything added in AdCOM 1.0-202607:
Value Name Meaning
1 Audio Ad (Autoplay)
2 Audio Ad (User Initiated)
3 Expandable (Automatic)
6 In-Banner Video Ad (Autoplay)
8 Pop (e.g., Over, Under, or Upon Exit)
13 User Interactive (e.g., Embedded Games)
14 Windows Dialog or Alert Style
16 Ad Provides Skip Button Pair with video.skip on the request side.
18 Responsive; Sizeless; Fluid
19 Contains advertiser QR Code Added in AdCOM 1.0-202607.
20 Support alpha channel transparency Added in AdCOM 1.0-202607.
21 Static Visual Added in AdCOM 1.0-202607. No perceptible motion, even in a video container.
22 Limited Motion (Cinemagraph) Added in AdCOM 1.0-202607. Subtle looped motion in a static composition.
23 Full-Motion Video Added in AdCOM 1.0-202607. Continuous or scene-level motion.
500+ Vendor-specific codes
## Protocols (video.protocols, audio.protocols)
AdCOM List: Creative Subtypes - Audio/Video. In practice this is the VAST version list, with each version split into an inline and a Wrapper entry. The versions a document can declare on its root are on the VAST version page .
Value Name Meaning
1 VAST 1.0
2 VAST 2.0
3 VAST 3.0
4 VAST 1.0 Wrapper
5 VAST 2.0 Wrapper
6 VAST 3.0 Wrapper
7 VAST 4.0
8 VAST 4.0 Wrapper
9 DAAST 1.0 Digital audio ad serving; audio support moved into VAST as of 4.1.
10 DAAST 1.0 Wrapper
11 VAST 4.1
12 VAST 4.1 Wrapper
13 VAST 4.2
14 VAST 4.2 Wrapper
15 VAST 4.3
16 VAST 4.3 Wrapper
## Position (pos)
AdCOM List: Placement Positions, used as pos on banner and video objects. Also IQG-derived.
Value Name Meaning
0 Unknown
1 Above The Fold
2 Locked Fixed position.
3 Below The Fold
4 Header
5 Footer
6 Sidebar
7 Fullscreen
8 Partial Screen Added in AdCOM 1.0-202607.
9 Top Left Added in AdCOM 1.0-202607.
10 Top Right Added in AdCOM 1.0-202607.
11 Frame the content Added in AdCOM 1.0-202607.
12 Double box Added in AdCOM 1.0-202607.
13 Double box with background Added in AdCOM 1.0-202607.
14 Bottom Left Added in AdCOM 1.0-202607.
15 Bottom Right Added in AdCOM 1.0-202607.
16 L shape Added in AdCOM 1.0-202607. Squeezeback geometry.
17 Reversed L shape Added in AdCOM 1.0-202607. Squeezeback geometry.
## Linearity (video.linearity)
AdCOM List: Linearity Modes. This describes the expected VAST response, not the player inventory type; that is what plcmt is for. A linear response is the creative in linear VAST , and an overlay is the creative in non-linear VAST .
Value Name Meaning
1 Linear VAST response with video assets.
2 Non-Linear (i.e., Overlay) VAST response with a banner or overlay.
## FAQ
## Where are OpenRTB enum values defined?
Since OpenRTB 2.6, the request-side enumerated lists live in the AdCOM 1.0 specification, referenced from the 2.6 field tables as AdCOM lists; no-bid and loss reason codes live in the OpenRTB 3.0 document. In OpenRTB 2.5 and earlier the same lists were section 5 of the OpenRTB document itself. Values match across the two homes; only the location changed.
## What do enum values of 500 and above mean?
Where a list says so (auction type, API frameworks, creative attributes, no-bid reasons, and others), values 500 and greater are reserved for exchange-specific or vendor-specific use. They are only meaningful to partners who agreed on them beforehand, so a validator can accept them but cannot tell you what they mean.
## Is video.placement still valid in OpenRTB 2.6?
It parses, but it was deprecated in the 2.6-202303 update in favor of video.plcmt, which uses a different four-value list. Send plcmt; keep placement only for partners that have not migrated, and never assume the two lists share meanings.
## Validate the enums you send
A devicetype of 9 or a plcmt value on the old placement list will not throw an error anywhere; it just misprices or drops your inventory. The bid request tester checks values against the documented lists and flags deprecated fields like video.placement with stable rule IDs ( openrtb.field.deprecated , openrtb.field.undefined ). The rule catalog lists every check, and the same engine runs from the CLI in CI.
---
# Privacy signals in OpenRTB: gdpr, gpp, us_privacy, coppa · RTBlint
URL: https://rtblint.org/docs/openrtb/privacy/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Privacy signals + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## Privacy signals in OpenRTB: gdpr, gpp, us_privacy, coppa
OpenRTB 2.6 carries privacy state in a handful of exact places: flags and strings on regs ( coppa , gdpr , us_privacy , gpp , gpp_sid ), the TCF consent string on user.consent , device-level signals on device.lmt and device.dnt , and identity in user.eids . Several of these moved out of ext in 2.6, which is where most integration bugs come from.
## regs.coppa
regs.coppa is an integer flag indicating whether the request is subject to the COPPA regulations established by the US FTC, where 0 = no and 1 = yes. It arrived with the Regs object itself in OpenRTB 2.2 and has kept the same path ever since, making it the oldest regulatory field in the bid request . When it is 1, buyers are expected to disable behavioral targeting, ID collection, and retargeting for the impression.
## regs.gdpr and user.consent
GDPR support entered OpenRTB in 2018 through the IAB GDPR advisory as a pair of extension fields: regs.ext.gdpr and user.ext.consent . OpenRTB 2.6 promoted both to first-class attributes, and the change log records each as "previously ext".
regs.gdpr : integer. 0 = not subject to GDPR, 1 = subject to GDPR, omission = unknown.
user.consent : string. When GDPR applies, this holds the Transparency and Consent Framework (TCF) consent string, the base64-encoded structure a CMP produces. It is a string on user , not an object, and not under regs .
A request with regs.gdpr: 1 and no user.consent tells bidders consent is unresolved; most will bid without personalization or not at all.
## regs.us_privacy
regs.us_privacy is a string carrying the IAB US Privacy string (the CCPA signal, for example "1YNN" ). Like the GDPR fields it began life as an extension, regs.ext.us_privacy , defined by the IAB CCPA/US Privacy OpenRTB extension in 2019, and became first-class in 2.6. IAB Tech Lab has since deprecated the US Privacy string in favor of the Global Privacy Platform, so treat this field as legacy: keep parsing it, but emit GPP for new work.
## regs.gpp and regs.gpp_sid
The Global Privacy Platform fields were added in the 2.6-202211 update and are the current home for consent signals across jurisdictions.
regs.gpp : string. The encoded GPP consent string, which can bundle multiple regional sections (TCF EU, TCF Canada, US national, US state strings) in one value.
regs.gpp_sid : integer array. The section ID(s) of the string that apply to this transaction. Per the spec it will generally contain one and only one value, and GPP sections 3 (header) and 4 (signal integrity) do not need to be included.
The two fields travel together. A gpp string without gpp_sid forces every bidder to guess which section governs the request, and many will discard the signal instead.
## DSA transparency: regs.ext.dsa
The EU Digital Services Act disclosure fields are defined by an IAB Tech Lab community extension and, unlike the fields above, still live under ext . On the request, regs.ext.dsa carries dsarequired (0 = not required, 1 = supported, 2 = required, 3 = required and the publisher is an online platform), pubrender (whether the publisher will render the transparency notice), datatopub (whether transparency data should be sent for audit), and a transparency array of { domain, dsaparams } objects. The bid response answers in bid.ext.dsa with behalf , paid , its own transparency array, and adrender . Check the extension document for the current shape before wiring it; it is versioned separately from OpenRTB itself.
## device.lmt and device.dnt
Two integer flags on device predate all of the regulation strings. device.dnt is the browser Do Not Track header (0 = tracking unrestricted, 1 = do not track). device.lmt is the commercially endorsed Limit Ad Tracking signal from mobile operating systems, with the same 0/1 semantics. On iOS traffic, lmt: 1 typically arrives alongside a zeroed device.ifa .
## user.eids and how privacy signals gate them
user.eids is an array of EID objects, each naming an identity source and carrying one or more uids ; 2.6 snapshots add inserter , matcher , and mm (match method, an AdCOM list ). Extended IDs are exactly the data the rest of this page regulates: if regs.gdpr is 1, IDs may only be passed for vendors with consent in user.consent ; if the GPP section or us_privacy string signals an opt-out, or coppa is 1, the array should be emptied. Sending a full eids array against an opt-out is a compliance bug that validation of structure alone will not catch, so audit the gating logic, not just the schema.
## Signal map
Signal Path First-class since What consumes it
COPPA flag regs.coppa OpenRTB 2.2 Buyers suppress behavioral targeting and restricted categories
GDPR applicability flag regs.gdpr 2.6 (regs.ext.gdpr before that) Bidders decide whether TCF consent is required
TCF consent string user.consent 2.6 (user.ext.consent before that) CMP-decoded vendor and purpose consent for every party
US Privacy (CCPA) string regs.us_privacy 2.6 (regs.ext.us_privacy before that) Buyers honor opt-out of sale; superseded by GPP
GPP consent string regs.gpp 2.6-202211 Multi-jurisdiction consent, one string, sectioned
GPP applicable sections regs.gpp_sid 2.6-202211 Tells bidders which GPP sections govern this transaction
DSA transparency regs.ext.dsa IAB community extension (2023) EU DSA disclosure requirements on request and bid
Limit ad tracking device.lmt OpenRTB 2.2 OS-level signal; buyers drop device-ID targeting
Do not track device.dnt OpenRTB 2.0 Browser header flag; same effect for web traffic
Extended IDs user.eids 2.6 (user.ext.eids before that) Identity providers; must be gated by the signals above
## Common mistakes
Sending regs.ext.gdpr or user.ext.consent in a 2.6 payload. Old SDKs and hand-rolled adapters keep the pre-2.6 paths alive; bidders reading only the first-class fields see no signal at all. RTBlint flags moved fields with openrtb.field.moved .
Sending regs.gpp without regs.gpp_sid , or the reverse. The pair is only interpretable together.
Putting the TCF consent string in regs . Consent belongs to user.consent ; regs only says whether GDPR applies.
Typing flags as strings ( "gdpr": "1" ). coppa , gdpr , lmt , and dnt are integers, and gpp_sid is an integer array. See the common OpenRTB mistakes guide for more of these.
## Frequently asked questions
## Where does the GDPR flag go in OpenRTB 2.6?
regs.gdpr, an integer where 0 means the request is not subject to GDPR, 1 means it is, and omission means unknown. The TCF consent string itself goes in user.consent. Before 2.6 both lived in extensions (regs.ext.gdpr and user.ext.consent) per the IAB GDPR advisory; 2.6 promoted them to first-class fields.
## Do I need gpp_sid if I send regs.gpp?
Yes. regs.gpp carries the encoded Global Privacy Platform string and regs.gpp_sid is the integer array of section IDs that apply to the transaction. Without gpp_sid a bidder cannot tell which jurisdiction's section governs the request. It generally contains exactly one value, and GPP sections 3 (header) and 4 (signal integrity) do not need to be listed.
## Is regs.us_privacy still used?
It is still defined in OpenRTB 2.6 and still appears in live traffic, but IAB Tech Lab has deprecated the US Privacy string in favor of GPP. New integrations should carry US state privacy signals in regs.gpp with the applicable section IDs in regs.gpp_sid, and many pipelines send both during the transition.
## Validate it
Paste a request into the bid request tester to check your privacy fields against a tracked 2.6 snapshot: moved paths like regs.ext.gdpr surface as openrtb.field.moved , unknown keys as openrtb.field.undefined , and wrong types on the flags are called out with their exact JSON path. The same checks run in CI via the CLI .
---
# OpenRTB supply chain object (schain) · RTBlint
URL: https://rtblint.org/docs/openrtb/supply-chain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Supply chain (schain) + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## OpenRTB supply chain object (schain)
The SupplyChain object lists every entity that touched a bid request on its way to the buyer, one node per reseller hop. In OpenRTB 2.6 it lives at source.schain (2.5 used source.ext.schain ). Each node requires asi , sid , and hp , and complete: 1 asserts the chain reaches all the way back to the inventory owner.
## What SupplyChain solves
A bid request rarely travels straight from publisher to buyer. It passes through header wrappers, resellers, and intermediary exchanges, and before schain existed a buyer had no machine-readable record of who those parties were or who gets paid. That opacity is what made counterfeit inventory and unauthorized reselling cheap to run. SupplyChain closes the loop with the other two IAB transparency files: ads.txt declares who may sell a publisher's inventory, sellers.json declares which accounts an advertising system pays, and schain records the actual path a specific request took. A buyer can walk the chain node by node and verify every hop against the other two.
## Where the object lives
The SupplyChain object was specified standalone in 2019, so its location depends on the OpenRTB version of the payload:
OpenRTB 2.6 : source.schain , first-class. 2.6 added SupplyChain and SupplyChainNode to the core object model (Sections 3.2.25 and 3.2.26).
OpenRTB 2.5 : source.ext.schain , per the SupplyChain object spec.
OpenRTB 2.4 and earlier : BidRequest.ext.schain .
The object shape is identical in all three locations; only the path changed. See the 2.5 vs 2.6 guide for the other fields that moved out of ext in 2.6.
## SupplyChain fields
All three attributes of the container object are required:
complete : integer. 1 if the chain contains all nodes back to the owner of the site, app, or other medium; 0 otherwise.
nodes : array of SupplyChainNode objects in order. The first node is the initial advertising system and seller ID (the inventory owner's system) in a complete chain, or the first known node in an incomplete one. The last node is the entity sending this bid request.
ver : string version of the SupplyChain spec, currently "1.0" .
## SupplyChainNode fields
Field Type Scope Meaning
asi string required Canonical domain of the advertising system (SSP, exchange, header wrapper) that bidders connect to. Same value used to identify the seller in ads.txt.
sid string required Seller or reseller account ID within that advertising system. Must match the ID used in transactions, typically publisher.id. Limit 64 characters.
hp integer required 1 if this node is involved in the flow of payment (asi pays sid, who pays the previous node). Must always be 1 in SupplyChain 1.0.
rid string optional The OpenRTB request ID of the request as issued by this seller.
name string optional Legal name of the company paid for this inventory. Omit if it already exists in the advertising system's sellers.json.
domain string optional Business domain of the entity for this node. Omit if it already exists in the advertising system's sellers.json.
Every node also allows an ext object for advertising-system specific extensions.
## A two-node example
A publisher sells through an SSP ( ssp.example ), which resells through an exchange ( exchange.example ) that sends the final bid request:
"source": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{ "asi": "ssp.example", "sid": "pub-4791", "hp": 1 },
{ "asi": "exchange.example", "sid": "reseller-102", "hp": 1, "rid": "d8f2b7a1" }
]
}
}
Node order is the payment path: ssp.example pays account pub-4791 (the publisher), exchange.example pays reseller-102 (the SSP's account), and the buyer pays the exchange.
## How buyers verify a chain
For each node, a buyer fetches https:///sellers.json and looks up the sid as a seller_id . The entry reveals the seller's name and domain and whether the account is a PUBLISHER, INTERMEDIARY, or BOTH. The first node's sid should also match a line in the publisher's ads.txt naming that asi . A chain whose nodes all resolve, in order, with the final node matching the exchange that delivered the request, is verifiable end to end. Chains that fail lookups get discounted or blocked by DSP supply-path optimization.
RTBlint can run the same lookups against a local cache with rtblint validate --resolve --cache . Layout: sellers//sellers.json , ads//ads.txt , app-ads//app-ads.txt . Nothing is fetched; populate the directory yourself.
## Common mistakes
Missing hp. The field is required and must be 1 for every node under SupplyChain 1.0. Nodes without it fail strict parsers.
complete: 1 with an unknown first hop. If you cannot name the advertising system that first handled the impression, the chain is incomplete by definition and must say complete: 0 . Overclaiming completeness is worse than admitting a gap.
schain in both the old and new paths. Requests migrated to 2.6 sometimes carry source.schain and a stale source.ext.schain copy. When they drift apart, bidders cannot tell which one to trust; send one.
sid that does not match sellers.json. Using an internal account alias instead of the transacted seller ID breaks every downstream lookup.
## Frequently asked questions
## Where does schain go in OpenRTB 2.6?
BidRequest.source.schain, as a first-class object. OpenRTB 2.5 integrations carry the same object at source.ext.schain, and the SupplyChain spec assigned BidRequest.ext.schain for 2.4 and earlier. Send it in exactly one location for the version you declare.
## What does complete=1 mean in a SupplyChain object?
complete=1 asserts the chain contains every node involved in the transaction back to the owner of the site, app, or other medium, and that the first node in the nodes array is that initial advertising system and seller ID. If any upstream hop is unknown, complete must be 0.
## Which SupplyChainNode fields are required?
asi (the advertising system's domain), sid (the seller account ID inside that system), and hp (payment involvement, always 1 in SupplyChain 1.0). rid, name, and domain are optional, and name and domain should be omitted when the data already exists in sellers.json.
## Validate it
The bid request tester checks source.schain structurally against the 2.6 spec: a chain left in the 2.5-era source.ext.schain path is flagged as openrtb.field.moved , and misspelled or unknown node fields surface as openrtb.field.undefined with the exact JSON path. The same rules run in the CLI ; the full list is in the rule catalog .
---
# AdCOM 1.0 object reference: media, placement, context · RTBlint docs · RTBlint
URL: https://rtblint.org/docs/openrtb/adcom/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · AdCOM objects + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Docs
## AdCOM 1.0 object reference
AdCOM, the Advertising Common Object Model, is IAB Tech Lab's transaction-neutral object layer: the definitions of what an ad is, where it can run, and the context around it. OpenRTB 3.0 delegates all of its domain objects to AdCOM, and OpenRTB 2.6 moved its enumerated lists there. This page maps every object group.
## The three object groups
AdCOM splits its model by question. Media objects answer what the ad is. Placement objects answer where and how it can render. Context objects answer everything around the transaction: property, device, user, and regulation. A protocol like OpenRTB 3.0 composes these into transactions; AdCOM itself defines no auction mechanics.
## Media objects: the ad
Ad : the root creative object. Carries the advertiser domain ( adomain ), categories and their taxonomy ( cat , cattax ), language, attributes, an audit trail, and exactly one of the media subtypes below.
Display : banner and rich display creatives, including DisplayPlacement -matching dimensions, markup or a structured Banner / Native payload, and API frameworks.
Video and Audio : time-based creatives, referencing the markup (typically VAST for video ) plus duration, mime types, and delivery attributes.
Audit : the creative review state a supply platform tracks: status, feedback, corrected fields, and review timestamps.
## Placement objects: where it renders
Placement : the root supply-side object. Declares the tag id, secure requirement, supported API frameworks, and exactly one of the subtype objects.
DisplayPlacement : display slots, with DisplayFormat sizes, position, and native asset requirements via NativeFormat .
VideoPlacement and AudioPlacement : time-based slots: placement subtype (the list behind OpenRTB's plcmt values), durations, skippability, playback methods, and companion support via Companion .
The AdCOM video placement subtypes list is the one OpenRTB 2.6-202303 adopted for imp.video.plcmt ; the values and their migration from the legacy placement field are covered in placement vs plcmt .
## Context objects: everything around the transaction
DistributionChannel : the abstract property, concretely a Site , App , or Dooh object, each carrying a Publisher and optional Content (with Producer , channel, and network detail).
Device : hardware, OS, connection, and identifiers, with Geo for location and provenance.
User : the audience side: ids, consent, and Data / Segment pairs for third-party audience data.
Regs : regulatory flags (COPPA, GDPR applicability), and Restrictions : the categories, advertiser domains, and attributes the seller blocks for the transaction.
## Where is the Impression object?
AdCOM deliberately has none. The impression is a transactional concept, so it stays in the transaction protocol: OpenRTB 2.x models it as imp , and OpenRTB 3.0 replaces it with Item , the unit of sale inside the request. An Item carries commercial terms (quantity, floor, deal references) and points at an AdCOM Placement through its spec field. So the 2.x imp.video becomes, in 3.0 terms, an Item whose spec holds a Placement with a VideoPlacement . The full mapping is in OpenRTB 2.6 vs 3.0 .
## AdCOM and the enum lists
Since OpenRTB 2.6, the enumerated lists (creative attributes, placement subtypes, playback methods, connection types, and the rest) live in AdCOM rather than the OpenRTB document, so both 2.6 and 3.0 share one set of definitions. The enum reference maps the lists as OpenRTB uses them, including the vendor-specific 500+ ranges.
RTBlint validates OpenRTB 3.0's transport layer and the AdCOM 1.0 objects under item.spec , bid.media , and request.context ; see the 3.0 version page for what that covers. For background on why AdCOM exists at all, read What is AdCOM .
---
# Native ads in OpenRTB: imp.native and the request string · RTBlint
URL: https://rtblint.org/docs/openrtb/native/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Native ads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## Native ads in OpenRTB
Native inventory is offered through imp.native , whose required request field is a JSON-encoded string , not an object: the markup of the separate OpenRTB Native Ads specification, serialized and embedded inside the bid request JSON. That double encoding is the classic native gotcha, on the way in and again on the way out through adm .
## imp.native in the bid request
The Native object sits alongside banner , video , and audio in the impression object and declares the media type on offer. Its fields in OpenRTB 2.6:
request (string, required): the request payload complying with the Native Ad Specification, JSON-encoded. Since Native 1.1 the payload itself is the Native Markup Request Object; the 1.0-era root native wrapper node was dropped.
ver (string, recommended): the Native Ads API version the request complies with, for example "1.2" . Declare it; parsers behave differently per version.
api and battr (integer arrays): supported API frameworks and blocked creative attributes, both drawn from AdCOM 1.0 lists as of 2.6.
Escaped, on the wire, a minimal native impression looks like this:
{
"id": "1",
"native": {
"ver": "1.2",
"request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"wmin\":300,\"hmin\":157}},{\"id\":3,\"data\":{\"type\":1,\"len\":25}}]}"
}
}
Note every quote inside request is escaped. If your serializer emits request as a bare object, strict receivers will reject the impression or silently drop native demand.
RTBlint decodes request and walks it as Native Ads 1.2: assets, unique ids, exactly one of title/img/video/data, and the required inner fields ( title.len , data.type , video mimes / protocols /durations). With the originating request supplied, native adm is paired: required asset ids must come back, and subtypes must match.
## The Native Ads spec is its own document
The OpenRTB Dynamic Native Ads API spec (currently 1.2, final July 2017) defines the markup carried inside that string. The request object declares context and plcmttype (feed, in-content, outside content, widget), an optional plcmtcnt , and a required assets array. Each asset has an id , an optional required flag, and exactly one of title , img , video , or data . The asset id is the contract: the response echoes it so the buyer's headline lands in the publisher's headline slot.
Asset Type IDs Notes
title no type IDs Headline text. Request declares len (required), recommended 25, 90, or 140.
img 1 = Icon, 3 = Main Image Asset Types list. 1.2 merged the earlier overlapping type 2 (logo) into type 1; icon is 1:1, main image has three supported aspect ratios.
data 1 = sponsored, 2 = desc, 3 = rating, 4 = likes, 5 = downloads, 6 = price, 7 = saleprice, 8 = phone, 9 = address, 10 = desc2, 11 = displayurl, 12 = ctatext Data Asset Types list; 500+ reserved for exchange-specific types.
video no type IDs Video as a native asset (not instream). Request carries mimes, minduration, maxduration, protocols, all required.
## eventtrackers vs imptrackers and jstracker
Native 1.2 replaced ad hoc tracking with a declared model. The request-side eventtrackers array states which events can be tracked ( event : 1 = impression, 2 = viewable-mrc50, 3 = viewable-mrc100, 4 = viewable-video50) and by which methods (1 = img pixel , 2 = js). The response returns matching eventtrackers entries with URLs. The older response-side imptrackers (array of pixel URLs ) and jstracker (an HTML blob) were marked to-be-deprecated in 1.2 and survive only for 1.0/1.1 compatibility. New integrations should declare and honor eventtrackers .
## The response: another JSON string, in adm
Per the Native spec, the native creative "shall be returned as a JSON-encoded string in the adm field of the Bid object", so the response is double-encoded exactly like the request. The markup inside carries ver , the assets array with values filled in, a required link object for the click destination, and optionally eventtrackers and a privacy URL. Some exchanges instead accept a direct object in a custom field (a convention the spec itself acknowledges), but the portable form is the string in adm . Bid response validation is on the RTBlint roadmap; today RTBlint validates the request side .
## Native in OpenRTB 3.0
OpenRTB 3.0 ends the double encoding. Creative structure moved into AdCOM 1.0, where a native ad is a structured ad.display.native object with asset objects defined in the same layer as the rest of the media description. There is no stringified sub-protocol; the trade-off is that 3.0 is a breaking change and most production traffic still runs 2.x. See OpenRTB versions for where 3.0 actually stands.
## Frequently asked questions
## Why is imp.native.request a string instead of a JSON object?
Because the Native Ads spec is a separate document versioned independently of OpenRTB, the core spec transports its markup opaquely: the native request is serialized to a string and embedded in the JSON bid request. OpenRTB 2.x officially supports only the JSON-encoded string form, though the Native spec notes many exchanges have implemented a direct object. Check integration docs before switching.
## What changed between Native 1.1 and 1.2?
Native 1.2 (2017) deprecated the AdUnit and LayoutID fields that 1.1 had replaced with Placement and Context, added the eventtrackers request and response objects and marked imptrackers and jstracker as to-be-deprecated, added a privacy flag in the request and a privacy URL in the response, and added assetsurl third-party ad serving. 1.1 itself (2015) dropped the root native wrapper requirement from 1.0.
## Where does the native response go in the bid?
The native creative is returned as a JSON-encoded string in the adm field of the Bid object, mirroring the request-side encoding. The Native spec notes that some implementers instead return a direct object in a separate field, which is an exchange-specific convention rather than the standard.
## Validate it
Because request is a string, a malformed native payload hides inside a structurally valid bid request, and an unescaped object where a string belongs is a type error many pipelines never log. Paste the request into the bid request tester : RTBlint checks imp.native against the 2.6 spec, reports type mismatches on request and ver with exact JSON paths, and flags unknown fields as openrtb.field.undefined . The same checks run in CI with the CLI .
---
# OpenRTB Video object: every field, grouped by what it controls · RTBlint
URL: https://rtblint.org/docs/openrtb/video/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Video object + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## The OpenRTB Video object
imp.video is the largest object in a bid request and the one most likely to be filled in from a template written years ago. Exactly one field is required. Most of the rest are optional in the schema and load-bearing in practice, because a bidder that cannot tell what your player accepts will either not bid or bid on assumptions that produce an error at render.
## The seven fields that decide whether anyone bids
Only mimes is required. The recommended set is what a buyer actually needs to select a creative, and omitting any of it converts a bid into a guess.
Field Type Status Meaning
mimes string array Required Supported content MIME types, for example video/mp4. The only required field on the object. An empty array is not a value; it means no creative can be selected.
protocols integer array Recommended Supported creative subtypes from the AdCOM Creative Subtypes list: VAST versions, and whether wrappers are accepted. Omitting it means the bidder is guessing which VAST version you parse.
minduration integer Recommended Minimum ad duration in seconds. Mutually exclusive with rqddurs.
maxduration integer Recommended Maximum ad duration in seconds. Mutually exclusive with rqddurs.
startdelay integer Recommended 0 for pre-roll, a positive number for a mid-roll at that offset in seconds, -1 for a generic mid-roll, -2 for a generic post-roll.
w integer Recommended Width of the video player in device-independent pixels.
h integer Recommended Height of the video player in device-independent pixels.
A note on protocols , since it is the most consequential omission. It carries the VAST versions you parse and whether you accept wrappers. A bidder with no protocols list will send whatever it has, and the resulting version mismatch is the single most common cause of a creative that arrives and never renders. See what happens on a version mismatch .
## Two requests that are correct
A web instream pre-roll, carrying the minimum a bidder needs to price it without guessing:
"imp": [{
"id": "1",
"video": {
"mimes": ["video/mp4", "video/webm"],
"protocols": [2, 3, 5, 6, 7, 8],
"minduration": 5,
"maxduration": 30,
"startdelay": 0,
"w": 1280,
"h": 720,
"plcmt": 1,
"placement": 1,
"linearity": 1,
"skip": 1,
"skipmin": 10,
"skipafter": 5,
"playbackmethod": [1],
"api": [7],
"battr": [13, 14]
},
"bidfloor": 4.5,
"bidfloorcur": "USD",
"secure": 1
}]
A CTV structured pod, three slots, each its own impression sharing one podid . Note rqddurs replacing the duration range, no skip , and imp.ssai sitting outside the video object:
"imp": [{
"id": "1",
"video": {
"mimes": ["video/mp4"],
"protocols": [7, 8],
"rqddurs": [15, 30],
"startdelay": -1,
"w": 1920,
"h": 1080,
"plcmt": 1,
"podid": "break-2",
"podseq": 0,
"slotinpod": 1,
"mincpmpersec": 0.9,
"api": [7],
"durfloors": [
{ "mindur": 15, "maxdur": 15, "bidfloor": 22.0 },
{ "mindur": 30, "maxdur": 30, "bidfloor": 38.0 }
]
},
"ssai": 3,
"bidfloorcur": "USD"
}]
Both send protocols , which is the field most often left out and the one that decides whether the creative you receive can play. The pod example sends placement nowhere, because on a fresh CTV integration there is no legacy buyer to keep alive; the web example sends both during migration.
## Placement: plcmt, placement, and linearity
Three fields describe where the ad sits, and they are routinely confused with each other.
Field Type Status Meaning
plcmt integer 2.6-202303 Placement subtype from the AdCOM Plcmt Subtypes list: 1 Instream, 2 Accompanying Content, 3 Interstitial, 4 No Content or Standalone, plus 5 through 9 added by AdCOM 1.0-202607. This is the field buyers filter on. Full reference at /docs/openrtb/plcmt/.
placement integer Deprecated The pre-2.6-202303 placement field. Deprecated, not removed, so it still validates. Sending only this one makes your inventory invisible to any buyer filtering on plcmt.
linearity integer Optional 1 linear or in-stream, 2 non-linear or overlay. Distinct from plcmt: linearity describes the creative form, plcmt describes the context.
pos integer Optional Ad position on screen, from the AdCOM Placement Positions list.
The migration from placement to plcmt has been running since 2.6-202303 and is not finished. Send both during transition: plcmt for buyers who have migrated, placement for those who have not, and make sure the two agree. Full detail in placement vs plcmt and the state of the migration in three years of plcmt .
## Skip controls
Field Type Status Meaning
skip integer Optional 1 if the player allows the ad to be skipped, 0 if not. Absent means unknown, which is not the same as 0.
skipmin integer, default 0 Optional Videos shorter than this many seconds cannot be skipped, regardless of skip.
skipafter integer, default 0 Optional Number of seconds before the skip control appears.
The distinction that matters: absent skip means unknown, and skip: 0 means the player will not offer a skip control. A buyer treating those as the same thing will send skippable creative into non-skippable inventory, which on CTV is a rejected creative rather than a degraded experience.
## Pod fields
Everything here arrived in 2.6 to make CTV ad breaks sellable. The same fields appear on the Audio object , because a streaming audio break has the same structure as a television one.
Field Type Status Meaning
podid string 2.6 Identifier for the ad pod. Impressions sharing a podid belong to the same break.
podseq integer, default 0 2.6 Pod position in the stream: -1 last, 0 any, 1 first.
slotinpod integer, default 0 2.6 Guaranteed slot position within the pod: -1 last, 0 any, 1 first, 2 first or last. Replaces the deprecated video.sequence.
poddur integer 2.6 Total seconds available in a dynamic pod, as opposed to per-slot durations.
maxseq integer 2.6 Maximum number of ads that may fill a dynamic pod.
rqddurs integer array 2.6 Exact acceptable durations in seconds. Mutually exclusive with minduration and maxduration, and the field live TV needs because imprecise durations cause dead air.
mincpmpersec float 2.6 Price floor per second of duration for the dynamic portion of a pod.
durfloors DurFloors array 2.6 Per-duration price floors, each with mindur, maxdur and bidfloor, so a 15 second spot and a 60 second spot can price differently in the same slot.
Two shapes exist. A structured pod is one impression per slot, all sharing a podid . A dynamic pod is a single impression with poddur and maxseq , letting bidders fill the break with creatives of varying length. More on the CTV context in CTV and ad pods , and on pricing in bid floors .
## Technical and creative constraints
Field Type Status Meaning
api integer array Optional Supported API frameworks: VPAID versions, MRAID, OMID, SIMID. An empty or absent list does not mean none are supported, which is why VPAID keeps arriving where it is unwanted.
delivery integer array Optional Supported delivery methods: streaming, progressive, download.
playbackmethod integer array Optional How playback starts and whether sound is on, from the AdCOM Playback Methods list.
playbackend integer 2.5 What ends playback: video completion, leaving the viewport, or leaving the viewport with a floating continuation.
minbitrate integer Optional Minimum bit rate in Kbps.
maxbitrate integer Optional Maximum bit rate in Kbps.
maxextended integer Optional Maximum extended ad duration beyond maxduration. 0 means no extension, -1 means unlimited.
boxingallowed integer, default 1 Optional Whether letterboxing of 4:3 content into a 16:9 window is allowed.
battr integer array Optional Blocked creative attributes. The CTV Ad Portfolio motion attributes (21 static, 22 limited motion, 23 full motion) are blocked here.
companionad Banner array Optional Companion display units offered alongside the video ad, each described as a Banner object.
companiontype integer array Optional Supported companion resource types: static, HTML, iframe.
sequence integer Deprecated Pre-2.6 ordering within a pod. Superseded by slotinpod.
api deserves a warning. An absent list does not mean no frameworks are supported, and plenty of integrations read it that way in both directions. If you do not accept VPAID, say so by sending a list that excludes it rather than by sending nothing.
## What the creative does with all of this
Every field above constrains a VAST document that has not been fetched yet. The bid request says the player accepts VAST 4.2 and durations up to 30 seconds; the tag that arrives declares whatever it declares, and nothing in the auction checks that the two agree.
That handoff is covered in VAST and OpenRTB . Fetch the live tag in the VAST tester . Walk wrapper hops in the inspector . Envelope checklists: wrappers , SIMID , companions . Why a valid bid is not proof the tag plays: A spec-valid video bid can still fill with empty VAST .
## Validate it
The Video object is where deprecated fields concentrate: placement without plcmt , sequence instead of slotinpod , pod fields typed into ext because the integration predates 2.6. Paste a request into the bid request tester , run the CLI over a corpus in CI, or give an agent the MCP server . Field-level rules are listed in the rule reference .
---
# video.plcmt in OpenRTB: values, versions, and what buyers filter on · RTBlint
URL: https://rtblint.org/docs/openrtb/plcmt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · plcmt (video placement) + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## video.plcmt in OpenRTB: values, versions, and what buyers filter on
imp.video.plcmt is a single integer that says where a video ad plays relative to content the viewer asked for. It carries more buying weight than almost any other optional field in the Video object, because buyers use it to separate instream inventory from everything else, and it is one of the few fields where a wrong value is worse than a missing one.
## The nine values
The values come from AdCOM's List: Plcmt Subtypes - Video, not from OpenRTB itself, which is why they can change without an OpenRTB release. Values 1 through 4 arrived with the field; 5 through 9 were added by AdCOM 1.0-202607 for the CTV Ad Portfolio formats.
Value Name What qualifies Available from
1 Instream Pre-, mid-, or post-roll against video content the viewer asked for. Sound on at player start, or clear intent to watch. The video is the primary content on the page. 2.6-202309
2 Accompanying Content The player sits beside or between text or graphics and starts only on entering the viewport. May become floating or sticky as the page scrolls. 2.6-202309
3 Interstitial No streaming video content. The ad takes the majority of the viewport and cannot be scrolled away while it plays. 2.6-202309
4 No Content / Standalone No streaming video content. Slideshows, native feeds, in-content, sticky or floating players. 2.6-202309
5 Pause Shown while requested video content is paused. The player remains the focus of the visit. AdCOM 1.0-202607
6 Screensaver Shown when an OS or app screensaver starts. AdCOM 1.0-202607
7 Overlay Placed over program content, outside the traditional ad break, often as a banner or picture in picture. AdCOM 1.0-202607
8 Squeezeback The program is resized so the ad shares the screen rather than covering it. That sharing is what separates it from an overlay. AdCOM 1.0-202607
9 In-scene Branded elements composited into the content itself, such as virtual placements in non-live content. AdCOM 1.0-202607
The list defines no vendor-specific range, so unlike api or battr there is no 500-and-above escape hatch. A value outside 1 through 9 is simply invalid, and a buyer that does not recognise it treats the impression as unclassified.
## When plcmt actually existed
Ask three integrations when plcmt arrived and you get two answers, because the specification's release notes and its text disagreed for six months.
Source Says
2.6-202303 release notes, April 5, 2023 New plcmt attribute in Object: Video, deprecation of placement , and example code in the implementation guide.
2.6-202303 specification document No occurrence of plcmt anywhere in the document. The Video table still carries placement with no deprecation marker.
2.6-202309 specification document, September 28, 2023 plcmt present in the Video table, pointing at the AdCOM list, and placement marked deprecated.
Current specification text The placement entry reads "Deprecated as of OpenRTB 2.6-202303. Use plcmt instead.", dating the change to the release that announced it rather than the one that carried it.
This is why every secondary source, this site included, dates the change to 2.6-202303: it is quoting the specification correctly. The 202303 document simply never said it. AdCOM took the same date, annotating its legacy Placement Subtypes list "deprecated as of the 2.6-202303 release". So both dates are defensible, and which one is correct depends on which artifact you validate against. RTBlint validates against the specification text, snapshot by snapshot, so 2.6-202309 is the first version where a payload carrying plcmt passes without a finding. Sent against an earlier snapshot, the validator says the field is not defined for that version rather than silently accepting it, which is the behaviour that catches a bidder pinned to a snapshot older than the field it is reading.
The practical answer for a seller: if a partner disputes whether plcmt is valid for the version you agreed at integration time, the disagreement is real and it is theirs to resolve, not a bug in your request. Name the snapshot in the conversation.
## Fields that answer a different question
Four fields on the Video object look like they overlap with plcmt . They do not, and the mistakes come from treating them as interchangeable.
Field Answers Does not answer
plcmt Where does this ad play, relative to content the viewer asked for? What the creative looks like, or where on the screen it sits.
placement The same question, in the pre-deprecation vocabulary with five different values. A synonym. The old and new lists are not a renaming, so do not map them one to one.
linearity Is the expected VAST response linear or non-linear? Whether the placement is instream or outstream. That is plcmt.
pos Where on the screen is the slot, above or below the fold? Anything about content context.
startdelay Pre-, mid-, or post-roll, in seconds. Whether the video content exists at all. A standalone placement has no roll position to describe.
The linearity confusion is worth calling out because the spec itself addresses it: the field describes the expected VAST response, not whether a placement is instream or outstream. A request declaring linearity 1 tells a buyer nothing about whether the video content exists. The creative that integer asks for is a linear VAST response .
## What a validator reports, and why
What you sent Finding
"plcmt": 12 openrtb.value.invalid naming the AdCOM list and its allowed values
plcmt on OpenRTB 2.5 or an early 2.6 snapshot openrtb.field.not_yet_available , naming the version the field arrives in rather than calling it a typo
placement on 2.6-202309 or later openrtb.field.deprecated , a warning: deprecated is not removed, and dual-sending is still the norm
"plcmt": "1" openrtb.type.mismatch . The field is an integer, and a quoted one is a common templating slip
What no validator can tell you is whether the value is the right one. A request that says "plcmt": 1 for a muted autoplay player beside an article is valid OpenRTB and misdescribed inventory. That distinction is the reason buyers audit plcmt distributions against measured player behaviour rather than trusting the field.
## A minimal instream request
{
"id": "auc-1",
"imp": [
{
"id": "1",
"video": {
"mimes": ["video/mp4"],
"plcmt": 1,
"placement": 1,
"linearity": 1,
"startdelay": 0,
"w": 1920,
"h": 1080,
"protocols": [2, 3, 5, 6]
}
}
],
"site": { "id": "s-1", "domain": "example.com" }
}
Both placement fields are present on purpose. Drop placement when your partners confirm they read plcmt , not before. Paste this into the tester and change the version selector to watch the finding change with the snapshot.
## FAQ
## Which OpenRTB version added plcmt?
The 2.6-202303 release notes, published April 5, 2023, announce the new plcmt attribute and the deprecation of placement. The specification document published at that same tag contains no occurrence of the string plcmt anywhere. The field first appears in the spec text at 2.6-202309, published September 28, 2023, which is also where placement is first marked deprecated. If you validate against the spec text, send plcmt on 2.6-202309 and later.
## Should I send both plcmt and placement?
Yes, for now, and expect to for a while. placement is deprecated but not removed, so it still validates, and buyers that never migrated still filter on it. Sending only placement makes the inventory invisible to any buyer that filters on plcmt; sending only plcmt does the reverse for the ones that did not migrate. Sending both costs one integer.
## Is plcmt 1 the same as placement 1?
No, and treating them as equivalent is the most common migration bug. The plcmt definition of Instream requires sound on by default at player start, or explicit user intent to watch, and requires the video to be the primary content in view. Plenty of inventory that qualified as placement 1 does not qualify as plcmt 1, and belongs at 2, 3, or 4.
## Can plcmt appear on anything other than video?
No. It is a field on the Video object, imp.video.plcmt. Audio has no equivalent, and banner placements describe themselves with pos and the display-specific fields.
## Related
placement vs plcmt: the migration, value by value
The Video object: every field, grouped by what it controls
Enum reference: the full AdCOM definitions for all nine values
CTV and ad pods, where plcmt 5 through 9 land
Three years of plcmt: the state of the migration
---
# OpenRTB Audio object: podcast and streaming audio bid requests · RTBlint
URL: https://rtblint.org/docs/openrtb/audio/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Audio object + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## The OpenRTB Audio object
imp.audio is a sibling of imp.video , not a variant of it. It keeps everything about duration, protocols, delivery, bit rate, pods and companion units, drops everything visual, and adds three fields that only make sense for a medium nobody is looking at. Understanding which of those three you are receiving tells you more about the inventory than any other field in the request.
## What audio does not have
The absences are informative. There is no w or h , no plcmt , no linearity , no skip , no playbackmethod , no boxingallowed . All of those describe a rectangle or a viewer's relationship to one.
The consequence for buyers is that the filtering habits built for video do not transfer. There is no placement subtype to segment on. The nearest equivalent is feed , and it carries far less resolution: three values covering the entire medium.
## The core fields
Field Type Status Meaning
mimes string array Required Supported content MIME types, for example audio/mp4. The only required field on the object.
protocols integer array Recommended Supported creative subtypes. This is the same AdCOM list video uses, because DAAST was folded into VAST 4.1 and audio creatives are VAST documents.
minduration integer Recommended Minimum ad duration in seconds.
maxduration integer Recommended Maximum ad duration in seconds.
startdelay integer Recommended 0 pre-roll, a positive number for a mid-roll at that offset, -1 generic mid-roll, -2 generic post-roll. In podcasting this is the difference between a pre-roll and a mid-roll rate card.
On protocols : audio creatives are VAST. DAAST was deprecated and folded into VAST 4.1 in 2018, so the creative subtype list is the same one video uses, and an audio integration that treats DAAST as a live standard is describing something that stopped existing.
## A podcast mid-roll, as a request
Two slots in one dynamically inserted break, sharing a podid , on a feed type of podcast with the ad stitched server-side:
"imp": [{
"id": "1",
"audio": {
"mimes": ["audio/mpeg", "audio/mp4", "audio/aac"],
"protocols": [7, 8],
"minduration": 15,
"maxduration": 30,
"startdelay": -1,
"feed": 3,
"stitched": 1,
"nvol": 1,
"podid": "midroll-1",
"slotinpod": 1,
"maxseq": 2,
"companiontype": [1, 2],
"delivery": [2]
},
"bidfloor": 18.0,
"bidfloorcur": "USD",
"secure": 1
}]
Three things in that payload are worth copying. startdelay of -1 marks a generic mid-roll, which is what dynamic insertion actually produces, rather than a fixed offset the platform cannot honour. stitched of 1 tells the buyer up front that no client will be firing trackers. And delivery of 2 says progressive, which is what a downloaded episode is, as opposed to the streaming value a music service would send.
## The three audio-only fields
Field Type Status Meaning
feed integer Audio only Feed type from the AdCOM Feed Types list: music streaming service, broadcast simulcast, podcast. This is the single most important audio-specific field, because the three environments have different measurement, different pricing and different creative expectations.
stitched integer Audio only 1 if the ad is stitched server-side into the content stream. Dynamic ad insertion is the norm in podcasting, so this is usually 1, and it changes who is responsible for firing trackers.
nvol integer Audio only Volume normalization mode applied to the stream, from the AdCOM Volume Normalization Modes list. Loudness mismatch between content and ad is the most common listener complaint in audio, and this is the only field that addresses it.
feed is doing an enormous amount of work for one integer. A podcast impression, a music streaming impression and a broadcast simulcast impression have different listener contexts, different completion behaviour and different measurement regimes. Podcast inventory in particular is measured from server-side download logs rather than from playback confirmation, because most podcast applications never report back to anyone.
stitched is the field that determines who fires the trackers. In a stitched break the assets are assembled server-side into the audio stream, so the player is not making a tracking decision at all. That is the same problem CTV has with imp.ssai , and it has the same consequence: identity and IP must be passed through from the real device rather than reflecting the stitching server.
## Fields shared with video
Field Type Status Meaning
podid, podseq, slotinpod string, integer 2.6 Ad break identity and slot position, identical in shape to video.
poddur, maxseq integer 2.6 Dynamic pod duration and maximum ad count.
rqddurs integer array 2.6 Exact acceptable durations. Mutually exclusive with minduration and maxduration.
mincpmpersec, durfloors float, DurFloors array 2.6 Duration-based pricing, so a 15 second and a 60 second spot can price differently in the same slot.
delivery integer array Optional Streaming, progressive, or download.
minbitrate, maxbitrate integer Optional Bit rate bounds in Kbps.
maxextended integer Optional Extended duration beyond maxduration. 0 none, -1 unlimited.
api integer array Optional Supported API frameworks. Rarely populated meaningfully in audio.
battr integer array Optional Blocked creative attributes.
companionad, companiontype Banner array, integer array Optional Display units shown alongside the audio ad, described as Banner objects. The companion is often the only visual surface an audio campaign gets.
sequence integer Deprecated Pre-2.6 ordering within a break. Superseded by slotinpod.
A podcast or streaming break is a pod, structurally identical to a television one. Two or three spots, ordered, sometimes with duration constraints the publisher cannot relax. The 2.6 pod fields cover it without modification, which is why they were defined on both objects at once. See CTV and ad pods for the mechanics.
## The measurement asymmetry
This is the part of audio that has no analogue in video, and it explains most of the disputes on an audio campaign.
A video impression is confirmed by a player that fired a pixel . A podcast download is inferred from a server log, using a byte threshold, a deduplication window and a filter against known invalid traffic. The IAB Tech Lab Podcast Technical Measurement Guidelines exist to make that inference consistent across vendors, and version 2.3 went to public comment in July 2026 with clearer handling of duplicates, measurement windows and video podcasts.
Nothing in a bid request changes that. What the request does control is whether the creative that gets served can be measured at all: the protocols list determines which VAST versions arrive, and the tag that arrives determines whether tracking events exist. If the tag is malformed, the download count is unaffected and the impression count is wrong, and the gap between them gets attributed to methodology.
## Validate it
Audio requests fail in quieter ways than video ones, because there is no screen to look at. The recurring defects are a missing or empty mimes , no protocols list at all, rqddurs sent alongside minduration and maxduration when the two are mutually exclusive, and pod fields left in ext from a pre-2.6 integration.
Paste a request into the bid request tester , run the CLI in CI, or give an agent the MCP server . The short version of this page is at how audio ads work in OpenRTB , and the creative half is covered at VASTlint's audio and podcast guide .
---
# CTV in OpenRTB: video object, ad pods, plcmt · RTBlint
URL: https://rtblint.org/docs/openrtb/ctv/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · CTV & ad pods + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## CTV in OpenRTB: video object, ad pods, plcmt
There is no single CTV flag in OpenRTB. A connected TV request is recognized by a combination of signals: device.devicetype set to 3 (Connected TV) or 7 (Set Top Box), an app object instead of site , and a content object describing the show. OpenRTB 2.6 then added the fields CTV actually needed: ad pods, exact durations, duration floors, and an SSAI signal.
## What marks a request as CTV
device.devicetype : 3 = Connected TV, 7 = Set Top Box, per the AdCOM 1.0 Device Types list. Value 6 (Connected Device) also shows up for streaming sticks. See the enum reference .
An app object, since CTV inventory is an app, not a browser page. The app.bundle carries the store-assigned app ID.
A content object under app , with metadata about what is playing. Since 2.6 it can carry content.network and content.channel objects (each with id , name , domain ), so a buyer can tell WABC-TV on ABC apart from every other stream the same exchange sells.
imp.video with plcmt = 1 (Instream): sound on by default, the video content is what the user came for. See placement vs plcmt for why the older placement field was deprecated in 2.6-202303.
## Ad pods: the 2.6 pod bidding fields
A CTV ad break is a pod: several ads back to back, like a linear TV break. Before 2.6 there was no standard way to sell one, so exchanges improvised with extensions. OpenRTB 2.6 added pod fields to imp.video (and imp.audio ):
Field Type Meaning
podid string Identifier for the pod. Impressions sharing the same podid in one request belong to the same ad pod.
podseq integer, default 0 Position of the pod within the content stream. AdCOM Pod Sequence: -1 last pod, 0 any pod, 1 first pod.
slotinpod integer, default 0 Slot position the seller can guarantee within the pod. AdCOM Slot Position in Pod: -1 last, 0 any, 1 first, 2 first or last. Replaces the deprecated video.sequence.
rqddurs integer array Exact acceptable creative durations in seconds, for live TV where imprecise durations cause dead air. Mutually exclusive with minduration and maxduration.
poddur integer, recommended Total seconds advertisers may fill in a dynamic pod (the whole break), as opposed to per-slot duration constraints.
maxseq integer, recommended Maximum number of ads that may be served into a dynamic pod.
mincpmpersec float Price floor per second of duration for the dynamic portion of a pod.
A structured pod is one imp per slot, all sharing a podid . A dynamic pod is a single imp with poddur and maxseq , letting bidders fill the break with creatives of varying lengths. On the response side, bid.slotinpod lets a bidder say its bid is only valid for a specific position.
## Duration floors, rewarded, and SSAI
Three more 2.6 additions matter for CTV. imp.video.durfloors is an array of DurFloors objects, each with mindur , maxdur , and a bidfloor , so a 15 second spot and a 60 second spot in the same slot can carry different prices. Details on the bid floors page .
imp.rwdd (integer, default 0) flags a rewarded placement: the user gets something for watching, typically after video completion. It sits on the Imp object, not on video .
imp.ssai (integer, default 0) signals server-side ad insertion, which is how most CTV ads are delivered: 0 = unknown, 1 = all client-side, 2 = assets stitched server-side but trackers fired client-side, 3 = all server-side. Note the path: it lives on imp , not inside the video object. SSAI also changes identity handling: the stitching server originates the requests, so device.ifa and the device IP must be passed through from the actual device rather than reflecting the server, or frequency capping and fraud detection break.
The full 2.5 to 2.6 delta, including everything above, is in OpenRTB 2.5 vs 2.6 .
## Validate it
CTV requests are where stale fields concentrate: video.sequence instead of slotinpod , placement instead of plcmt , pod fields typo'd into ext . Paste a request into the bid request tester and RTBlint flags deprecated and moved fields with stable rule IDs such as openrtb.field.deprecated , plus unknown fields via openrtb.field.undefined . The same checks run in CI through the CLI .
A request can name SSAI and still hand the player a VAST document that fails on its own. Stitch-time failures sit with the VAST side of SSAI , and a tracker URL that still contains a macro is a fired pixel that never expanded . The creative those placement integers are supposed to match is in the CTV ad portfolio notes .
---
# tmax in OpenRTB: auction timeouts explained · RTBlint
URL: https://rtblint.org/docs/openrtb/tmax/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · tmax & timeouts + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## tmax in OpenRTB: auction timeouts explained
tmax is an integer on the top-level BidRequest object. The OpenRTB 2.6 spec defines it as the "maximum time in milliseconds the exchange allows for bids to be received including Internet latency to avoid timeout. This value supersedes any a priori guidance from the exchange." Miss it and your bid never enters the auction.
## What the definition actually implies
Two details in that one sentence do all the work. First, the clock includes Internet latency: tmax is measured at the exchange, from when it sends the request to when your response arrives back. Your compute budget is tmax minus the full network round trip. With "tmax": 120 and 40 ms of round trip to the exchange, you have roughly 80 ms to parse, price, and respond, less once you leave headroom for jitter.
Second, it supersedes a priori guidance. Exchanges publish default timeouts at integration time, but a tmax in the request overrides them per auction. Header bidding wrappers often shrink it because the exchange itself sits inside someone else's timeout.
Typical values in production run 100 to 300 ms. Server-to-server paths and CTV tend toward the higher end; requests relayed through several intermediaries carry tighter budgets at each hop.
## Timeout vs 204 vs nbr
A bidder that misses tmax is silently dropped: the exchange closed the auction, the late bid is discarded, and exchange reporting counts it as a timeout. That is a different event from a deliberate no-bid, which is either an empty HTTP 204 response or a BidResponse carrying a no-bid reason code in nbr . The full code table is in OpenRTB no-bid reason codes . If you are debugging a bidder whose bid rate dropped, ask the exchange for its timeout rate first: a timeout looks like a no-bid in win-rate dashboards but has a different fix.
## Fields that look related but are not
imp.exp and bid.exp both deal in seconds, not milliseconds, and describe expiration, not timeouts. imp.exp is advisory: the number of seconds that may elapse between the auction and the actual impression. bid.exp is the bidder's side of the same handshake: how many seconds it is willing to wait between auction and impression. They matter for mediated and SSAI inventory where the render can lag the auction by minutes, and have nothing to do with tmax . There is no timeout field on source ; if you see one there, it is exchange-specific.
OpenRTB 3.0 keeps tmax on its Request object with the same millisecond, latency-inclusive definition, and adds explicit guidance that an intermediary should decrease the outbound tmax to account for its own latency and the extra hop.
## FAQ
## Is tmax required in OpenRTB?
No. tmax is an optional integer on the BidRequest object, set by the exchange. When present it supersedes any a priori guidance the exchange has published. When absent, the integration-time timeout agreement applies.
## Does tmax include network time?
Yes. The spec defines tmax as the maximum time in milliseconds the exchange allows for bids to be received, including Internet latency. The clock covers the full round trip, not just bidder compute time, so a bidder must respond in less than tmax minus the network round trip to the exchange.
## What happens if a bidder exceeds tmax?
The exchange has already closed the auction, so the late response is discarded and typically counted as a timeout in exchange reporting. No nbr code is involved; nbr is something the bidder sends, and a timed-out bidder by definition sent nothing in time.
## Validate it
A tmax sent as the string "120" instead of the integer 120 is a real and common integration bug. Paste a request into the bid request tester and RTBlint checks types against the spec, alongside every other field in the bid request . The CLI runs the same rules in CI.
---
# Bid floors in OpenRTB: bidfloor and bidfloorcur · RTBlint
URL: https://rtblint.org/docs/openrtb/floors/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Bid floors + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## Bid floors in OpenRTB: bidfloor and bidfloorcur
imp.bidfloor is the minimum bid for an impression, expressed as CPM, a float defaulting to 0. imp.bidfloorcur names its currency as an ISO-4217 alpha code, defaulting to "USD" . The floor is per impression, not per request, and deals can override it again per buyer.
## The two fields and their defaults
{
"id": "1",
"video": { "mimes": ["video/mp4"], "plcmt": 1 },
"bidfloor": 4.50,
"bidfloorcur": "EUR"
}
Per the 2.6 spec, bidfloorcur "sets the default for all floors specified in the Imp object", which matters once duration floors enter the picture below. Because both fields default, an impression with no floor at all is legal and common. Each imp in the bid request carries its own floor, so multi-impression requests can price a masthead and a footer slot differently.
## Currency: cur vs bidfloorcur
The request-level cur array lists the currencies the exchange accepts bids in. bidfloorcur is independent of it: an exchange may floor in EUR while accepting bids only in USD. When they differ, the bidder converts the floor into its bidding currency before comparing, using rates agreed with the exchange or a common reference. Bidding 5.00 USD against a 4.50 EUR floor is below floor on most days, and the bid is filtered.
## Per-deal floors in pmp.deals
Private marketplace deals live in imp.pmp.deals , an array of Deal objects. Each deal carries its own bidfloor (default 0) and bidfloorcur (default USD). Note the spec's explicit warning: Deal.bidfloorcur does not inherit from imp.bidfloorcur . A EUR floor on the impression plus a bare floor on the deal means the deal floor is in USD.
Deal.at can override the auction type per deal: 1 = first price, 2 = second price plus, and 3 = the value in bidfloor is the agreed fixed deal price. With at = 3 the floor stops being a floor and becomes the transaction price. wseat and wadomain restrict who may bid on the deal (buyer seats and advertiser domains respectively; omission means no restriction), and pmp.private_auction = 1 restricts the whole impression to the listed deals.
## Duration floors (2.6)
For video and audio pods, price scales with duration. OpenRTB 2.6 added durfloors , an array of DurFloors objects available at imp.video.durfloors , imp.audio.durfloors , and Deal.durfloors . Each entry has mindur , maxdur (at least one is required, and a missing end is unbounded), and a bidfloor in CPM. A creative whose duration falls outside every defined range falls back to the Imp -level bidfloor . The related mincpmpersec field floors dynamic pod pricing per second instead. Both are covered in context on the CTV and ad pods page , and the full 2.6 delta is in OpenRTB 2.5 vs 2.6 .
One adjacent thing that is not part of the protocol: Prebid's Price Floors module computes and enforces floors inside the wrapper, a layer above the OpenRTB fields described here.
## FAQ
## What happens if a bid is below the floor?
The exchange filters it out of the auction. If the exchange supports loss notices, the bidder's lurl may fire with loss reason 100 (Bid was Below Auction Floor) or 101 (Bid was Below Deal Floor) substituted into the AUCTION_LOSS macro. Nothing in the protocol prevents bidding below floor; it is simply a wasted bid.
## Is bidfloor required?
No. imp.bidfloor is optional and defaults to 0, meaning no floor. bidfloorcur defaults to USD. An absent floor and an explicit 0 floor mean the same thing: any positive bid price is acceptable.
## Is the floor per request or per impression?
Per impression. bidfloor sits on each Imp object, so a request with three impressions can carry three different floors, and each Deal inside imp.pmp can override the floor again for buyers on that deal.
## Validate it
Floors fail in boring ways: bidfloor sent as a string, a lowercase "usd" , durfloors misplaced on imp instead of imp.video . Paste your request into the bid request tester : RTBlint checks types and flags fields the spec does not define at that path via openrtb.field.undefined . The CLI does the same in pipelines.
---
# OpenRTB substitution macros · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB protocol
## OpenRTB substitution macros
Substitution macros are how the exchange reports auction outcomes back to the bidder. Before calling a win, billing, or loss notice URL, and when serving ad markup, the exchange replaces every recognized ${MACRO} token with live auction data: the clearing price, the impression ID, the loss reason. Section 4.4 of the 2.6 spec defines fourteen of them.
## The full 2.6 macro table
Macro Substituted with Since
${AUCTION_ID} ID of the bid request, from BidRequest.id. 2.x core
${AUCTION_BID_ID} ID of the bid, from BidResponse.bidid. 2.x core
${AUCTION_IMP_ID} ID of the impression just won, from imp.id. 2.x core
${AUCTION_SEAT_ID} ID of the bidder seat for whom the bid was made. 2.x core
${AUCTION_AD_ID} ID of the ad markup the bidder wishes to serve, from bid.adid. 2.x core
${AUCTION_PRICE} Clearing price in the same currency and units as the bid; the final price after discount. 2.x core
${AUCTION_CURRENCY} Currency of the bid, explicit or implied; confirmation only. 2.x core
${AUCTION_MBR} Market Bid Ratio: clearing price divided by bid price. 2.5
${AUCTION_LOSS} Loss reason code; the code list lives in OpenRTB 3.0. 2.5
${AUCTION_MIN_TO_WIN} Minimum bid needed to win (or to tie the winner), same currency and units as the bid. 2.6
${AUCTION_MULTIPLIER} Total quantity of impressions won, for DOOH-style multi-viewer inventory; float, may be below 1. 2.6 updates
${AUCTION_IMP_TS} Unix timestamp in milliseconds of when the impression was fulfilled. 2.6 updates
${AUCTION_DISCOUNT_PCT} Seller discount as a percentage of the bid price. 2.6 updates
${AUCTION_DISCOUNT_CPM} Seller discount expressed as a CPM. 2.6 updates
${AUCTION_MBR} and ${AUCTION_LOSS} arrived in 2.5, ${AUCTION_MIN_TO_WIN} in 2.6, and the multiplier, timestamp, and discount macros through the rolling 2.6 updates alongside DOOH and discount support. OpenRTB 3.0 defines a similar list under an OPENRTB_ prefix, for example ${OPENRTB_PRICE} , with item-based names ( ${OPENRTB_ITEM_ID} , ${OPENRTB_MEDIA_ID} ) and without the multiplier, timestamp, and discount macros.
## Where macros expand
Macros work in the notice URLs on the Bid object, nurl (win), burl (billing), and lurl (loss), and in the ad markup, whether it is returned in bid.adm or as the body of the win notice. See the bid response anatomy for how those fields relate. A common pattern is putting macros in a tracking pixel inside the markup so the win confirmation fires from the device itself.
A win notice URL before substitution:
https://bidder.example/win?req=${AUCTION_ID}&imp=${AUCTION_IMP_ID}&p=${AUCTION_PRICE}&cur=${AUCTION_CURRENCY}
And as the exchange calls it:
https://bidder.example/win?req=80ce30c5-3a3f-4862&imp=1&p=2.15&cur=USD
Substitution is textual and blind: "wherever a legal macro is found, it will be replaced without regard for syntax correctness", and an unknown optional value becomes a zero-length string. Values are not URL-encoded for you, so keep macros in query-string positions where the raw values (numbers, IDs, ISO codes) are URL-safe, and be careful when a macro lands inside markup you also escape.
## Price encryption and loss reasons
When price data travels beyond the exchange, through the publisher page into the browser, exchanges often require the price macro encrypted. The spec's convention is a suffix naming the agreed algorithm: ${AUCTION_PRICE:B64} . The algorithms themselves are not standardized; each pair of parties agrees on one. Exchange policy may also strip ${AUCTION_PRICE} from loss notices entirely, replacing it with an empty string.
${AUCTION_LOSS} in a lurl carries a loss reason code from the list maintained in OpenRTB 3.0: 100 = bid was below auction floor, 102 = lost to higher bid, 200-range codes for creative filtering, and so on. Loss reasons describe a bid that lost; they are a different list from the no-bid reason codes a bidder sends in nbr , covered in no-bid reason codes .
## FAQ
## Where can OpenRTB macros be used?
In the win notice (bid.nurl), billing notice (bid.burl), and loss notice (bid.lurl) URLs, and in the ad markup itself, whether that markup is returned in bid.adm or in the body of the win notice response. The exchange performs the same substitution in all of these places, and compliant exchanges must support every macro for which data is available.
## What is AUCTION_MIN_TO_WIN?
A macro added in OpenRTB 2.6 for bid shading feedback. If your bid lost, it is replaced with the minimum price that would have tied the winning bid. If your bid won, it is the price needed to tie the next-closest bid, or the floor if yours was the only bid. Exchanges may substitute the empty string when policy forbids sharing price data or when price was not the deciding factor.
## What if a macro's value is unknown?
If the source value is an optional parameter that was not specified, the macro is replaced with a zero-length string. When markup is rendered for testing or ad quality review, the spec's best practice is to substitute the literal string AUDIT.
## Validate it
Macros live in the bid response, and response validation is on the RTBlint roadmap. What ships today is full bid request validation: paste a request into the bid request tester or run the CLI to catch structural mistakes before the auction ever reaches the notice-URL stage.
---
# DecryptAds mapped more than 2,100 AI recipe domains through ads.txt footprints, and the OpenRTB request still looks like food inventory. · RTBlint
URL: https://rtblint.org/blog/decryptads-recipe-slop-footprints-clean-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## DecryptAds mapped more than 2,100 AI recipe domains through ads.txt footprints, and the OpenRTB request still looks like food inventory.
October 20, 2026 · RTBlint
On October 20, 2026, AdExchanger published a supply-chain story built on a DecryptAds study released the same week: more than 2,100 AI-generated recipe websites monetized through programmatic ads, many with fabricated author profiles and ads.txt chains that route through sales houses connected to ad tech registered in what the researchers call risky geographies. The headline count is the scale. The programmatic argument is what your bidder actually sees: a site object with a cooking domain, category fields that still read as food content, and no OpenRTB field that says the author photo is synthetic or that the SSP row in ads.txt was copied from a reseller template.
## What DecryptAds measured off the bid path
DecryptAds describes its Oct 2026 report as mapping more than 2,100 made-for-advertising recipe sites, many with AI author photos and fake back stories, that authorize Russian and Chinese ad tech through outsourced ads.txt managers. The methodology starts outside OpenRTB: the team monitors roughly 300 ad tech companies it classifies as geo-risk based on ads.txt relationships, then filters publishers for food and cooking keywords, clusters them with programmatic data, and manually confirms AI indicators on at least three pages per site before counting a true positive.
From an initial pool of approximately 400 confirmed AI recipe websites, researchers built more than 190 technical fingerprints in the DecryptAds Feed Builder. Those fingerprints combine ads.txt and app-ads.txt account IDs, page content scans, on-page account IDs, seller names, DNS, WHOIS registrar data, and in-house clustering. The expansion from 400 sites to more than 2,100 MFA domains is footprint matching, not a new impression counter. Analysis ran between July and October 2026.
AdExchanger's Oct 20 coverage adds the programmatic wrinkle buyers feel in Q4 planning: major brand ads appeared on these domains, SSPs named in the study dispute how many sites they actively monetize, and the public files we already crawl for supply-path hygiene are the same files DecryptAds used to pivot. ads.txt and sellers.json are doing the job they were designed for, surfacing relationships. They were never designed to encode content authorship or MFA class on the impression object.
## Why the bid request stays clean
OpenRTB gives you inventory identity, placement geometry, regulatory flags, and optional content metadata. It does not carry a boolean for AI-generated prose, a score for author photo authenticity, or a reseller vetting grade. A recipe slop domain that passes ads.txt against a legitimate sales house still arrives with site.domain set to a kitchen-themed hostname, page URLs under food paths, and site.cat or content.cat values that contextual models happily treat as cooking inventory.
That is the blind spot our September post on half a billion AI slop impressions described from the verification side: blocked and post-bid counts can be enormous while the request shape stays spec-valid. DecryptAds adds a supply-chain lens with a different denominator. Instead of counting impressions, it counts domains authorized through shared account IDs and reseller lines, then shows how one ads.txt manager can appear on more than three quarters of the expanded list.
Bid request (simplified):
site.domain: "dailytastekitchen.example"
site.page: "https://dailytastekitchen.example/chicken-soup"
site.cat: ["IAB8"] // food & drink taxonomy
source.ext.schain: ... // may be complete
imp.bidfloor: 0.42
Not present on the wire:
ai_authorship_flag
author_image_provenance
ads.txt_manager_vetting_tier
decryptads_footprint_id
A buyer filter that only runs rtblint-style field validation, or that blocks on stale placement enums, will not see the gap in the block above. Pre-bid MFA lists built from domain reputation lag footprint expansion because operators launch net-new hostnames faster than static blocklists refresh. Post-bid content classifiers can label slop after the fact, but that is a different budget line and a different latency than refusing the request at bid time.
## ads.txt pivots versus exchange logs
DecryptAds highlights third-party SSPs and sales houses that manage ads.txt for publishers. That is normal business: many sites outsource monetization setup. The study flags when those managers replicate long partner lists that include geo-risk ad systems across client domains. In the primary report, one Italian sales house name is associated with 1,631 websites, reported as 77.1% of the more than 2,100 sites tracked, grouped by low-density account IDs that likely belong to site owners rather than global platforms.
AdExchanger tested live URLs, noted vendor pushback, and corrected one detail: a summary of partners on a sample site came from the publisher ads.txt file, not the SSP sellers.json row. That distinction matters for your crawl jobs. ads.txt tells you who the publisher authorized. sellers.json tells you how the SSP describes its accounts. A mismatch between them is its own supply-path defect. DecryptAds is arguing that even when both files parse cleanly, the publisher side can still authorize a chain you would not choose if you saw the page creative.
RTBlint is independent and not affiliated with DecryptAds, IAB Tech Lab, or the SSPs named in trade coverage. The linter checks OpenRTB shape and internal consistency. It does not crawl ads.txt at bid time, classify AI prose, or score MFA intent. Treat a green validation as proof the payload is well formed, not proof the domain belongs in your news or CPG allow list.
## What buyers can do on the auction hop
Separate domain blocklists from relationship audits. Export wins on food-category open market lines and join site.domain to the latest ads.txt crawl, focusing on reseller lines with account IDs that appear across hundreds of unrelated kitchen hostnames. DecryptAds sells feeds and API access for that pivot; your data team can reproduce a lighter version with public files plus your own win logs if you store seller IDs from schain or exchange extensions.
Split reporting for defended versus undefended lines. If verification blocks slop post-bid on some campaigns but not others, your internal fill metrics will look better on protected spend while raw exchange volume still includes MFA domains. Without that split, procurement reads DecryptAds as a headline threat and ad ops reads green bid validation as proof the pipe is fine. Both can be true.
Crawl ads.txt for top spending site.domain values weekly; flag account IDs that map to more than N unrelated publishers in your footprint tables.
Compare site.cat and content keywords on bids to post-bid slop labels where you buy verification; disagreements show where category taxonomies fail before MFA lists do.
Validate OpenRTB on samples from suspicious clusters (missing currency, impossible schain, device anomalies) even when the domain is new; slop operators still make builder mistakes under volume pressure.
Ask SSP partners which sales houses manage ads.txt for long-tail food publishers and whether geo-risk partners are contractually excluded from template lines.
Do not treat sellers.json name matches as proof of active monetization; vendors in the Oct 20 story disputed counts after receiving domain lists.
## Why this week matters for Q4 inventory reviews
AI slop is not a single fraud scheme. It is cheap content plus paid traffic plus programmatic monetization, which means the same OpenRTB plumbing that serves legitimate niche blogs also clears when operators rotate domains. DecryptAds framed cybersecurity risk around risky geos and malvertising on at least one analyzed site; AdExchanger quoted researchers who did not allege crimes by named partners. For auction engineers, the actionable thread is unchanged: public supply files reveal relationships faster than bid requests reveal content quality.
If your organization already read the September verification totals, use this study as the domain-expansion companion. Impression counts tell you how much slop ran or was blocked after models scored it. Footprint counts tell you how fast new hostnames enter authorized chains. Budget holders need both denominators before they ask exchanges to fix MFA with another keyword list.
Inspect suspicious bid samples in the RTBlint OpenRTB validator when you change filters or schain rules. Pair that with ads.txt crawls and the supply-chain guides on ads.txt, sellers.json, and schain . A well-formed request is the floor. It is not the ceiling DecryptAds is pointing at.
## Sources
DecryptAds: AI Recipe Slop Networks (October 2026)
AdExchanger: AI Slop Sites Are On The Rise (October 20, 2026)
RTBlint: AI slop impressions and OpenRTB category blind spots
RTBlint: Jounce bidstream directness and ads.txt validation
---
# Google Ad Manager now sends site.pagecat on Ad Exchange requests, and Prebid bidders on the same page still get whatever you put in ortb2.site. · RTBlint
URL: https://rtblint.org/blog/gam-pagecat-on-adx-not-on-prebid-ortb2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## Google Ad Manager now sends site.pagecat on Ad Exchange requests, and Prebid bidders on the same page still get whatever you put in ortb2.site.
October 17, 2026 · RTBlint
On October 16, 2026, AdExchanger's content studio argued that CTV automation will only work if buyers can activate richer signals across programmatic inventory. Two days earlier, on October 15, Google shipped a concrete bid-request change on its own demand paths: Authorized Buyers RTB release notes say Ad Manager now populates site.cat , site.pagecat , app.cat , and app.pagecat , with matching cattax values, on requests Google builds for Ad Exchange, Open Bidding, and SDK bidders. That is not the same object Prebid.js forwards to SSP adapters on the same page. The industry argument about better signals just became a path split you can measure in JSON.
## What came back on the wire, and where
Google's October 15, 2026 OpenRTB proto release notes state that Google populates the category fields with standard IAB Tech Lab content category IDs. The cattax fields indicate the taxonomy in use for the corresponding cat and pagecat arrays; the CategoryTaxonomy enum on Authorized Buyers supports IAB_CONTENT_1_0 and IAB_CONTENT_2_2 . The cat arrays describe the site or app as a whole; pagecat describes the current page or view. Sharing is subject to publisher controls and privacy rules documented in Google Ad Manager help.
Google Ad Manager release notes for the same date describe the feature as sharing standard OpenRTB contextual categories with Authorized Buyers, Open Bidding, and SDK bidding. For now, those fields are sent only on bid requests from outside the European Economic Area, the United Kingdom, and Switzerland. Categories that may relate to GDPR Article 9 special categories of personal data are not shared from any geography. Publishers can disable sharing with the network-level toggle "Share contextual category signals" under Admin, Global settings, Network settings.
Google had not passed contextual content categories to buyers in its auction since February 2020, after discussions with European data protection authorities. Buyers on Ad Exchange and Open Bidding spent six years inferring page meaning from URL, crawl, or post-bid classification. The October 15 change restores declarative categories on Google-built requests only. It does not backfill history on Prebid legs that never carried those arrays.
## Prebid is a different hop with a different publisher
The change covers bid requests Ad Manager constructs for its own demand. Prebid bidders receive whatever the wrapper places in ortb2.site or ortb2.app . Prebid's first-party data documentation lists cat , sectioncat , and pagecat as standard site fields settable via setConfig , per-auction overrides, or setBidderConfig . Many production wrappers leave them unset. On an article URL where pbjs.getConfig('ortb2') returns no pagecat , Ad Exchange buyers outside Europe now see IAB codes Google mapped from the publisher's own Ad Manager inventory, while Prebid SSPs still price a request with an empty site object.
That is the same structural pattern as Prebid vs TAM vs Open Bidding : one ad unit in the UI, multiple OpenRTB assemblies. Floors, deals, and privacy strings already diverged by path. Category arrays are another request-wide field that can differ without violating the spec. A buyer who trains contextual avoidance on Ad Exchange logs is not automatically applying the same rules to header-bidding impressions from the identical page.
OpenRTB 2.6 defaults BidRequest.cattax to 1, Content Category Taxonomy 1.0. A taxonomy 2.x or 3.x integer sent without cattax is a different code than the buyer interprets. Google's populated cattax on site and app objects reduces that ambiguity on Google paths. A publisher who manually maps CMS sections to IAB codes in ortb2.site must set cattax to match, or Prebid-side bcat and contextual targeting will misfire even after they copy Google's category lists.
## Extensions that still are not on every path
The same October 15 release notes add Google OpenRTB extensions for content.title , content.series , content.network , and content.channel on site and app objects. Those fields describe show-level metadata buyers have asked for in CTV and long-form web video. They arrive on the Google protobuf extensions version bundled with Authorized Buyers, not as a guarantee on arbitrary SSP traffic. A DSP rule that hard-requires content.title will behave differently on Open Bidding than on a Prebid Server fan-out that never copied those extensions.
The AI slop impressions post made a related point with different supply: verification can count hundreds of millions of low-quality impressions while the OpenRTB request still validates. Restoring site.cat does not label slop on the wire either. It gives buyers a declared category to match against block lists and contextual models. When only one demand path receives that declaration, spend shifts toward the path with richer signals, not necessarily toward higher-quality pages.
Google-built request (Ad Exchange / Open Bidding / SDK, non-EEA/UK/CH):
site.pagecat: ["IAB9-30"] // example IAB Content 1.0 code
site.cattax: IAB_CONTENT_1_0
site.cat: ["IAB9"]
Prebid-forwarded request (same URL, default wrapper):
site: {} // or site without pagecat
// bcat on the request still applies, but buyer contextual bid
// logic keyed on pagecat sees nothing
The example uses illustrative IAB codes. Production values come from Google's mapping of publisher inventory to IAB Content Taxonomy IDs subject to the Article 9 exclusion. The point is structural: two JSON objects, one impression opportunity, unequal category arrays. RTBlint will flag type errors and invalid cattax enums; it does not judge whether Google's mapping matches editorial intent.
## Why the EEA split is a built-in experiment
European Economic Area, United Kingdom, and Swiss traffic continues to omit the category fields for now. Everywhere else receives them by default unless the publisher toggles sharing off. That geography split is useful for analytics: same site, same week, two bid-request shapes differing primarily by whether pagecat is present. Revenue per thousand requests that rises outside Europe but not inside it is evidence that category signals moved bids, not that header bidding suddenly improved globally.
Buyers should segment win rate and effective CPM by country bucket and by demand path (Ad Exchange versus Prebid adapter) before rewriting targeting rules. Sellers should compare Ad Exchange win share against Prebid on ad units where both fire. A shift toward Google demand outside Europe with flat European results is consistent with the category rollout even when no other trafficking change occurred.
None of that shows up in a single aggregated fill-rate tile. It shows up when exports retain path dimension and when someone reads the October 15 release notes instead of assuming contextual targeting returned everywhere at once. The Prebid ad-server bid-in proposal is a separate auction-topology story. Category population is live now on Google demand regardless of whether GAM ever bids into Prebid Server.
## What to diff this week
Capture one Authorized Buyers or Open Bidding request and one Prebid outbound request on the same non-European page view. Compare site.pagecat , site.cat , and site.cattax (or app equivalents).
Run pbjs.getConfig('ortb2') on article and section templates. Document whether pagecat is empty before copying Google's categories into ortb2.site .
If you map CMS tags to IAB codes for Prebid, set cattax explicitly and validate samples in the bid request tester or CI per the OpenRTB validation guide .
Split reporting into EEA or UK or CH versus rest-of-world when testing contextual bid adjustments, so you do not attribute a European control group to a signal that is not there yet.
Read buyer loss reason 209 (category blocked) with the cattax from the same request. The same integer under two taxonomies is two different categories.
RTBlint is independent and not affiliated with Google, IAB Tech Lab, or AdExchanger. Field names follow OpenRTB as published by IAB Tech Lab. Category population rules quoted here are from Google Authorized Buyers release notes dated October 15, 2026 and Google Ad Manager release notes for the same date.
## Sources
Google Authorized Buyers: Real-time Bidding release notes (October 15, 2026 OpenRTB category fields)
Google Ad Manager: What's new (OpenRTB contextual category sharing)
AdExchanger: Better Advertising On CTV Starts With Better Signals (October 16, 2026)
Optimon: Ad Manager shares page categories with bidders (October 15, 2026 rollout summary)
RTBlint: Prebid vs Amazon TAM vs Open Bidding
RTBlint: AI slop impressions and OpenRTB category blind spots
---
# Prebid wants ad servers to bid into the header auction so AdX can compete without GAM seeing the winning price first. · RTBlint
URL: https://rtblint.org/blog/prebid-ad-servers-bid-into-auction-unbundles-gam-adx/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## Prebid wants ad servers to bid into the header auction so AdX can compete without GAM seeing the winning price first.
October 14, 2026 · RTBlint
Last month, a federal court ordered Google to integrate with Prebid but did not specify the mechanism. On October 14, 2026, AdExchanger reported that Prebid previewed a proposal at the Prebid Summit in New York City to let ad servers bid into Prebid rather than Prebid bidding into ad servers. The working group hopes to formalize the framework by the end of Q1 2027. The story is not a product launch. It is a bidstream architecture bet about who runs the final auction and whether Google AdX can compete without Google Ad Manager sitting in the middle.
## Two auctions were a feature, not a bug, for the ad server
Classic header bidding runs Prebid first, then passes the winning demand into Google Ad Manager. GAM is bundled with AdX, so the house exchange sees the Prebid winner before it prices its own demand. Olly Burns, CTO at Teal and a co-author of the proposal, told AdExchanger that under the old flow Google got a look at the winning bid price of the Prebid auction, which allowed AdX demand to easily outbid the winning Prebid bidder.
That is an information asymmetry on the OpenRTB payload, not a malformed field. Buyers debugging loss reason 102 (timeout) on the Prebid path and wins on the GAM path are looking at two different assemblies of one impression. The Prebid vs TAM vs Open Bidding post is the same pattern with different wrappers: each path can carry different floors, deals, and privacy strings even when the ad unit looks unified in the ad server UI.
Reorienting so ad servers bid into Prebid puts AdX in the same auction as other SSP demand. AdExchanger quotes Burns saying Prebid would run a pre-auction and feed winning bids into GAM where Google's auctions actually took place; the proposed model removes that pre step. Constantine Mirin, CEO at Postindustria, told the outlet it will be interesting whether GAM becomes less dominant as a revenue source when the structural advantage disappears.
## What the court asked for versus what Prebid is drafting
Judge Leonie Brinkema's remedies require Google to let AdX demand bid into ad auctions independently of its ad server, integrate its ad server with Prebid via an API or other connection, and provide publishers win and loss data. AdExchanger notes the court did not specify mechanisms. The Prebid working group pitched the ad-server-bids-into-Prebid model in April anticipating a possible GAM breakup; the court decided not to pursue that structural split.
Burns told AdExchanger the framework could satisfy all three requirements because Google's auction would happen alongside everyone else's. That is a stronger claim than logging equivalence on outbound OpenRTB, which is where the remedies compliance post focused: floors, user.eids , schain, and loss codes on the request Prebid Server emits. This week's proposal is about auction topology. Compliance teams still need both: the topology change only matters if the integrated path logs the same fields monitors will compare.
Prebid cannot force Google to integrate through Prebid Server. Brian Sardo, a senior software engineer at Microsoft who led the Summit presentation, told AdExchanger Google could plug into Prebid.js instead. The new framework is built for Prebid Server, so a browser-only integration would not deliver the full reversal. Prebid members speaking on background bet Google will adopt both, and that a ready Server framework before legal wrangling ends makes adoption more likely than a bespoke Google design.
## One call instead of two changes latency and logging
Burns told AdExchanger that GAM is one of the worst offenders in slowing the internet down. Today Prebid often requires two calls, one to Prebid and one to GAM. Collapsing to one call pretty much halves the time, he said. For supply path QA, halving calls also halves the places where source.tid , imp.ext.tid , and consent strings can diverge, but only if the single call is the canonical log line your SSP exports.
Publishers evaluating the proposal should ask whether their analytics still attribute revenue to GAM line items when GAM is a bidder inside Prebid Server rather than the clearing house. OpenRTB still needs seat , bidid , and currency on the response. An ad server bid object that omits mtype or returns without a loss reason on no-bid will look like demand failure in dashboards that used to blame Prebid timeouts alone.
Legacy path (two hops):
Browser -> Prebid auction -> winning bid + price
Browser -> GAM ad server -> AdX sees Prebid winner, reprices
Proposed path (one hop, Prebid Server):
Browser -> Prebid Server auction
<- SSP bids
<- GAM/AdX bid as ad-server bidder
Single clearing price, no Prebid winner leaked to GAM first
The diagram is schematic. Real integrations still have mediation, ad rules, and direct line items. The wire consequence AdExchanger emphasizes is AdX competing without forcing publishers to use GAM as the auction host. Whether your stack logs that as one request or two depends on implementation, not press release wording.
## Public comment until Q1 2027 is the only fixed date
The proposal is in public comment. Formalization is targeted for end of Q1 2027, then a future Prebid update. Until then, production traffic still follows the pre-auction into GAM pattern. Burns told AdExchanger Prebid wants to be on the front foot so publishers can influence the agenda, citing past Google industry overhauls that stalled despite broad participation.
Buyers should not rewrite OpenRTB validation rules for a bid request shape that is not live. Sellers should use the comment period to document where GAM currently mutates Prebid outcomes: currency on floors, deal IDs stripped on the ad server hop, and identity fields present only on the Prebid leg. Those diffs become the evidence if functional equivalence is argued later.
LG and Magnite agentic home-screen deals, also in this week's trade press, are a different supply path (CTV OEM inventory through a DSP agent). They do not replace the web header-bidding question Prebid is trying to solve. CTV pods still need pod fields on the request; this proposal is about who runs the auction for display and the GAM bundle.
## What to log before the integration lands
Capture paired requests on the same impression today: Prebid client or PBS outbound, and the GAM-bound payload with the Prebid winner attached.
Record the Prebid winning price field GAM receives and whether AdX bids exceed it on the second hop.
Diff regs.gpp , user.ext.consent , and user.eids between hops; a single-call future only helps if those strings survive the merge.
Tag traffic by integration path in warehouse exports so a future Prebid Server ad-server bidder row does not merge with legacy GAM clearing rows.
Validate OpenRTB in CI on the request your path actually emits; see the bid request tester and CI guide .
RTBlint is independent and not affiliated with Prebid.org, Google, or AdExchanger. It checks whether payloads match OpenRTB and exchange profiles. It does not predict whether Google will integrate through Prebid Server or whether the court will accept the proposal as remedy compliance.
## Sources
AdExchanger: Prebid's proposed auction overhaul (October 14, 2026)
AdExchanger: Judge Brinkema's remedies decision (TLDR)
RTBlint: Google ad tech remedies ruling and Prebid Server bid requests
RTBlint: Prebid vs Amazon TAM vs Open Bidding
---
# A Trusted Server edge auction can price Safari inventory with an OpenRTB object your SSP never saw in the browser. · RTBlint
URL: https://rtblint.org/blog/trusted-server-edge-openrtb-not-browser-prebid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## A Trusted Server edge auction can price Safari inventory with an OpenRTB object your SSP never saw in the browser.
October 11, 2026 · RTBlint
Safari on iOS 27 stopped loading several ad tech registrable domains before sync and delivery scripts could run. The Trade Desk filed WebKit bug 324771 because adsrvr.org sits on that list, which removed a major buyer from Safari pages until Apple tests a 27.2 beta fix. Identity vendors on the same ticket lost sync calls too, which we covered in Safari 27 thins user.eids . The industry response this week is not another browser patch. It is a push to move auctions off the page and onto publisher-controlled edge runtimes, with IAB Tech Lab chief executive Anthony Katsur calling Trusted Server production ready on October 8, 2026 while Digiday reported a surge of publisher calls to the task force.
## Two bid requests, one impression line
Seller dashboards still count Safari requests. That count is the wrong join when the auction path splits. In the classic header bidding setup, the browser loads Prebid.js, user ID modules call third party hosts, and the resulting OpenRTB object leaves the client with whatever user.eids survived network policy. Under Trusted Server, the reader's device talks only to the publisher origin; the edge runtime calls bidders and identity vendors server to server, then assembles OpenRTB where the browser never saw the intermediate hops.
IAB Tech Lab's public project page, last updated October 5, 2026, lists the minimum viable product phase as in progress and ready for more publishers to test, with a feature row for addressability, display, native, and video creative types, ID and audience providers, and server side tagging marked Ready for Publisher Testing. PPC Land's October 10 analysis notes the GitHub repository had no published release tags at capture, which matters for engineering teams who pin versions, but it does not change the architectural claim: OpenRTB can be built at the edge through configuration-driven auction providers, not only forwarded from the browser.
Buyers and SSPs that diff only the seller's aggregated Safari volume will miss the swap. The impression id may match your ad server log while the JSON a DSP priced carries different site.page context, different consent forwarding, and identity entries minted as first party edge cookies rather than copied from a sync pixel the browser blocked. That is a bidstream integrity problem, not a creative delivery problem.
## What production ready actually describes
Katsur's October 8 social posts, quoted in PPC Land, frame Trusted Server as a way to regain control of ad technology, restore addressability in restricted environments, and run the open web stack server side. The Tech Lab page is more cautious than a headline: proof of concept is complete, MVP is in progress, and the task force still invites feedback on security, performance, and edge cloud priorities. Digiday on October 8 quoted senior director Rowena Lam saying publishers who filed Trusted Server under someday now treat Apple's block list as a deadline, with the Lab preparing to go live with a first publisher.
None of that language guarantees parity with browser auctions. Earlier server-side paths often earned less because buyers bid down inventory when the identity shape changed. PPC Land's October 10 piece repeats that history explicitly. A publisher testing Trusted Server to recover Permutive or UID2 calls in Safari is solving a network block, not automatically restoring the CPM curve from pre-block browser syncs. Ops should expect buyer-side validation rules written for in-page Prebid to fire on edge-built requests until someone updates them.
Hosting cost sits outside the Apache 2.0 licence. The runtime targets Fastly Compute, Cloudflare Workers, Akamai Spin, or container Axum deployments. Every page view that touches the edge proxy is billable traffic on those platforms. That is visible spend against revenue that is still hypothetical until buyers accept the new request shape.
## Where the payload diverges
Trusted Server documentation describes edge cookie generation as HMAC-based cookies minted by the publisher, with downstream use determined by deployer configuration. Consent handling forwards TCF v2, GPP, and GPC signals while the deployer configures jurisdiction lists and conflict resolution. That is the same pattern as Prebid Activity Controls and server-side GPP forwarding, but the enforcement point moved from JavaScript in the page to Rust and WebAssembly at the CDN.
// Browser Prebid path (Safari 27, sync hosts blocked)
{
"site": { "page": "https://news.example/article" },
"device": { "ua": "... Safari/27 ...", "os": "iOS" },
"user": { "eids": [] },
"source": { "fd": 0, "tid": "browser-auction-uuid" }
}
// Edge Trusted Server path (same URL, same reader)
{
"site": { "page": "https://news.example/article" },
"device": { "ua": "... Safari/27 ...", "os": "iOS" },
"user": {
"eids": [
{ "source": "publisher-edge.example", "uids": [{ "id": "ec-..." }] }
]
},
"source": { "fd": 1, "tid": "edge-auction-uuid" },
"ext": { "prebid": { "channel": { "name": "trusted-server" } } }
}
The second object can be perfectly valid OpenRTB 2.6 and still fail a buyer rule that requires uidapi.com or rejects unknown eids.source values. Sellers see a bid or a no-bid; without nbr returned, both look like soft demand. Our no-bid reason guide and fill rate diagnostic start from the same split: invalid request versus unsupported device versus incomplete supply chain are different buckets than nobody wanted the spot.
Server-side routing also changes who can observe schain and supply chain completeness. An edge proxy that terminates third party calls may assemble source.ext.schain differently from a wrapper that ran in the browser, especially when intermediaries expect to see their node because a script loaded. A buyer requiring schain.complete == 1 may no-bid with reason 16 even when the inventory is the same slot the publisher always sold.
## Safari block list limits server-side hype
Moving calls off the browser avoids WebKit's check on requests leaving Safari to listed registrable domains. PPC Land's technical coverage of the block traces WebKit bug 307853 and notes the public hook blocks eTLD+1, which is why adsrvr.org subdomains inherit the same fate. That workaround does not rewrite buyer economics or Apple's longer tightening path. AdExchanger on October 9 reported a larger private list than the nine domains in Meyers' ticket, and identity vendors remain blocked in beta builds even when delivery domains may return.
PPC Land also noted earlier Safari betas blocked some tracking endpoints by IP range, which server-side tagging does not automatically escape if the edge forwards to the same destination. Trusted Server describes itself as a reverse proxy. Whether a first-party edge call to a blocked identity host is invisible to Apple is an open engineering question the attached primaries do not settle.
In-app inventory stays under App Tracking Transparency and OS rules an edge web proxy never touches. CTV and mobile app bidstreams are a separate population from the Safari web panic, even when the same SSP user interface blends them in reporting.
## Consent and regs on the edge object
When GPP and TCF strings are decoded server-side, the OpenRTB regs and user.ext.consent fields should reflect the same legal interpretation your CMP emitted. A mismatch between what the page showed and what the edge forwards is still a compliance incident; it just moves from browser console errors to edge logs buyers never see. Google's remedies order already forces scrutiny of whether signals pass on equal terms across ad server routes, documented in our Prebid Server compliance record post. Safari edge auctions add a second axis: the signal was reconstructed server-side after sync pixels failed in the browser.
Global Privacy Control and US state strings need the same discipline. If the edge runtime forwards GPP but your buyer integration still reads legacy us_privacy only, regulated traffic can look opted out on one field and eligible on another. That is not Trusted Server specific; any server-side assembler must map CMP output to the OpenRTB fields each bidder actually reads.
For the browser-visible failure on The Trade Desk's insight.adsrvr.org universal pixel, see pixellint.org on Safari 27 and adsrvr.org . Conversion APIs do not backfill an auction that already went out with empty identity unless the edge path repopulates user.eids before the bid request leaves the publisher infrastructure.
## What to do this week
Label traffic by auction path in SSP exports: browser Prebid, Prebid Server, and edge Trusted Server should not share one Safari series without a dimension.
Capture paired JSON from the same placement before and after routing a slice through the edge runtime; diff user.eids , source.fd , source.tid , and regs.ext .
Ask each buyer whether edge-minted identity sources are allowlisted; treat unknown eids.source as a filter risk, not a supply quality win.
Track WebKit bug 324771 and iOS 27.2 release notes separately for delivery domains versus identity domains; recovery of adsrvr.org does not restore UID2 browser syncs.
Pin a commit hash or container image for edge deployments; absence of GitHub release tags means production is whatever main branch built last night.
Validate OpenRTB in CI on samples from both paths so schema drift is caught before live traffic hits buyer reason code 2.
Paste edge and browser captures into the bid request tester and read user.eids and identity sources . RTBlint is independent and not affiliated with IAB Tech Lab, Apple, Prebid.org, or The Trade Desk. It checks payload shape and internal consistency; it does not prove edge auctions recover revenue or bypass Safari policy.
## Sources
IAB Tech Lab: Trusted Server (updated October 5, 2026)
PPC Land: IAB Tech Lab pushes Trusted Server after Safari blocks The Trade Desk (October 10, 2026)
Digiday: Apple's Safari ad tech blocklist sends publishers back to IAB Tech Lab's Trusted Server (October 8, 2026)
WebKit Bug 324771 (Safari domain block list)
RTBlint: Safari 27 thins user.eids (October 9, 2026)
---
# Safari 27 can shrink user.eids on web bid requests while impression counts stay flat. · RTBlint
URL: https://rtblint.org/blog/safari-27-webkit-block-list-thins-user-eids/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## Safari 27 can shrink user.eids on web bid requests while impression counts stay flat.
October 9, 2026 · RTBlint
Apple began rolling out iOS 27 on September 14, 2026. Within a week, The Trade Desk engineer Ian Meyers filed WebKit bug 324771 because Safari refused requests to adsrvr.org, the company's core ad request and delivery domain. AdExchanger reported on September 29 that The Trade Desk could not serve ads in Safari on updated iPhones and iPads. On October 9, AdExchanger's "The Apple Bites Back" noted Apple may remove adsrvr.org from the block list in an iOS 27.2 beta while identity vendors remain blocked, and that WebKit may enforce a larger private list than the nine domains named in public code review.
## Request volume is the wrong health check
Publisher and SSP dashboards still show Safari browser sessions after an OS upgrade. Prebid and other wrappers still fire auction calls. OpenRTB request counts on device.os iOS and device.browser Safari can look unchanged week over week. That stability hides a different drop: the identity extensions that user-id modules populate after sync calls succeed.
In OpenRTB 2.6, extended identifiers live in user.eids , an array of objects each tagged with a source registrable domain and one or more uids . Buyers map those entries to UID2, ID5, RampID, and house graphs. When the browser never completes a sync because WebKit blocked the sync host at the network layer, the module exits quietly and the array is empty or missing the sources that still appear on Chrome traffic for the same site.
Sellers experience that as stable supply with softer CPMs or wider no-bid bands. Buyers experience it as Safari-looking inventory that fails addressability checks inside the bidder. Neither side sees a parse error: the request is valid JSON with fewer identity objects than last month's baseline.
## What WebKit actually blocks
Meyers' September 21, 2026 bug description ties Safari 27 behavior to a WebKit change merged for bug 307853 that introduced unconditional blocking via IS_REQUEST_UNCONDITIONALLY_BLOCKABLE . The public ticket lists domains bundled into that behavior, including uidapi.com, adsrvr.org, id5-sync.com, eu-1-id5-sync.com, rlcdn.com, pippio.com, permutive.com, and ad.gt. Meyers wrote that the intent appears to be blocking domains that power post-cookie identity, but that adsrvr.org is The Trade Desk's core ad request and delivery domain, not an identity graph, and that the match subdomain relies on legacy third-party cookies.
PPC Land and other coverage of the same bug note the check runs on registrable domains before WebKit's tracker exemption logic, so subdomains such as js.adsrvr.org and match.adsrvr.org inherit the same answer. That mechanism is why a pixel-focused failure and an auction-focused failure show up together on some stacks even though OpenRTB never names those hosts. For the browser pixel and universal tag consequences, see pixellint.org on Safari 27 and adsrvr.org .
On October 5, 2026, Apple WebKit privacy manager John Wilander asked Meyers to test iOS 27.2 beta build 24B5099f. Meyers replied that he saw changes in that build. AdExchanger on October 9 reported Apple may have removed adsrvr.org from the list in beta while leaving the identity vendors blocked, and that Apple keeps a separate private list vendors must decompile WebKit to discover. The ticket remains open; production iOS 27 devices may still block delivery domains until a public 27.2 ships.
## Where the bid request loses signal
Header bidding and identity modules run in the page context. A UID2 or ID5 module typically loads a sync URL, reads a token or cookie, then writes into user.eids on the outbound OpenRTB object. WebKit's block happens before that URL returns bytes. The module does not throw into the publisher console in a way sellers monitor; it simply omits the entry.
// Same page, two browsers — seller sees both as "Safari web"
{
"device": { "ua": "... Safari/27 ...", "os": "iOS" },
"user": {
"eids": [
{ "source": "uidapi.com", "uids": [{ "id": "A4AAA..." }] },
{ "source": "id5-sync.com", "uids": [{ "id": "ID5*..." }] }
]
}
}
// iOS 27 with sync hosts blocked — still a valid request
{
"device": { "ua": "... Safari/27 ...", "os": "iOS" },
"user": {}
}
Downstream systems that keyed frequency, deal eligibility, or model features on user.eids[].source now see anonymous web. If the bidder falls back to IP or coarse geo, buyers may still bid, but not with the same confidence the line item name implies. If the bidder hard-requires UID2, the same impression becomes a no-bid with reason codes that never reach the seller.
Google's ad tech remedies ruling, which we covered in Prebid Server as compliance record , already forces arguments about whether identity and consent signals pass on equal terms across routes. Safari shrinking user.eids on one browser slice is a parallel pressure: the signal never existed to pass, regardless of ad server fairness.
## Why ATT comparisons mislead ops
AdExchanger's October 9 piece quotes editors comparing the block list to App Tracking Transparency. ATT constrained identifier use after consent prompts. The WebKit list blocks network access to named registrable domains during ordinary browsing, which stops parts of the ad stack from operating at all on affected builds, not only from reading IDFA.
Conversion APIs and server-side identity were the industry's answer to ATT on mobile apps. Mobile web and in-browser programmatic still depend on modules that call third party hosts before the bid request leaves the page. When those hosts are on the list, server-side CAPI does not backfill OpenRTB: the auction already went out thin.
Ops teams that split reporting by OS version but not by Safari minor release will blend iOS 26 sync-rich traffic with iOS 27 sync-blocked traffic. Addressability metrics look like model drift when the population changed at the network layer.
## What to do this week
Capture paired bid requests from the same placement on iOS 26 and iOS 27 Safari, then diff user.eids , user.ext , and any Prebid userId keys.
Break out Safari traffic by OS build in SSP exports; do not rely on aggregate Safari CPM as a single series.
Map each eids.source you bid on to the sync host it requires; cross-check that host against the public WebKit ticket list and your own network logs on iOS 27.
Treat empty user.eids on regulated traffic as a consent and policy question, not only a supply quality question, before forwarding IDs from other contexts.
If you depend on adsrvr.org for delivery, track iOS 27.2 beta release notes separately from identity domains; delivery recovery does not restore UID2 entries.
Validate OpenRTB shape in CI so missing arrays are caught as schema issues, not mistaken for intentional anonymization.
Paste captured requests into the bid request tester and read user.eids and source domains for field-level detail. RTBlint is independent and not affiliated with Apple, WebKit, The Trade Desk, or Prebid.org. It checks whether payloads match OpenRTB and AdCOM; it does not detect browser block lists or restore blocked sync calls.
## Sources
WebKit Bug 324771: Inclusion of adsrvr.org in IS_REQUEST_UNCONDITIONALLY_BLOCKABLE domain list
AdExchanger: The Apple Bites Back (October 9, 2026)
AdExchanger: Apple's Latest Operating System Blocks The Trade Desk From Serving Ads On Safari (September 29, 2026)
pixellint.org: Safari 27 blocks adsrvr.org universal pixel
---
# A publisher clean on your exchange IVT log can still carry a clawback warning on another seller path. · RTBlint
URL: https://rtblint.org/blog/pixalate-clawback-warning-is-not-your-exchange-ivt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## A publisher clean on your exchange IVT log can still carry a clawback warning on another seller path.
October 6, 2026 · RTBlint
On October 6, 2026, Pixalate introduced a Clawback Warning label in its Media Ratings Terminal. The label marks CTV apps, mobile apps, and websites with invalid traffic disputes reported against them, drawing on transactions monitored across 745 global ad exchanges. Pixalate evaluates more than 17.5 million apps and sites and refreshes the warning monthly over a rolling 12-month window. For SSP inventory quality teams, that is a new onboarding signal. It is not a substitute for your own impression IVT rate on the same publisher this week.
## What clawbacks measure versus what IVT measures
Impression-level invalid traffic classification asks whether a specific served event looked invalid under a vendor model at bid or render time. A clawback, in this product framing, is a buyer dispute record: inventory that led to credits or makegoods after delivery. Pixalate states the warning is meant to prompt research before onboarding, not to act as a verdict, and that MRT shows how many months were affected, not who filed each clawback.
Those are related problems with different denominators. A publisher can serve impressions on your exchange that pass your filters while the same bundle generates disputes on another path you never see in your logs. Your dashboard shows a low post-bid IVT share. MRT can still show a Clawback Warning with a months-affected count such as four of twelve, refreshed monthly.
Pixalate also separates the warning from impression-level IVT measurement in the announcement copy. Treating the label as a restatement of your quarterly IVT benchmark misreads the object. It is dispute history aggregated across exchanges, not a replay of your auction telemetry.
## Waterfall inventory splits quality by seller path
The October 6 post names waterfall detection explicitly. Publishers can sell higher-quality traffic through some SSPs and lower-quality traffic through others, especially in international markets. Each exchange sees only its own disputes and only its own impression stream. Low IVT on your path therefore does not automatically make a publisher safe to onboard globally.
OpenRTB still identifies inventory with app.bundle , site domain, and publisher identifiers. It does not carry which sibling SSP received the bad slice last month. Screening tools that only query your internal IVT table will miss cross-path clawbacks until a buyer escalates outside your ticket system.
The same release compares the label to an ecommerce high-return badge: a reason to read reviews before purchase, not a ban. For supply teams, the operational read is due diligence on apps and sites already in market, not only at signup. Continuous monitoring each month for new clawbacks reported by buyers elsewhere is part of the stated use case.
## How the label is built
Inputs include apps and websites named in clawbacks filed through Pixalate Clawback Tool plus third-party clawback submissions reviewed against evidence. The lookback is a rolling 12 months, matching the Clawback Tool window, with monthly refresh. Output is the Clawback Warning on the app or site MRT page with month-by-month records and a months-affected count.
Pixalate applies the label automatically and removes it after 12 months without a reported clawback. No party can add or remove it manually. Coverage spans Apple App Store, Google Play, Roku, Amazon Fire TV, Samsung TV, Apple TV, and LG TV alongside web properties, including ads.txt-verified publishers named in the release.
System metrics published with the launch include 17.5 million plus evaluated properties, 745 global ad platforms in the monitoring set, monthly updates, and the 12-month lookback. Those figures describe the rating universe, not your exchange share of it.
## What SSP teams can do on the bidstream side
Clawback warnings live in a ratings terminal, not in OpenRTB. Your ingress pipeline still controls whether inventory enters the market at all. Pair external labels with bundle and domain checks you can enforce: app-ads.txt authorization, schain completeness, and consistent app.bundle typing before the request reaches buyers.
Structural risks such as delisted apps that keep bidding are a adjacent failure mode we covered separately on RTBlint. Impression IVT does not catch delisting; app-level exclusion does. Clawback warnings are another app-level or site-level signal that impression filters can miss when the events on your path look normal.
Onboarding: research MRT clawback months before approving new publishers, especially when they already sell through multiple SSPs.
Waterfall review: compare dispute labels with sell-path maps when international traffic spikes without matching quality on your exchange.
Do not merge dashboards: keep clawback research separate from impression IVT rates so a falling IVT chart does not hide rising dispute months.
Validate requests: paste production CTV and mobile requests into the bid request tester so policy runs on the same shape buyers receive.
## The honest limit
A vendor-maintained clawback label reflects disputes filed through specific tools and reviewed third-party submissions. It will not list every buyer credit in the market, and it is not a pre-bid field you can require in OpenRTB today. It closes a due diligence gap: publishers that look fine on your path while accumulating disputes elsewhere.
RTBlint checks bid request shape and consistency. It does not call MRT or classify invalid traffic. A clean RTBlint result is not a clean clawback history. It is proof the request you are about to sell is structurally readable.
## Sources
Field names refer to OpenRTB as published by IAB Tech Lab. Clawback and system metrics quotes are from Pixalate October 6, 2026 blog post. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Pixalate.
Pixalate: Clawback Warning across 17.5M+ programmatic publishers, October 6, 2026
PPC Land: Pixalate flags apps and sites hit by ad fraud clawbacks, October 6, 2026
RTBlint: Delisted CTV apps and pre-bid blocklist gaps
VASTlint: Wrapper ClickThrough validation
---
# Gannett survived summary judgment on Enhanced Dynamic Allocation because cream-skimming is an allocation-order problem, not a bad bid request. · RTBlint
URL: https://rtblint.org/blog/gannett-eda-cream-skimming-header-bidding-order/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## Gannett survived summary judgment on Enhanced Dynamic Allocation because cream-skimming is an allocation-order problem, not a bad bid request.
October 3, 2026 · RTBlint
On September 30, 2026, Judge P. Kevin Castel denied most of Google's summary judgment motion against Gannett and the Daily Mail in the publisher antitrust MDL, Document 2041 in 21-md-3010. Trade coverage on October 2 framed the ruling as a path toward roughly $1.5 billion in combined publisher damages claims. The engineering takeaway is narrower: practices the Virginia remedies case never adjudicated, including Enhanced Dynamic Allocation, Minimum Bid to Win, and the Bernanke family of bidding programs, will go to a jury because the record ties them to who sees an impression before anyone sends an OpenRTB bid.
## What the court kept for trial
Castel's 88-page opinion separates precluded conduct from what the parties call non-precluded acts. Issue preclusion from Judge Brinkema's April 2025 liability findings already bars Google from relitigating the DFP-to-AdX tie, First Look, Last Look, Dynamic Revenue Share, and Unified Pricing Rules for these publishers. The September 30 ruling is where injury and damages meet Google's Daubert and summary judgment challenges on everything else.
For Gannett and the Daily Mail, Google's motion to exclude economists Shengwu Li and Ali Hortacsu failed. Google won only on New York General Business Law claims. Hortacsu's totals in the opinion are $599,955,198 for the Daily Mail and $900,771,489 for Gannett, plus interest accrual. A certified AdX publisher class keeps parallel expert work from Einer Elhauge. None of those figures is an award; they are estimates a jury may accept or reject.
That posture matters for buyers and exchanges because it preserves a factual record about auction order, not just take rates. When a demand team sees header bidding lose share on a premium publisher, the default explanation is bid price or signal quality. The surviving claims describe a world where the ad server can clear reserved direct inventory through the house exchange at manipulated temporary floors before rival exchanges receive the same opportunity to bid.
## Enhanced Dynamic Allocation as cream-skimming
Enhanced Dynamic Allocation, implemented in 2014, made impressions publishers had reserved for negotiated direct deals available for programmatic bids on AdX. Before EDA, DFP prioritized fulfillment of those direct sales. Under EDA, AdX stopped prioritizing them and assigned a temporary price lower than the price the publisher had already attached to the direct deal. Li describes a cream-skimming problem: AdX could transact even when the direct price was higher, creating adverse selection that reduced advertisers' willingness to buy direct.
The opinion quotes Google's internal description of the feature as a way to let AdX and AdSense buyers cherry-pick higher revenue impressions while respecting delivery constraints on reservation ads. Hortacsu concludes EDA decreased the global value of direct sales by approximately 24.1%. For Gannett alone, Hortacsu attributes about $348.9 million in United States damages and $434.8 million worldwide to EDA, roughly 48% of that publisher's total claim in his model.
Li also opines that EDA probabilistically throttled bidders arriving through header bidding, because only AdX could reach the high-value impressions siphoned from direct reservations. That is not a malformed imp.banner or a missing source.ext.schain node. It is sequencing inside the ad server: the impression may never reach the exchange you instrumented at the same moment or with the same economic floor the publisher thought applied to the direct contract.
## Minimum Bid to Win and asymmetric auction data
Google adopted Minimum Bid to Win when AdX moved to a first-price auction in 2019 and dropped Last Look. Under MBTW, DFP shared with AdX bidders and exchange-bidding participants the lowest bid that would have won a just-concluded auction, which tells the winner how much it overpaid. A Google engineer declaration summarized in the opinion describes Google Ads modeling expected competition from bid landscapes built from past auctions, including minimum-bid-to-win data since 2019.
Li opines that rival exchanges did not receive the same information, so only AdX buyers could predict the winning price with comparable precision. The court found that evidence sufficient for a jury on whether the feature depressed publisher prices and discouraged bidding on non-Google exchanges. For a supply-path analyst, MBTW is a reminder that two bid streams on the same page can carry different post-auction telemetry even when the OpenRTB request objects look identical at capture time.
OpenRTB has optional machinery to surface outcomes: loss notices through lurl , macros such as ${AUCTION_LOSS} , and community loss reason codes. Those fields help only when the exchange populates them and the ad server forwards them in a form the publisher reads. MBTW, as described in the litigation record, flows to house buyers and exchange-bidding participants, not necessarily to every header-bidding adapter logging the same impression id in your warehouse.
## Bernanke and win-rate economics on the bidstream
The opinion treats Project Bernanke, Global Bernanke, Bell, and Alchemist as a related family. Plaintiffs allege Google used its Google Ads buying tool to inflate and deflate advertiser bids on AdX, charging winners more than the price paid to the exchange and banking differences in pools that subsidized Google Ads bids where outside competition was strong. Internal memoranda quoted in the record include estimates that Bernanke increased AdX win rate from 37% to 44% with a match rate of 50%, and revenue by $290 million in one scenario.
Hortacsu's report, summarized in footnotes the court cites, models how much Google would have had to cut AdX take rate to replicate win-rate lifts from other programs. Dynamic Revenue Sharing's 1.59 percentage point win-rate change, in his table, corresponds to lowering AdX take rate by 4.35 points from 20% to 15.65%. Unified Pricing Rules' 6.48 point win-rate change corresponds to a 16.18 point take-rate cut. For Bernanke, Global Bernanke, Last Look, and Alchemist, the opinion notes the win-rate increases were so large that a take-rate adjustment alone could not replicate them.
A buyer debugging low win rate on a major news publisher will still start with floors, deal ids, and creative approval. The surviving claims add a second checklist: compare house demand paths against header-bidding paths on the same placement, not only the JSON your bidder emitted. Win rate is an outcome; the MDL record is about programs that moved outcomes while exchanges argued over request parity.
## How this differs from the Prebid remedies ruling
On September 2, 2026, Judge Brinkema ordered behavioral remedies in the government case, including functionally equivalent Prebid integrations and deprecation of Unified Pricing Rules for indirect transactions. RTBlint covered that ruling as an OpenRTB compliance problem: the bid request Prebid Server emits becomes evidence of equivalence. Castel's September 30 opinion in the publisher damages MDL does not change a field in OpenRTB 2.x. It changes what logs you need when a publisher asks why non-Google demand lost on inventory they believed was reserved for a direct buyer.
Read the two rulings together. Brinkema forces new hops and data sharing on a six-year clock. Castel lets Gannett and the Daily Mail take allocation programs to a jury now. Exchanges and DSPs that only instrument the header-bidding hop may be blind to the ad server decision that preceded the call. That blind spot is supply-path diagnostics, not creative delivery.
For a cross-site angle on browser-side identity shrinking while auction disputes intensify, see Safari 27 blocking adsrvr.org . Fewer sync pixels fire; more weight lands on whatever ids still arrive in user.eids . The Gannett record is about order of sale inside DFP, not Safari, but both stories push the same lesson: validate what you can observe on the wire, and separate that from ad-server logic you never received as a bid request.
## What to log before you blame the bid request
Timestamp the ad server decision separately from the exchange auction. If EDA-style allocation runs first, your OpenRTB capture may start after the impression already cleared through house demand.
Store floor currency and value on every hop, including temporary floors on inventory tagged as direct or reservation in the ad server UI. Mismatch against imp.bidfloor is a data defect worth escalating even when the request validates.
Compare win, loss, and timeout rates between exchange bidding and Prebid adapters on the same ad unit. A gap concentrated on high-CPM slots matches cream-skimming theories better than a universal nbr 2 invalid request spike.
Normalize loss reporting on OpenRTB loss reason codes and lurl where partners provide them. Absence of a loss code is itself a signal when MBTW-style feedback allegedly flows only to house buyers.
Paste captured requests into the bid request tester to prove your side emitted valid OpenRTB. Validation passes do not prove you were called in time to compete for the impression.
Read the Prebid remedies post for the compliance record Brinkema ordered, and Prebid vs TAM vs Open Bidding for how parallel demand stacks already coexist on the same page.
RTBlint is independent and not affiliated with Google, Gannett, or any party to 21-md-3010. It checks whether a request or response matches OpenRTB and AdCOM. It does not detect antitrust injury, cream-skimming, or cartel behavior. It helps you show the payload your exchange sent was structurally valid when the publisher asks why you lost.
## Sources
In re Google Digital Advertising Antitrust Litigation, No. 21-md-3010 (PKC), Opinion and Order ECF 2041 (S.D.N.Y. Sept. 30, 2026)
PPC Land: Google loses bid to end Gannett and Daily Mail ad tech suits (Oct. 2, 2026)
RTBlint: Google ad tech remedies ruling and Prebid Server bid requests
Editor and Publisher: Publishers clear major hurdle in Google ad-tech antitrust fight (Oct. 1, 2026)
IAB Tech Lab: OpenRTB 2.x specification
---
# The Google ad tech remedies ruling routes AdX and DFP through Prebid, so the bid request Prebid Server builds becomes the compliance record. · RTBlint
URL: https://rtblint.org/blog/google-remedies-ruling-prebid-server-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
## The Google ad tech remedies ruling routes AdX and DFP through Prebid, so the bid request Prebid Server builds becomes the compliance record.
October 1, 2026 · RTBlint
On September 2, Judge Leonie Brinkema rejected the Justice Department's request to force Google to sell AdX, open-source the DFP final auction logic, or divest the rest of DFP. She accepted most of the behavioral remedies both sides had proposed, as modified by the court. The headline was that Google keeps its stack. The part that lands on engineering teams is different: AdX and DFP have to interoperate with Prebid on terms that are functionally equivalent to how they work with each other, and the evidence for equivalence will be the requests and responses that cross those new connections.
## What the court actually ordered
The written opinion, unsealed later in September without redactions, found structural remedies neither realistic nor needed. In their place the court adopted interoperability and data-sharing remedies, anti-discrimination rules, and a monitor with a technical committee. The Final Judgment runs for six years, applies worldwide, and takes effect 60 days after it is entered. The parties were given 30 days from the order to file one jointly proposed judgment, so the operative text is being negotiated now.
Four remedies matter on the wire. Google must build an API from AdX to Prebid covering indirect open-web display inventory. It must build an API and a server-to-server connection from DFP to Prebid Server, so the publisher's auction can run inside Prebid. AdX must submit real-time bids to rival publisher ad servers in the same manner it currently bids into DFP. And AdX winning and losing bid data has to be made available to publishers. First Look and Last Look stay barred, and Unified Pricing Rules have to be deprecated for all indirect transaction types, which means publishers regain the ability to set different floors for different exchanges.
Timing is uneven. Google committed to 12 to 15 months for the DFP to Prebid integration, and the court deferred to Google wherever its estimate was shorter than the plaintiffs'. For AdX bidding into rival ad servers the plaintiffs proposed six months and Google twelve, and the opinion left that number for the parties to settle. A separate case moved on October 1: Judge P. Kevin Castel in New York ruled that USA Today, Daily Mail, and a class of about 5,000 publishers can seek more than $3.2 billion in damages over the same AdX conduct. Neither ruling changes a single field in OpenRTB. Both raise the price of not being able to show what was sent.
## The new hop is an OpenRTB request someone will audit
The plaintiffs' proposed judgment, which the court drew on for the Prebid wording, describes the DFP side in three steps. For each impression DFP sends floors, data signals, and publisher first-party data to Prebid Server. Prebid Server sends bid requests to every source of programmatic demand the publisher specified. Prebid Server returns bids and data about the ad candidates to DFP, which keeps the final comparison against the publisher's direct deals.
The middle step is an ordinary OpenRTB 2.x bid request, emitted by Prebid Server from inputs DFP supplied. That is the artifact a monitor, a technical committee, or a publisher's own analyst will compare when the question is whether AdX demand saw the same impression through Prebid that it used to see through DFP. Functionally equivalent is a legal standard. In practice it gets argued with two captures of the same impression side by side, and any field that is missing, mistyped, or translated differently on one side becomes an exhibit.
{
"id": "req-7f3c",
"imp": [{
"id": "1",
"banner": { "format": [{ "w": 300, "h": 250 }] },
"bidfloor": 1.20,
"bidfloorcur": "usd",
"ext": { "tid": "b9a1-imp-1" }
}],
"site": { "domain": "news.example", "page": "https://news.example/a/123" },
"source": {
"tid": "b9a1",
"schain": { "complete": 1, "ver": "1.0", "nodes": [{ "asi": "Publisher.Example", "sid": "123", "hp": 1 }] }
},
"regs": { "gpp_sid": [7] },
"user": { "eids": [{ "source": "uidapi.com", "uids": [{ "id": "A4AAA..." }] }] }
}
Every line in that request would survive a casual glance and every one has a problem a buyer's parser can act on. The floor currency is lowercase, which openrtb.imp.bidfloorcur_format_invalid reports because ISO 4217 codes are uppercase. The GPP section id arrives without a GPP string, which is openrtb.regs.gpp_sid_without_gpp . The supply chain node ASI is not a lowercase domain, which is openrtb.schain.node.asi_not_lowercase . None of these is exotic. They are the ordinary mistakes that appear when one system translates another system's internal state into OpenRTB for the first time, which is exactly what the DFP to Prebid Server bridge will do.
## Floors stop being one number
Unified Pricing Rules forced a single floor across AdX and third-party exchanges inside DFP. With UPR deprecated for indirect demand, publishers can price exchanges differently again, and the place those floors travel is imp.bidfloor and imp.bidfloorcur on each outbound request, or pmp.deals[].bidfloor when the impression is in a deal. Per-bidder floors multiply the number of request variants for one impression. They also multiply the chances that one variant carries a floor in the wrong currency, a negative value from a bad rule, or a deal floor that contradicts the open floor.
The court framed equivalence around AdX receiving and returning data on materially identical terms. A floor that DFP set in one currency and Prebid Server forwarded in another, or a deal floor that never made it onto the request, is a measurable difference in terms. Log the floor DFP passed in, the floor Prebid Server sent out per bidder, and the currency on each. If those three columns do not reconcile, the integration is not equivalent, regardless of what the API documentation says.
## Data signals are now a discrimination question
The anti-discrimination remedies require Google to use and pass data signals regardless of whether its own tools are involved, and require AdX to pass bids to publisher ad servers and header bidding auctions, including Prebid, without regard to Google ownership. Google argued for, and the court accepted, a clarified list of the signals covered, with carve-outs for privacy policies, governing law, spam, and fraud. Whatever that list says in the final text, the signals it names have concrete homes in a bid request: user.eids for identity, regs and regs.gpp for consent, device and site for context, and source.schain for the path.
An identity entry that reaches one bidder with its source domain and another without it is a signal passed on different terms, and openrtb.eid.field_required catches the missing half. A GPP string that is present on the AdX path and stripped on the Prebid path changes which buyers can bid in regulated states. A supply chain that gains a node on one route and not the other changes how a buyer scores directness. These are the comparisons a technical committee will make, and they are cheaper to make in CI than in a compliance review.
The ruling also lands while browser-side identity is shrinking. Safari 27, which began rolling out on September 14, blocks requests to uidapi.com, ID5, LiveRamp, and Permutive domains, according to a WebKit bug filed by The Trade Desk. Fewer identity entries will originate in Safari pages, so the user.eids array that does arrive carries more weight and deserves stricter validation.
## Win and loss data needs a shared vocabulary
Making AdX winning and losing bid data available to publishers is the remedy most likely to change dashboards. OpenRTB already has the plumbing: the loss notice URL lurl on a bid, the ${AUCTION_LOSS} macro, and the community loss reason code list maintained alongside the 2.x spec. Publishers who want to compare AdX outcomes with other demand should normalize on those codes rather than on whatever labels each source invents. A reason 102 (lost to higher bid) means the same thing from every exchange only if every exchange actually sends it.
Responses need the same discipline. A bid returned through Prebid Server without mtype forces the publisher side to guess the creative type, which openrtb.bid.mtype_missing flags. A response with neither seatbid nor nbr gives the analyst nothing to file as a no-bid reason. When the monitor asks why AdX lost a given impression through Prebid, an empty response body does not answer the question.
## What to do before the integrations ship
Capture a baseline now: the DFP to AdX path as it runs today, impression by impression, so there is something to compare the Prebid path against later.
Validate the requests Prebid Server emits in CI, not only the ones it receives. The outbound request is the one buyers and auditors see. For the inbound auction call, the prebid-server profile adds the PBS requirements the spec leaves optional, such as bidder params under imp.ext.prebid.bidder or a stored request id.
Log floors per bidder with currency, and reconcile them against the floor the ad server intended. Treat a mismatch as a defect, not a rounding issue.
Diff user.eids , regs , and source.schain between routes for the same impression. A signal present on one route and absent on another is the definition of unequal terms.
Standardize loss reporting on OpenRTB loss reason codes and lurl before the AdX win and loss feed arrives, so the new data lands in an existing schema.
Require mtype on every bid and a reason on every no-bid, so the return leg of the integration is as auditable as the outbound one.
Paste a captured request into the bid request tester , wire the same check into a pipeline with the CI validation guide , and read loss reason codes and nurl vs burl vs lurl for the return leg. For how header bidding and ad server demand already coexist, see Prebid vs Amazon TAM vs Open Bidding . RTBlint is independent and not affiliated with Google, Prebid.org, or any party to either case. It checks whether a request or response matches OpenRTB and AdCOM. It does not decide what the court will consider equivalent.
## Sources
US v. Google LLC, No. 1:23-cv-108 (E.D. Va.), Memorandum Opinion on remedies, Dkt. 1858
US v. Google LLC, Order rejecting structural remedies, Dkt. 1857 (September 2, 2026)
Department of Justice: Justice Department again wins substantial relief against Google
AdExchanger: The court unsealed Judge Brinkema's remedies decision
Bloomberg via Claims Journal: Google faces $3.2 billion damage claims on ad tech (October 2, 2026)
IAB Tech Lab: OpenRTB 2.x specification and community extensions
---
# European programmatic CTV can grow 44 percent while open auction samples stay STB-heavy, because most programmatic views clear as guaranteed deals. · RTBlint
URL: https://rtblint.org/blog/europe-programmatic-guaranteed-not-open-auction-slice/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## European programmatic CTV can grow 44 percent while open auction samples stay STB-heavy, because most programmatic views clear as guaranteed deals.
September 29, 2026 · RTBlint
Trade coverage this week repeats the same headline: connected TV now accounts for 53 percent of premium video ad views in Europe, programmatic views grew 44 percent year on year, and more advertisers bought through automation. Those numbers come from a biannual ad-server report on first-half 2026 delivery across the United States and fourteen European countries. They describe impressions that already cleared inside one monetization stack. They do not, by themselves, describe the open RTB request your bidder sees when you buy Europe from a US-trained integration.
## Programmatic growth is not one auction shape
The underlying report compares January through June 2026 with the same months of 2025. It defines an ad view as each time an ad is displayed, aggregated from the vendor platform. Total streaming ad views rose 12 percent in the US and 20 percent in Europe. Programmatic ad views rose faster: 25 percent in the US and 44 percent in Europe, roughly twice the pace of total delivery in each region. Unique advertisers delivering programmatically rose 25 percent across both regions combined, while ad views from those advertisers rose 24 percent.
Programmatic still represents a minority of all ad views on that stack: 34 percent in the US and 22 percent in Europe. The European programmatic market is smaller as a share of delivery but expanding faster in rate terms. That combination is easy to misread as deepening open competition. The same report splits programmatic delivery by deal type, and the split is where the bidstream story diverges from the press release.
Of programmatic ad views, 27 percent in the US were guaranteed deals. In Europe, 71 percent were guaranteed. The glossary classifies a deal as guaranteed when its deal type includes programmatic direct: a transaction priority that reserves supply by guaranteeing purchase of a set number of impressions. Everything else in programmatic counts as non-guaranteed. Europe programmatic growth is therefore dominated by a contract shape that often never touches the anonymous open auction your QA environment samples.
## What guaranteed means on the wire
OpenRTB still carries guaranteed inventory as structured deals, not as a mystery flag on a generic impression. A buyer expecting open exchange traffic looks for an impression without a private marketplace block, or with an empty deals array. Guaranteed programmatic direct shows up as imp.pmp.deals[] entries with identifiers, floors, and auction types negotiated ahead of time. The bidder that wins is the one entitled to the deal id, not the highest unconstrained bid in a public pool.
"imp": [{
"id": "1",
"video": { "mimes": ["video/mp4"], "minduration": 5, "maxduration": 30 },
"pmp": {
"private_auction": 1,
"deals": [{
"id": "FW-EU-PG-88421",
"bidfloor": 18.50,
"bidfloorcur": "EUR",
"at": 3
}]
}
}]
A request like this is programmatic in the ad-server report sense because automation connects buyer and seller. It is not the same diagnostic object as an open imp with no pmp block. When European broadcasters expand programmatic pipes, press examples include UK broadcasters opening video-on-demand inventory to multiple DSPs with programmatic guaranteed and private marketplace paths. That pattern matches a market where 71 percent of programmatic views clear as reserved supply rather than as leftover open slots.
Buyers who debug Europe using only open-exchange captures from US sellers import the wrong prior. Non-guaranteed programmatic in the US already skews heavily to CTV: 92 percent of US programmatic impressions on the same stack, with mobile at 6 percent and desktop at 2 percent, and set-top box VOD below half a percent. European programmatic on the same definition carries 39 percent on CTV, 28 percent on set-top box VOD, 25 percent on mobile, and 8 percent on desktop. More than a quarter of European programmatic impressions in that dataset run on a device category that barely registers in US programmatic.
## Device mix breaks filters before price
Total delivery mix reinforces why a US bidder cannot transpose filters. Connected TV carried 86 percent of all ad views in the US on the platform, unchanged from the prior half-year. Europe recorded CTV at 53 percent of ad views, mobile at 24 percent, set-top box VOD at 16 percent, and desktop at 7 percent. CTV ad views grew 15 percent in the US and 33 percent in Europe, but the European headline share still leaves substantial STB and mobile delivery in the same monetization report that celebrates CTV majority.
OpenRTB expresses device class through device.devicetype and through app metadata on app.bundle . A buyer rule set that assumes devicetype=3 (connected TV) for every premium video imp will mis-route STB VOD and phone streaming that European sellers still sell as premium. The report itself notes European device usage is more evenly distributed. Enriched metadata percentages inside customized key-value pairs are computed only on the enriched slice of supply; Genre leads US enriched video keys at 66 percent, while Europe ranks ContentTitle and ContentLanguage above Genre at 50 and 48 percent versus 38 percent for Genre.
"device": { "devicetype": 7, "ua": "…", "geo": { "country": "DEU" } },
"app": { "bundle": "com.operator.stb.vod", "name": "…" },
"content": { "language": "de", "title": "…" }
A German STB VOD imp may validate as well-formed video while failing a buyer segment built for Samsung or Roku CTV bundles. That failure surfaces as no-bid or low participation long before anyone argues about creative. External analyses cited in the same coverage note that only about 40 percent of CTV bid requests in the wider market carry usable program-level content signals, which is a different denominator from enriched-field percentages inside the vendor slice. Both facts push the same direction: European programmatic growth can accelerate while the open requests you log still look sparse or unfamiliar compared with US CTV training data.
## What completion rates do and do not prove
The report publishes average completion rates for pre-roll, mid-roll, and post-roll at 94, 98, and 91 percent across US and Europe combined, measured on delivery to Roku, Samsung TV, and Amazon Fire TV as the three most popular CTV sub-devices. Sellers read that as premium engagement. Skeptical buyers note that non-skippable in-stream formats push completion toward structural highs regardless of bidstream quality. The report does not define skipability or publish denominators for the completion sub-group.
Completion is a post-auction playback statistic on served ads. It cannot rescue a buyer who filtered valid European STB or mobile imps before bidding. Conversely, high completion on guaranteed deals does not tell an open-exchange buyer why their European line item under-delivers: the guaranteed 71 percent share may be clearing through deal ids your seat never received because the integration path was open-only.
RTBlint is independent and not affiliated with Comcast, FreeWheel, or the publishers cited in trade coverage. The linter checks whether a captured request matches OpenRTB and AdCOM expectations. It does not score fraud, viewability, or completion. It does catch missing pmp blocks where your trafficking brief promised a deal, inconsistent device and app fields, and video objects that will not parse on the bidder side.
## Checklist for European CTV demand
Split logs by deal class: guaranteed programmatic direct ( imp.pmp.deals with negotiated ids) versus non-guaranteed programmatic versus true open imps without pmp .
Compare device mix on European programmatic captures to US open CTV samples. Expect STB VOD and mobile shares far above US programmatic norms.
Do not treat headline CTV share of all ad views (53 percent in Europe) as the device mix inside programmatic or inside open auction subsets.
When metadata enrichment is partial, log whether targeting filters require Genre, series, or language fields that appear on less than half of enriched European video keys in vendor benchmarks.
Align sales promises on guaranteed reach with the deal ids actually emitted on imp.pmp.deals ; open-exchange filters will not see reserved European inventory.
Where BidResponse.nbr is returned, bucket no-bids separately for invalid request versus unsupported device before blaming weak European demand.
Validate a recent European capture in the OpenRTB validator or read no-bid reason triage if participation dropped after expanding EU sellers. The fix is often deal and device segmentation, not another round of US CTV prospecting.
## Sources
PPC Land: coverage of FreeWheel 1H 2026 Video Monetization Report (guaranteed 71% vs 27%, programmatic growth, device mix, metadata section)
Advanced Television: CTV 53% of premium video ad views in Europe, live share shift, Genre in enriched requests (September 29, 2026)
IAB Tech Lab: OpenRTB specification (imp.pmp, video object)
---
# Authorized Buyers vs OpenRTB is a spec request plus at 3 and imp.ext.billing_id. · RTBlint
URL: https://rtblint.org/blog/authorized-buyers-vs-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## Authorized Buyers vs OpenRTB is a spec request plus at 3 and imp.ext.billing_id.
September 27, 2026 · RTBlint
Authorized Buyers vs OpenRTB is not a different auction protocol. It is OpenRTB plus a documented profile: request at of 3 means fixed price on that path, and each impression needs imp.ext.billing_id . The specification's own at values are 1, 2, and 500 or greater.
## at 3 on the request is the profile, not the spec
In the OpenRTB specification, at 1 is first price and at 2 is second price plus. Omitted, the default is 2. Values of 500 or greater are exchange-specific. Deal.at 3 is a different field: on a deal, 3 means the deal bidfloor is the fixed price. That deal override does not make request-level at 3 legal in a spec-only check.
Google Authorized Buyers documents request at 3 as fixed price and requires imp.ext.billing_id . RTBlint applies that on top of the spec when you pass --profile google-ab , or when you pick Google AB in the tester . A spec pass can reject the fixed-price auction type the buyer path uses. A google-ab pass can accept at 3 and still fail because billing_id is missing. Run the profile you speak, and run spec when a partner also consumes the plain object.
Do not copy at 3 onto a Prebid or TAM request and call it Authorized Buyers. Those assemblies are different bodies. The profile is not implied by the fact that Google is somewhere in the stack. Open Bidding builds its own request. The comparison of who builds the JSON is the three paths post .
## billing_id is not a deal id
imp.ext.billing_id is the Authorized Buyers billing identifier on the impression. Deal.id is the commercial deal. A preferred deal or a guaranteed deal still uses Deal.at and guar inside pmp . Putting the billing id in Deal.id , or omitting ext.billing_id because a deal id is present, fails the profile while the spec object can look complete.
Spec JSON wants integer flags. at as a string fails a typed parser on every profile. Protobuf JSON is a separate dialect for the 28 bool flags. at itself stays an integer in both. Set dialect and profile as two choices. The CI action takes both: profile: google-ab and dialect: spec-json or proto-json .
Pin the OpenRTB snapshot separately. The profile adds Google's extras. It does not pick 2.5 versus 2.6-202505. A google-ab request can still carry regs.ext.gdpr and fail a 2.6 pin for a moved field. Validate snapshot, dialect, and profile together on the builder output, not on a sample edited until the badge turned green.
## Other profiles are not this one
prebid-server, xandr, and magnite are different extras. Prebid Server refuses wseat and bseat and wants a bidder or a stored request on the impression. Authorized Buyers wants billing_id and allows request at 3. Turning on google-ab for a Prebid Server body, or prebid-server for an Authorized Buyers body, produces a red job that describes the wrong exchange. Name the profile in the CI step next to the fixture that builder emits.
Deal.at 3 remains the way a preferred or guaranteed deal encodes a fixed price inside pmp, on any profile. That can sit on an Authorized Buyers request that also has request at 3 and a billing_id. They are two fixed-price mechanisms. The deal price is Deal.bidfloor in Deal.bidfloorcur. The request auction type is at. Read both. A test that only sets one of them does not prove the IO.
The tester profile dropdown includes Google AB. Set it before you trust a pass on a payload that uses at 3. A spec pass on that file is allowed to complain. A google-ab pass that never looked for billing_id is the job you did not configure. RTBlint is not Google. The profile is the published extra, not a live call to Authorized Buyers.
## What to run
Spec check: at is 1, 2, or 500 and above. Request at 3 is not that list.
Authorized Buyers check: --profile google-ab , at 3 allowed, imp.ext.billing_id required.
Do not treat Deal.at 3 as permission to set request at 3.
Do not put the billing id in Deal.id .
Pin spec-version as well as the profile.
A spec-only CI job will not notice a missing billing_id .
## Fixed price on the deal is not fixed price on the request
A programmatic guaranteed or preferred deal uses Deal.at 3 inside pmp. That is legal OpenRTB. Request at 3 is the Authorized Buyers extra. A fixture that only sets the deal flag will pass spec and fail google-ab if billing_id is missing and the request at is 3. A fixture that only sets request at 3 will fail spec and pass the profile only when billing_id is present. Build the fixture from the serializer that production uses.
Dialect stays independent. Integer flags for spec JSON, bools for protobuf JSON, and at as an integer in both. A bool at is wrong everywhere. Pin spec-version, dialect, and profile in the same CI step so a green badge names all three. The tester has the same three controls. Set them before you read the result.
## Further reading
Auction type on the bid request
Deal.at versus request at
Profiles in CI
---
# AdCP vs OpenRTB is an agent task against a bid request, and the mapping is where the fields die. · RTBlint
URL: https://rtblint.org/blog/adcp-vs-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## AdCP vs OpenRTB is an agent task against a bid request, and the mapping is where the fields die.
September 27, 2026 · RTBlint
AdCP vs OpenRTB is two layers. Agents negotiate a media buy. The auction is still a bid request. Nothing in the task response tells you the request is valid for the snapshot the exchange runs.
## The task is not the auction
AdCP is a task protocol. A buyer agent calls get_products , create_media_buy , or sync_creatives on a seller agent, over MCP or A2A. None of those messages is a bid request, and none of them clears an impression. OpenRTB is the wire format when that agreement has to be sold programmatically: a deal id on imp.pmp.deals , a placement on imp.video or imp.audio , a path on source.schain . The mapping guide is the handoff. This page is what the handoff drops.
video_placement_types uses video.plcmt names: instream is 1, accompanying_content is 2, interstitial is 3, standalone is 4. It does not map to the deprecated video.placement list. Writing the old field with the new intent loses the constraint. The integer 1 on placement is not the same promise as plcmt 1. That rename failure is the plcmt post .
Products and packages become deals. If the deal id on the media buy is not the Deal.id on the request, the auction never applies the terms and the impression prices in the open market. adagents.json says which agents may represent the publisher. It does not replace source.schain . A task that succeeded and a chain that does not list the seller are both possible on the same buy.
## The request can be wrong after the agent said yes
An agent stack built in 2.6 language can emit a field the exchange's pinned snapshot does not have yet. That is openrtb.field.not_yet_available . No AdCP-level test sees it. Privacy is worse: a media buy carries no consent string. regs.gdpr , user.consent , regs.gpp , and gpp_sid come from the seller's ad stack. A half-filled pair is unusable. The negotiation did not set them.
Anything narrowed in the task, format, duration, seat, geo, suitability, is enforced only if the impression repeats it. A constraint that stayed in the agent transcript is not a bid request field. Generated JSON adds the usual type misses: at as a string, one object where imp must be an array, a boolean where the spec wants 0 or 1, a 2.6 field inside a body an exchange will read as 2.5.
Validate the emitted request with the snapshot and dialect the exchange uses. The tester and rtblint validate see the bid stream. They do not see the agent transcript. A green task log is not a green request.
## Audio and seats fall off the same way video does
AdCP audio distribution types are meant to land on the OpenRTB audio feed field, the same kind of name-to-integer handoff as video.plcmt. Leaving the agreement in the task transcript and sending an audio object with no feed is a legal request that does not carry the constraint. The bidder prices a generic audio impression. The buy was more specific than that.
Seat and geo limits belong on the impression or the deal, wseat and the geo fields the exchange actually reads. A suitability line in the agent message does not become bcat. If you need a blocked category, write bcat on the request and set cattax when the codes are not taxonomy 1.0. Otherwise the open auction ignores a block that existed only in the chat.
Run the generated JSON through RTBlint at the snapshot the exchange pinned, with the dialect the serializer emits. openrtb.field.not_yet_available is the finding for a 2.6 field on an older pin. A string at, a boolean secure, and a placement value copied from an AdCP name are the findings for a model that matched the shape and missed the types. Fix the emitter. Do not hand-edit a sample and call the agent done.
## What to check after the media buy
Map video_placement_types to video.plcmt , not placement .
Put the agreed deal id on imp.pmp.deals . A different id is the open auction.
Do not treat adagents.json as a schain.
Emit consent on the request. The media buy did not include it.
Pin the exchange snapshot. A 2.6 field on an older pin is not yet available.
Reject string at , a non-array imp , and bool flags in Spec JSON.
## A yes from the agent is not a filled impression
create_media_buy agreeing a price does not emit a bid, a win notice, or a billing notice. Those still happen on the OpenRTB path after the deal id is on the request and a bidder responds. If the id never lands, the open auction runs and the agent transcript still says the buy exists. Reconcile the deal id in the request with the id in the task before you reconcile spend.
Placement names are plcmt integers, not the deprecated placement list. instream is 1 only in the new list, and that 1 means sound-on. Mapping the AdCP name instream onto video.placement 1 reintroduces the old definition. Write plcmt. Then validate the request the exchange will parse, at that exchange snapshot, not the JSON the agent displayed.
## Further reading
AdCP to OpenRTB
AdCP explained
Snapshot pins
---
# source.tid vs imp.ext.tid is the transaction and one impression inside it, not a single tid column. · RTBlint
URL: https://rtblint.org/blog/source-tid-vs-imp-ext-tid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## source.tid vs imp.ext.tid is the transaction and one impression inside it, not a single tid column.
September 27, 2026 · RTBlint
People say tid and mean three different strings. source.tid is the transaction on one request. imp.ext.tid is one impression inside that transaction. imp.id is neither. A column named tid joins auctions that never shared an id.
## source.tid is the request, and it is not automatic across paths
The bid request marks source.tid as the transaction id common across participants in that auction. It is recommended, not invented by the exchange after the fact. Prebid can set it from ortb2 . A TAM request and an Open Bidding request for what a human calls the same slot carry the ids those platforms put on their own bodies. They share source.tid only when you passed the same string into each assembly. The three assemblies are why a single debug log lies.
Joining those paths on source.tid when you did not set it fails open. The rows do not share a tid, so they look like separate auctions, which they are. Averaging them into one request is the reporting bug. Capture the tid per path and expect them to differ. A page refresh mints another transaction unless your code reuses the value on purpose.
There is no spec field that is just tid at the top of the request. If a log pipeline says tid, name the path it read. source.tid and a copy someone parked on an extension are not the same key. Buyers and exchanges that read the recommended field will not see the extension.
## imp.ext.tid is one slot, and imp.id will not substitute
imp.ext.tid scopes the id to one impression inside the transaction. A request with three impressions can share one source.tid and carry three impression tids. Collapsing them to the transaction id hides which slot cleared. Collapsing them to imp.id is worse: imp.id is required and unique inside the request, and it is often 1, 2, 3. It is not stable across refreshes or across paths. Joining on imp.id joins unrelated auctions that numbered their first slot 1. Bids copy that value to impid .
imp.tagid is the placement the publisher means, the ad unit or slot name. It joins paths only when each assembly was given the same string. A Prebid ad unit code does not become a TAM slot name, and neither becomes the ad server path, unless you set tagid yourself. A prefix one platform adds makes one slot look like three placements.
Store three columns if you need all three scopes: source.tid , imp.ext.tid , and imp.tagid . Store imp.id beside them as the in-request key for the bid, and do not use it as the join across hops. The bid request reference lists source.tid as the shared transaction id. The extension on the impression is how you keep the slots apart inside it.
## The bid response does not invent the transaction id
bid.impid points at imp.id for the impression that was bid. It does not point at source.tid or imp.ext.tid. A reporting join from the win notice back to the request has to have stored those fields when the request was sent. The notice macros identify the auction the exchange ran. They are not a substitute for the tid you failed to put on the request.
Two impressions in one request share source.tid and must not share imp.ext.tid if you are using the extension to tell slots apart. Two requests in one page view, a refresh or a second path, must not share source.tid unless you deliberately reused it. Reuse is a product decision. Accident is how dedup collapses two auctions into one, or how one auction splits into three in the log.
Validate that the builder writes source.tid as a string on source, not as a number and not only on the impression. Then decide whether imp.ext.tid is in your contract. If it is, generate it per impression from the same function that builds imp.id, and do not set them equal unless you have decided one id is enough and documented which field partners read.
## What to log
source.tid per request path. Do not assume TAM or Open Bidding copied the Prebid value.
imp.ext.tid when one transaction has more than one impression.
imp.id only to match bid.impid inside that response.
imp.tagid only if you set the same string on every path you want to join.
A column named tid without a path is not a key. Name the field you read.
## A refresh and a second path are new transactions
A page that refreshes the ad unit builds another request. Unless the code copies the previous source.tid on purpose, the new request has a new transaction id. Treating the refresh as the same auction double-counts or under-counts depending on which log you trust. Write the reuse rule down. Do not discover it from a join that almost works.
imp.ext.tid follows the impression, so a multi-slot request needs one per imp if you use it. Reusing source.tid for every imp is correct. Reusing one imp.ext.tid for every imp hides the slot. Reusing imp.id values of 1, 2, 3 across paths hides nothing and matches everything. Keep those three ideas in different columns.
## Further reading
Bid request, source.tid
Three assemblies, three tids
---
# UID2 vs ID5 vs RampID is one OpenRTB array, and the source domain is what tells them apart. · RTBlint
URL: https://rtblint.org/blog/uid2-vs-id5-vs-rampid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## UID2 vs ID5 vs RampID is one OpenRTB array, and the source domain is what tells them apart.
September 27, 2026 · RTBlint
UID2 vs ID5 vs RampID is not three columns on the bid request. OpenRTB carries extended ids in user.eids . The provider is source . A single universal-id field that stores whichever token arrived last throws away the only thing that tells a buyer which system it is.
## user.id and buyeruid are the cookie pair, not these products
user.id is the exchange's own id for the user. user.buyeruid is the id that buyer holds, usually from a cookie sync, unless the two parties arranged something else. That pair depends on the match table and on the browser cookie. It is not where UID2, ID5, or a RampID is supposed to sit. Stuffing any of them into buyeruid makes one buyer's slot hold a token the exchange's sync never issued, and it strips the provider name.
user.eids is an array of EID objects. Each groups ids from one source. source is the provider's canonical domain. uids holds the id and atype , the agent type, browser versus an in-app context. Many DSPs need atype before they will resolve the value. An id with no source domain is unmatchable: the buyer cannot tell which system it belongs to. The identity guide is the object. A sample Ramp-style entry on this site uses source liveramp.com. Do not copy that domain onto a UID2 or an ID5 value.
In 2.6 the array is first-class. user.ext.eids is the old path. Buyers who read user.eids miss ids left under ext . Snapshot 2.6-202409 added inserter , matcher , and mm so a buyer can see who placed the id and how it was matched. Those fields do not exist on an older pin. A request that claims 2.6 and still only fills ext has not moved.
## One array, three sources, and consent still applies
The format did not grow a field per vendor. UID2, ID5, and RampID fit the same object because each entry names its source. Sending all three means three entries, each with its own source and its own uids . Merging the raw tokens into one id string, or keeping a warehouse column called universal_id and writing that into every source, makes every provider look like the same system. The buyer will try the wrong resolver.
atype is part of the resolution. A browser id and an app id for the same provider are different agents. Omitting atype can leave an otherwise present id unused. Do not default it to 1 because a sample did. Set the agent you actually collected.
None of this overrides privacy. Whether the exchange may send the id depends on regs.gdpr and user.consent , or on regs.gpp and gpp_sid . An eid next to an unresolved consent flag is not a match you can train on. The privacy comparison is which string you owe. This page is which identity object you owe beside it.
## Prebid will not copy these ids onto the other paths
A user-id module that writes user.eids on the Prebid request does not run inside TAM or Open Bidding. Those paths have their own identity or none. A RampID present on the Prebid body is not evidence the Google request carried source liveramp.com, and it is not evidence an ID5 entry existed on either. Audit eids per captured request.
buyeruid remains the cookie-sync id for that buyer on that exchange. It can be present next to eids. They answer different questions. Replacing buyeruid with a UID2 token because third-party cookies are going away removes the sync id buyers still match, and it still fails to name the UID2 source. Send the eid properly and leave buyeruid as the sync value when you have one.
Hashing an extended id because a conversion pipeline hashes email destroys the token the provider issued. eids values are already opaque. Send them as received. Do not run them through SHA-256. Do not store one column and stamp every source with it on the way out.
## What to store
Keep each provider as its own eids entry. source is the domain that provider publishes, not a nickname.
Do not write those tokens into user.id or user.buyeruid .
Include atype . A missing agent type is how a DSP drops a valid id.
On 2.6, use user.eids , not user.ext.eids .
Do not reuse a liveramp.com source for a different provider's token.
Drop the id when the privacy pair on that request does not allow it.
## The source has to be the provider, not the exchange
source is a domain so the buyer can pick a resolver. An exchange hostname in that field means the buyer will look up the wrong system. A missing source means the buyer cannot look up any system. UID2, ID5, and a RampID can all be present on one request only as separate entries. One entry with three ids jammed into a single string is one broken source, not three products.
atype tells the DSP whether the id was collected in a browser or in an app. Copying atype from a web sample onto an in-app request resolves the id in the wrong agent. inserter, matcher, and mm, when the snapshot includes them, say who added the id and how. They do not replace source. Leave them off rather than inventing a match method you did not perform.
## Further reading
user.eids, buyeruid, and source
Privacy signals
---
# GPP vs TCF vs the US Privacy string live on different OpenRTB fields, and one does not fill the others. · RTBlint
URL: https://rtblint.org/blog/gpp-vs-tcf-vs-us-privacy/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## GPP vs TCF vs the US Privacy string live on different OpenRTB fields, and one does not fill the others.
September 27, 2026 · RTBlint
GPP vs TCF vs the US Privacy string is three signals a bid request can carry at once. They are not three spellings of one consent bit. A CMP that writes only one of them leaves the readers of the other two with unknown.
## TCF is a flag plus a string, and the string is not under regs
On OpenRTB 2.6, regs.gdpr is an integer: 0 means no, 1 means yes, omitted means unknown. user.consent is the TCF string, on user , not on regs , and not an object. In 2.5 both lived under ext . A 2.6 reader that finds them only at regs.ext.gdpr and user.ext.consent does not treat those paths as the core fields.
regs.gdpr 1 with no user.consent says consent is unresolved. Most bidders will skip personalization or skip the bid. The string has to decode as TCF. A value of 1 in the consent field is not a TC string. The privacy reference is the path list.
Identity does not override this. user.eids and user.buyeruid still depend on whether the request was allowed to send an id. A populated eid next to an unresolved GDPR flag is not a consented match.
## The US Privacy string is legacy, and GPP needs the section id
regs.us_privacy is the IAB US Privacy string, for example 1YNN. It began as regs.ext.us_privacy and became first-class in 2.6. IAB Tech Lab has deprecated that string in favor of GPP. It still appears on live requests. Keep parsing it. New work should emit GPP. Sending only us_privacy does not fill regs.gpp .
GPP arrived in snapshot 2.6-202211. regs.gpp is the encoded string, which can bundle regional sections. regs.gpp_sid is the integer array of section ids that apply to this transaction. The spec says it generally contains exactly one value. Sections 3 and 4, header and signal integrity, do not need to be listed. Without gpp_sid , a bidder cannot tell which section governs the request. A string alone is not the pair.
Many pipelines send us_privacy and GPP together during the transition. That is two fields on purpose. Dropping the legacy string before every buyer reads GPP hides the signal from the buyers who still look at regs.us_privacy . Dropping GPP because the legacy string is present hides it from buyers who already moved. Read both on the request you captured. Do not assume one path's CMP write landed on Prebid, TAM, and Open Bidding. Those are three assemblies.
## coppa is not any of these strings
regs.coppa is its own integer flag. It is not a TCF string, not a US Privacy string, and not a GPP section. A children's request does not become compliant because gpp parsed. Set coppa on its own, and do not infer it from us_privacy or from a GPP section id you did not read.
Spec JSON types gdpr and coppa as integers. true is protobuf JSON. A CMP bridge that emits booleans will fail a spec-json check and pass a proto-json check, or the reverse. Pick the dialect of the pipe before you call the privacy block valid. The same request can be legal GPP and an illegal GDPR type.
Half a pair is the production miss. gdpr 1 without user.consent, gpp without gpp_sid, us_privacy left in ext on a 2.6 reader. Each one looks populated in the CMP log and empty to the bidder that reads the current path. Capture the bid request, not the CMP debug panel, when you audit which signal left the page.
## What to put on a 2.6 request
EU: regs.gdpr and, when it is 1, user.consent as a TC string.
Move both off ext when the snapshot is 2.6.
US state and the current multi-jurisdiction string: regs.gpp and regs.gpp_sid .
Keep regs.us_privacy only while a buyer still reads it. Do not treat it as GPP.
Pin a snapshot of 2.6-202211 or later before you expect GPP to be in the catalog.
Do not send an eid you were not allowed to send. Consent and identity travel together.
## Three paths can carry three different strings for one user
Prebid can put regs.gpp on the request the page built. TAM and Open Bidding build their own requests. A CMP write into ortb2 does not copy itself onto those bodies. One path can have a TCF string, another only us_privacy, and a third nothing. Buyers are not contradicting each other. They saw different requests. Capture each path before you claim the user consented once.
GPP section ids are how a bidder picks the section inside a bundled string. Sending the string without gpp_sid, or sending a sid that is only the header section, leaves the applicable section unnamed. During a transition, send the legacy US Privacy string and the GPP pair. Dropping either early is how half the buyers go dark while the CMP UI still looks complete.
## Further reading
Privacy signals
GPP section updates
2.5 paths still under ext
---
# PMP vs preferred deal vs programmatic guaranteed is private_auction, at, and guar. · RTBlint
URL: https://rtblint.org/blog/pmp-vs-preferred-deal-vs-programmatic-guaranteed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## PMP vs preferred deal vs programmatic guaranteed is private_auction, at, and guar.
September 27, 2026 · RTBlint
PMP vs preferred deal vs programmatic guaranteed is not three objects. OpenRTB gives you imp.pmp . The names are conventions on private_auction , Deal.at , and Deal.guar . Exchanges vary. The axes do not.
## Read the three flags before you trust the IO
An open auction has no deal. private_auction 0 still accepts open bids beside any deals that are listed. private_auction 1 restricts bidding to the deals and their terms. A private auction, the closed invite, is that 1, with Deal.at of 1 or 2 so the price is still an auction, and guar 0 so the buyer is not obligated. The floor is competitive. The deals guide is the table. A request that says PMP in the subject line and leaves private_auction at 0 is still an open auction with a label.
A preferred deal is first look at a fixed price, and the buyer does not have to buy. That is Deal.at 3, meaning the bidfloor is the agreed price, and guar 0. Programmatic guaranteed is the committed buy: the same fixed price, and guar 1, which tells the bidder it must bid. Setting guar 1 on a preferred deal obligates a buyer who was only offered a look. Leaving it 0 on a guaranteed IO lets the bidder skip a commitment the seller already sold.
Deal.at overrides the request auction type for that deal. Request at defaults to 2, second price plus, when omitted. A deal with at 3 does not inherit that default. Loss code 103 is lost to a deal bid. It is not 102, which is a higher price. A bidder that treats every loss as price will raise the bid on a deal it was never in.
## The id is the join, and the currency does not inherit
Deal.id is required and negotiated out of band. The seller puts it on the request. The buyer matches it to apply the terms. If the ids differ, the deal never triggers and the impression prices as open auction, with no error that says the name of the IO. A mismatched id is the usual reason a deal looks dead.
Deal.bidfloorcur does not inherit imp.bidfloorcur . Both default to USD when omitted. A euro floor on the impression plus a bare deal floor is a dollar deal. wseat and wadomain , when omitted, mean no seat restriction and no advertiser-domain restriction. When present, they are the only buyers allowed on that deal. Omission is not "everyone we usually trade with."
These encodings are conventions. An exchange can still use a different combination. Read the three flags on the request you were sent. Do not replace them with the words in the order. Validate the pmp block in the tester against the snapshot that exchange speaks. Spec JSON wants private_auction and guar as integers. true is the protobuf dialect.
## A fixed price with the wrong obligation is a different product
Preferred and programmatic guaranteed both use Deal.at 3, so a dashboard that only shows fixed price cannot tell them apart. guar is the obligation. 0 means the buyer may pass. 1 means the bidder must bid. A trader who marks every fixed deal guaranteed will force bids on inventory the buyer only had a first look at. A trader who leaves guar off on a guaranteed IO will see the bidder no-bid a commitment that was already sold.
wseat limits which buyer seats may bid. wadomain limits advertiser domains. Omission means no restriction. A preferred deal offered to one seat still needs that seat in wseat if the exchange is using the field. An empty wseat is not one seat. private_auction 1 then means only the listed deals, so an open-auction bid you expected as a backstop will not be accepted.
When the deal id mismatches, nothing in the response says the IO name. The impression clears at the open auction, loss reasons look like price, and the deal report stays at zero. Compare Deal.id on the request to the id in the order before you debug floors. Then compare bidfloorcur. A 120 floor without JPY is 120 US dollars, on the deal and on the impression separately.
## What to confirm before the deal goes live
Private auction: private_auction 1, at 1 or 2, guar 0.
Preferred deal: at 3, guar 0. The floor is the price. The buyer may pass.
Programmatic guaranteed: at 3, guar 1. The bidder is obligated.
Match Deal.id on both sides. A near miss falls through to the open auction.
Set bidfloorcur on the deal. A bare floor is USD.
Do not expect open bids when private_auction is 1.
## The open auction is what you get when the flags do not match the IO
If private_auction is 0, open bids are still accepted beside the deals. A buyer who thought the package was a closed PMP will see other seats clearing it. If private_auction is 1 and the buyer is not on the deal, that buyer cannot fall back to the open price. Both outcomes look like a yield change. Both are the flag.
guar 1 without a real commitment makes the bidder spend on a look. guar 0 on a guaranteed buy makes the bidder skip a contract. at 3 without the currency makes the fixed price USD. Read the JSON the exchange sent, not the deal name in the email, and do not ship a fixture that was edited to match the IO after the builder already wrote different flags.
## Further reading
Deals and PMP
Floors and bidfloorcur
Loss 103 is a deal, not a price
---
# ads.txt vs app-ads.txt is the domain file or the bundle file, and the request picks which. · RTBlint
URL: https://rtblint.org/blog/ads-txt-vs-app-ads-txt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## ads.txt vs app-ads.txt is the domain file or the bundle file, and the request picks which.
September 27, 2026 · RTBlint
ads.txt vs app-ads.txt is not a rename. Web inventory is authorized in example.com/ads.txt . App inventory is authorized in the developer's app-ads.txt, keyed by app.bundle . A request that carries both files in your head and only one on the wire checks the wrong allowlist.
## The request says which file exists
A site request has site.domain . The allowlist is that domain's ads.txt. An app request has app.bundle . The allowlist is app-ads.txt for that bundle. OpenRTB still forbids sending more than one of site , app , and dooh . If both site and app are present, you do not have a puzzle about which file to read. You have an invalid request, and bidders drop it before the file matters.
The line shape is the same idea in both files: an advertising system domain, a seller account id, and DIRECT or RESELLER. DIRECT means that account sells this inventory. RESELLER means the account may resell it. The first payment hop on the schain is the node whose hp is not 0. That hop's asi and sid have to appear as DIRECT or RESELLER in the file the inventory type names. A match against the website file while the request is an app is a pass on the wrong publisher.
sellers.json still sits on the seller's domain and answers who the account is. ads.txt and app-ads.txt answer whether that account may sell this site or this app. The three-file loop is the schain post . This page is only the choice of allowlist.
## The cache paths are different on purpose
rtblint validate --resolve --cache does not download either file. Web lookups read ads//ads.txt . App lookups read app-ads//app-ads.txt . Missing app-ads.txt for a bundle that has a payment hop is openrtb.resolve.app_ads_txt_unavailable . A file that does not list the first payment node is openrtb.resolve.app_ads_txt_unauthorized . The website equivalents are the ads.txt findings. Populate the directory that matches the object on the request.
A publisher brand that owns both a site and an app often has both files, with different account ids. Copying example.com/ads.txt into the app-ads cache slot makes CI green for a bundle the developer never authorized. Copying the app file onto the domain misses the website's sellers. Store them under the keys the CLI looks up, and refresh them when the publisher edits the live file. The validator will not notice a stale cache.
hp 0 is not the payment hop those findings check. A chain can list several nodes and only one of them is paid directly. Authorizing a non-payment node and missing the paid one is the miss. Read hp before you pick the line.
## A developer domain is not the bundle
App-ads.txt is published on a developer domain, and the cache key RTBlint uses is the bundle string, not that domain. You fetch the file from the domain the store listing names, then you save it as app-ads/com.example.app/app-ads.txt. Looking up example.com/ads.txt because the company brand matches does not authorize com.example.app. The finding for a missing file is a warning that the hop could not be checked. The finding for a file that omits the paid node is an error.
DIRECT and RESELLER are not interchangeable. A RESELLER line allows that account to resell. A DIRECT line is the account the developer named as selling its own inventory through that system. Matching the right asi and the wrong relationship, or the right relationship and the wrong sid, is still unauthorized. The check is the pair on the first node whose hp is not 0.
CTV apps and mobile apps both use the bundle path when the request is an app object. A site.domain on a web wrapper around an app is a site request and reads ads.txt. Do not keep a single spreadsheet of authorized sellers and point every request at it. Split the cache the way the objects split.
## What to check on the next app request
If app.bundle is set, resolve app-ads.txt, not the website ads.txt.
If site.domain is set, resolve ads.txt for that domain.
Do not send site and app together and then pick a file.
Match the first node with hp not 0 to a DIRECT or RESELLER line.
Keep the cache path app-ads//app-ads.txt identical to the bundle string, including case.
A green schain without --resolve has not opened either file.
## Do not authorize the bundle with the website file
A company can own example.com and com.example.app and still list different sellers in each file. The website DIRECT line for an SSP does not authorize that SSP to sell the app. The app RESELLER line does not authorize the website. When a bid request is an app, only the bundle file is the allowlist. When a bid request is a site, only the domain file is. Checking both and passing if either matches will approve a seller the inventory owner did not name.
Put the live file in the cache before CI, under the exact domain or the exact bundle. A renamed bundle, a debug suffix, or a different store id is a different key and a missing file. Re-run with --resolve after the publisher edits the file. A cached copy from last quarter will keep blessing a seller who was removed, or keep failing a seller who was added.
## Further reading
Supply chain trust stack
ads.txt, sellers.json, and schain
CLI resolve and cache
---
# placement vs plcmt is not a rename: the same integer 2 is a different placement. · RTBlint
URL: https://rtblint.org/blog/placement-vs-plcmt-copied-integer/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## placement vs plcmt is not a rename: the same integer 2 is a different placement.
September 27, 2026 · RTBlint
placement vs plcmt is the migration that copies an integer and changes what the impression is. video.placement was deprecated in OpenRTB 2.6-202303. video.plcmt is a new list. Value 2 is not the same placement on both.
## The old 1 is not automatically the new 1
The deprecated list on video.placement runs 1 In-Stream, 2 In-Banner, 3 In-Article, 4 In-Feed, 5 Interstitial/Slider/Floating. The plcmt list runs 1 Instream, 2 Accompanying Content, 3 Interstitial, 4 No Content/Standalone. Both fields sit on the Video object. Both draw from AdCOM lists. The placement vs plcmt guide has the definitions. The failure is a builder that sets plcmt to whatever placement already held.
plcmt 1 is instream that must be sound-on by default at player start, or that has explicit user intent to watch. The video is the focus of the visit, and it is the only in-view player capable of audio while it plays. A lot of inventory that claimed placement 1 under the old list was a muted autoplay player in an article. Under the new definitions that inventory is plcmt 2, Accompanying Content: playback starts on entering the viewport, beside text or graphics, and it may become a floating player when scrolled away. Copying 1 into plcmt tells buyers this is sound-on instream. They price it that way. The player is not that placement.
placement 2, In-Banner, is display inventory used as a video experience. plcmt 2 is accompanying content with a stream. Those are not the same sentence. placement 3 In-Article and placement 4 In-Feed do not fall on plcmt 3 and 4 by arithmetic. plcmt 3 is interstitial: no stream, primary focus, majority of the viewport, cannot be scrolled away. plcmt 4 is standalone video without streaming content, including slideshows, native feeds, and sticky units. The integer 4 on the old list was a feed. The integer 4 on the new list is a different object.
## Send both until demand reads plcmt, and do not omit it to stay safe
The IAB implementation pattern is to keep the legacy value in video.placement for buyers still on the old list, and to set video.plcmt from the new list. Buyers on the updated definitions read plcmt . Drop placement after those buyers confirm. Sending only the old field on a snapshot that deprecated it is openrtb.field.deprecated territory when you validate as 2.6-202303 or later. Sending only a copied integer in plcmt is a clean-looking field with the wrong subtype.
The spec does not mark plcmt required. Video buyers still key pricing and eligibility on it, because it separates sound-on instream from accompanying and standalone video. Omitting it to avoid the mapping decision costs the impression on CTV and on instream web supply. The safe omit is not safe. Classify the player, then write the new integer. If you are unsure, plcmt 2 is the honest bucket for muted in-article autoplay that used to say In-Stream. plcmt 1 is the bucket you have to earn with sound-on or with explicit intent.
plcmt does not exist in the original April 2022 2.6 text. It arrived in the 2.6-202303 update. A partner who says they are on 2.6 and validates only as 2.6-202211 will not see this field as part of that snapshot. Pin 2.6-202303 or later when the contract includes plcmt . The version-string problem is the 2.5 vs 2.6 post . This one is the integer.
Buyers who still read only placement will keep paying the old definition until you drop that field. Buyers who read plcmt will pay the new definition immediately. During the overlap, the two fields are allowed to disagree, and they should, whenever the old In-Stream label was a muted player. Forcing them to match so the JSON looks tidy is the copy. A request with placement 1 and plcmt 2 is the honest transition row for that player. A request with both set to 1 is the overclaim.
## CTV and outstream do not share the article-player exception
Accompanying content is defined around a page: the player loads before, between, or after paragraphs, starts in the viewport, and may float. A CTV app has no paragraph and no scroll. Instream on a television is the content the viewer opened, sound on, full player. Copying a web placement of 1 into CTV plcmt can be honest when the show is the visit. Copying it from a muted corner player on an article is how CTV demand pays instream prices for a unit that was never a show.
Interstitial on the new list is video without streaming content, primary focus, most of the viewport, not scrollable. The old interstitial value was 5, grouped with slider and floating. A migration that sends plcmt 5 because the old field was 5 writes a value the new four-value list does not have. A migration that sends plcmt 3 for every floating unit calls a sticky outstream player an interstitial. plcmt 4 is the standalone bucket for slideshows, feeds, and floating units without a stream.
Two exchanges can send the same impression with different integers if one copied and one reclassified. Do not average them. Read plcmt on each request. The Prebid path, the TAM path, and an Open Bidding path are three assemblies. A placement fix in Prebid does not rewrite the others. The comparison of those assemblies is a separate post. The integer still has to be set on each one.
## What to put on the video object
Do not set plcmt equal to placement as a migration.
plcmt 1 is sound-on instream, or explicit watch intent, and the only in-view player that can play audio.
Muted autoplay beside article text is plcmt 2, even when the old field said 1.
Keep placement for legacy buyers during the transition. Set plcmt from the new list, not from the old integer.
Pin a snapshot that includes 2.6-202303 before you treat a missing plcmt as optional forever.
Validate the builder output. A sample someone edited to plcmt 1 while the player is muted will pass the checker and still be the wrong sale.
Paste the request in the tester with the snapshot set, or run rtblint validate --version 2.6-202505 on the file the player stack emits. RTBlint is not an IAB validator. A pass means the integers are legal values on that snapshot. It does not watch the player to see whether sound was on, and it will not refuse plcmt 1 on a muted unit. That refusal is the classification you owe the buyer, written into the field before the request is sent.
## Further reading
placement vs plcmt
Video object
The plcmt migration
---
# ads.txt vs sellers.json vs schain is three files, and a complete chain can still fail the join. · RTBlint
URL: https://rtblint.org/blog/ads-txt-vs-sellers-json-vs-schain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## ads.txt vs sellers.json vs schain is three files, and a complete chain can still fail the join.
September 27, 2026 · RTBlint
ads.txt vs sellers.json vs schain is three artifacts that only work as a loop. A well-formed source.schain does not mean the seller is authorized. A populated ads.txt does not mean this request walked that path.
## Each file is written by a different party
ads.txt is a text file the publisher hosts at the root of its domain, example.com/ads.txt . It lists advertising systems allowed to sell that inventory and the publisher account id in each. The app file is app-ads.txt, a different URL for a different inventory type. If a request claims to sell example.com through an exchange that file does not list, a buyer has grounds to treat the sale as unauthorized. The file is the publisher allowlist. It is not the path of this auction.
sellers.json is hosted by the advertising system, the SSP or exchange, at its own domain. It maps each seller account id that can appear in that system to a name, a domain, and whether the account is a publisher selling its own inventory or an intermediary reselling someone else's. ads.txt is the publisher's list of sellers. sellers.json is the seller's disclosure of accounts. They are designed to be cross-referenced. One cannot stand in for the other.
schain is the only one of the three that travels on the request. In OpenRTB 2.6 it is source.schain . In 2.5 it traveled as source.ext.schain . Each node has asi , the advertising system domain, which should match a sellers.json host; sid , the seller id in that system, which should match an entry in that file; and hp , whether this node is paid directly for the impression. complete of 1 asserts every hop from the publisher is represented. complete of 0 admits the chain is partial. A complete flag on a chain with a gap is worse than an honest 0.
## The check is a loop, and it stops at the first break
For each node, ask whether asi has a sellers.json, whether sid is listed there, and whether the publisher ads.txt or app-ads.txt authorizes that system plus that account. If every hop resolves, the path is accountable. A break is a reason to block or to ask, not an automatic fraud verdict. The trust-stack guide is the field list. This is the request that looks complete and still fails the join.
A blank asi or sid , or two identical adjacent nodes, is a malformed chain before any file is fetched. An asi with no sellers.json, or a sid missing from the file that does exist, defeats verification even when complete is 1. Buyers who only test that the object parses will bid the dishonest chain and refuse an honest partial one, because 1 looks healthier than 0 in a spreadsheet.
The chain on the request can also be in the wrong place. A 2.6 reader looks at source.schain . A chain that exists only at source.ext.schain is invisible to that reader, which is openrtb.field.moved when you validate against a 2.6 snapshot. Writing both paths with different nodes means each reader trusts a different path. Copy one object. Do not maintain two.
## The CLI will not fetch the files for you
rtblint validate can check that the SupplyChain object matches the snapshot you pinned. --resolve --cache checks hops against files you already stored: sellers//sellers.json , ads//ads.txt , and app-ads//app-ads.txt . Nothing is fetched. A green schain with resolve omitted is a shape check. It is not an authorization check. Populate the cache from the hosts you intend to trust, then turn the flag on.
app-ads.txt is not a rename of ads.txt. Web inventory reads the domain file. App inventory reads the bundle file. A schain node that you join to example.com/ads.txt while the request is an app with a bundle id is the wrong allowlist. Store both in the cache when you sell both. Do not point the app bundle at the website file because the publisher brand looks the same.
adagents.json, at /.well-known/adagents.json , is a later file: which sales agents may represent the publisher, with scope ads.txt does not express. It does not replace schain, and a blog that treats it as a fourth copy of sellers.json will authorize an agent the request never listed. The chain is still the path. The well-known file is who may broker. See the AdCP explainer for the agent side, and keep it off this join until the node list is honest.
## A direct line and a reseller line are not the same account
sellers.json says whether the account is a publisher selling its own inventory or an intermediary reselling someone else's. ads.txt authorizes a system plus an account id. A schain sid that resolves to a different account than the one ads.txt lists for that system is a join on the wrong line. Match the account id, not the brand name in the file.
hp says whether that node is paid directly for the impression. It does not say the node is authorized. A paid hop can still be missing from ads.txt. An authorized hop can still be unpaid. Read hp after the asi, sid, and ads.txt checks, when you are deciding which hop in a clean path actually got paid. Supply path optimization is that second decision. It is not a substitute for the first.
The request's site.domain or app.bundle picks the file. A domain that does not match the page the user is on, or a bundle that does not match the app, makes a perfect schain describe the wrong publisher. Validate the schain shape, then resolve it against the inventory ids on the same request. A sample schain checked against a fixture ads.txt from a different domain will pass in CI and fail on the live publisher.
## What a buyer can decide from one request
Read source.schain on 2.6. If the only chain is under ext , the current path is empty.
Treat complete 0 as partial. Treat complete 1 with a missing hop as the case to block.
Resolve asi to that system's sellers.json and sid to a listed account. A parse of the object is not that lookup.
Authorize the account in the publisher ads.txt or the app app-ads.txt, matching the inventory type on the request.
Drop empty nodes and duplicate adjacent nodes before you debate payment.
Run --resolve --cache only after the cache holds the files. The validator does not download them.
RTBlint is not an IAB validator. A pass on the object means the snapshot accepts the shape. Authorization is the cache, or a buyer system that fetched the same files. Supply path optimization starts after the path is legible. It does not start at a version string.
## Further reading
ads.txt, sellers.json, and schain
Supply chain object
2.5 objects that remain under ext
CLI, including resolve and cache
---
# OpenRTB 2.5 vs 2.6 is a version string that says 2.6 and objects that still live under ext. · RTBlint
URL: https://rtblint.org/blog/openrtb-2-5-vs-2-6-version-string/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## OpenRTB 2.5 vs 2.6 is a version string that says 2.6 and objects that still live under ext.
September 27, 2026 · RTBlint
OpenRTB 2.5 vs 2.6 is close enough that a request still parses, and different enough that a 2.6 reader never sees the GDPR flag, the consent string, or the supply chain. The version string moved. The objects stayed under ext .
## The structures are close, which is why the no-bid is quiet
A valid 2.5 request is structurally close to a valid 2.6 request. That sentence is why exchanges bump a constant to 2.6 and leave the builder alone. Lenient partners still bid. Strict partners read regs.gdpr , user.consent , source.schain , and user.eids , find them absent, and no-bid. nbr does not name the path you forgot to move.
In 2.5 those signals lived in extensions: regs.ext.gdpr , user.ext.consent , source.ext.schain , user.ext.eids . 2.6 promoted them. Writing only the old path, or writing both paths with different nodes, is openrtb.field.moved when you validate against a 2.6 snapshot. A 2.5 pin still treats the extension as the place the object lived. The same file is a different finding under the two versions. The field table is the 2.5 vs 2.6 guide . This is the request that survives the version bump.
2.6 also removed fields that 2.5 had already deprecated: banner.wmax , hmax , wmin , hmin , video.protocol , and content.videoquality . A builder that still emits them is not sending a 2.6 request with extra hints. Those keys are gone. Deprecated in 2.6, and still commonly populated: video.sequence , audio.sequence , the hashed device ids ( didsha1 , didmd5 , dpidsha1 , dpidmd5 , macsha1 , macmd5 ), user.yob , user.gender , and bid.api .
## 2.6 is a series of dated snapshots, not one document from April 2022
Since 2.6-202211 the version number stays put unless a change is breaking. New fields arrive as dated updates. plcmt and GPP are 2.6 fields that are not in the original April 2022 text. A partner who says they are on 2.6 has not named a snapshot. regs.gpp and regs.gpp_sid arrived in 2.6-202211. video.plcmt arrived in 2.6-202303 and deprecated placement . The enums do not map one to one. Copying the old integer into plcmt classifies the impression as a different subtype.
Later updates kept moving the same minor version. 2.6-202309 added durfloors . 2.6-202402 added poddedupe . 2.6-202409 added inserter , matcher , and mm on EID. 2.6-202501 added gtax and genres . 2.6-202505 added cids on Data and corrected genres to a string array. Pin --version 2.6-202505 , or whichever snapshot you actually speak. Without a pin, the CLI uses the latest tracked 2.6 snapshot, and a Tuesday release can flag a field your Monday fixture never had.
Validating that file as 2.5 hides the move. Validating it as 2.6-202211 sees GPP and still does not require plcmt , because plcmt is not in that snapshot. Validating it as 2.6-202505 sees the placement deprecation. Three greens are three different contracts. Put the snapshot in the CI step next to the file.
## What a 2.6 reader does not inherit from the extension
2.5 path still in the builder 2.6 path a current reader uses
regs.ext.gdpr regs.gdpr (0, 1, or omitted for unknown)
user.ext.consent user.consent
source.ext.schain source.schain
user.ext.eids user.eids
video.placement video.plcmt from 2.6-202303, new enum
GDPR omitted means unknown, the same as a flag that never left ext from the reader's point of view. Consent omitted means the TCF string was not on the core object. A supply chain that exists only under ext is invisible to a sellers.json check that reads source.schain . Duplicate the object at both paths only while you are sure the nodes match. Divergent nodes are worse than a single old path, because each reader trusts a different chain.
cattax declares the taxonomy. It defaults to 1, Content Category Taxonomy 1.0. Taxonomy 2 or 3 ids with cattax omitted are the wrong list on a 2.6 request and were simply assumed on 2.5. device.sua is the structured user agent beside device.ua . imp.rwdd and imp.ssai are core, where 2.5 used exchange extensions. Pod fields ( podid , podseq , slotinpod , maxseq , poddur , mincpmpersec , rqddurs ) are how 2.6 describes a CTV break that 2.5 could only express as one impression per slot.
## Pin the snapshot on the builder output, not on a repaired sample
- uses: aleksUIX/rtblint@v0.13.3
with:
path: fixtures/bid-request.json
spec-version: 2.6-202505
dialect: spec-json
Generate that fixture from the builder. A file someone cleaned during the migration review, with regs.gdpr typed in by hand, stays green while production still writes regs.ext.gdpr . Exit 0 means no error-severity finding. Warnings do not fail the job. Exit 1 is a spec error. Exit 2 is usage or I/O. Spec JSON wants integer flags. regs.gdpr: true is protobuf JSON. The dialect flag is part of the version question, because a bool GDPR flag fails Spec JSON even after you moved it out of ext .
Keep a second fixture that must fail on 2.6-202505: regs.ext.gdpr present and regs.gdpr absent, banner.wmax still set, video.placement set and plcmt absent. If that file exits 0, you are pinned to the wrong snapshot or you are not running the file the builder emits. The CI guide is the action contract. The failure mode is a green job on a sample the builder does not return.
The bid request tester runs the same engine. Set the snapshot and Spec JSON before you read a pass. Payloads you paste may be stored with device ids, IPs, and consent strings stripped. A capture that still has device.ifa belongs on the CLI, which does not send the file. RTBlint is not an IAB validator. A pass means the artifact matches the snapshot you selected. It does not mean the bidder filled.
## Enums left the OpenRTB document, and the bid gained a type
2.6 deleted its own Section 5. Device types, API frameworks, creative attributes, and placement subtypes now live in AdCOM 1.0, so a new enum value can ship without a new OpenRTB minor version. No-bid and loss reason codes live in the OpenRTB 3.0 document. A validator still aimed at the 2.5 tables will accept a placement integer 2.6 later deprecated, and will reject a plcmt value that only exists on the AdCOM list. Point enum checks at AdCOM when the snapshot is 2.6.
mtype on the bid tells the exchange which markup came back. 2.5 inferred that from which object you filled. A response checked only against a 2.5 fixture will not require mtype . kwarray is a string array beside the old comma-separated keywords string, on Site, App, Content, and User. BCP 47 language sits on langb . None of those appear because you changed the version constant. They appear because the builder writes them.
Pod bidding is the CTV case of the same gap. 2.5 had one impression per slot and no pod. 2.6 groups impressions with podid , places the pod with podseq , and uses slotinpod when the seller can promise first or last. A dynamic pod sells time: poddur , maxseq , mincpmpersec , and rqddurs . durfloors is the 2.6-202309 addition, a floor by duration range. An exchange extension that used to carry the break is not these fields. A bidder that only reads the extension will price a pod as a single impression.
## What to move before you call the exchange 2.6
Move regs.ext.gdpr to regs.gdpr , user.ext.consent to user.consent , source.ext.schain to source.schain , and user.ext.eids to user.eids .
Name the snapshot. Add regs.gpp and regs.gpp_sid when you claim 2.6-202211 or later. Add plcmt when you claim 2.6-202303 or later, from the AdCOM list, not by copying placement .
Stop sending banner.wmax , hmax , wmin , hmin , video.protocol , and content.videoquality .
Stop populating hashed device ids, user.yob , and user.gender on new integrations.
Declare cattax when category ids are not taxonomy 1.0.
For CTV, send the pod fields instead of an exchange extension that 2.5 required and 2.6 replaced.
Pin spec-version in CI on the builder output. A repaired sample is a different program.
## Further reading
OpenRTB 2.5 vs 2.6: what changed
placement vs plcmt
Privacy signals
Validation in CI
IAB Tech Lab openrtb2.x
---
# A DSP partner sample bid request is not the request production will send. · RTBlint
URL: https://rtblint.org/blog/dsp-sample-bid-request-is-not-production/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## A DSP partner sample bid request is not the request production will send.
September 27, 2026 · RTBlint
A solutions engineer at a DSP can see the partner sample and the specification. They do not own the exchange builder, and they do not own the publisher page. The file attached to the integration review is usually the sandbox. The bidder will see the request the exchange emits on a Tuesday afternoon.
## A clean sample proves the partner can build one legal request
The sample is complete on purpose. imp is an array. video.plcmt is set. regs.gdpr and user.consent sit on the core objects. source.schain is present, complete is 1, and there is one of site or app . imp.secure is the integer 1. imp.bidfloorcur is an ISO-4217 code. at is an integer. Run that file through the tester or rtblint validate on the 2.6 snapshot the partner named, in Spec JSON, and it can come back clean.
Clean means the sample matches that snapshot and dialect. It does not mean the production path emits it. Ask for a second artifact before the integration brief promises a bid rate: one redacted request from the live exchange, or from the queue that will feed the bidder, with test at 0. Paste both, or validate both locally. The delta is the evaluation. A solutions engineer who signs the sample has signed a payload the bidder will not parse.
Prefer the CLI when the capture still has device.ifa , an IP, or a consent string. The tester runs in the browser. Payloads you submit there may be stored with those identifiers stripped. The CLI does not send the file. Strip the token-like values anyway before the file lands in a ticket.
## The live request keeps the 2.5 paths under a 2.6 version
Production builders are older than the sample. The version string says 2.6 because someone updated a constant. The objects were not updated. GDPR is still regs.ext.gdpr . The TCF string is still user.ext.consent . Video still carries placement and not plcmt , and the two enums do not map one to one, so a later mechanical copy of the integer will classify the impression as a different subtype. Supply chain is still source.ext.schain , or it is duplicated at both paths with different nodes. A 2.6 reader does not treat the extension path as the core field. RTBlint reports the move as openrtb.field.moved when the snapshot is 2.6.
The merge bug travels with that drift. A stored request has site . The live impression is an app. Both objects land on the wire. The spec does not allow more than one of site , app , and dooh . Many bidders drop the request. The sample had deleted one of them. The builder has not.
regs.gpp and regs.gpp_sid exist from snapshot 2.6-202211. A sample validated as latest 2.6 can include them. A bidder pinned to an older snapshot, or a partner who only filled the extension GDPR flag, will not. Write down which snapshot each side runs. A claim of 2.6 without a dated tag is not a snapshot.
## What the sample fills and the live request drops
Field Sample Live request
regs.gdpr integer on regs regs.ext.gdpr only
user.consent TCF string on user user.ext.consent
video.plcmt AdCOM plcmt subtype deprecated placement
source.schain core object source.ext.schain , or both
inventory one of site, app, dooh site and app together
imp.secure 1 in Spec JSON true , or omitted
imp.bidfloorcur explicit ISO-4217 absent, so USD
test 0 1 left on from the sandbox
Read the table as two files, not as a score. Each row is a reason the bidder logic you wrote against the sample will miss. A 2.6 privacy module that only reads regs.gdpr will treat the live request as unknown. A video classifier that only reads plcmt will treat the live impression as unclassified. A floor of 120 with no currency is 120 US dollars, because bidfloorcur defaults to USD and does not inherit cur . Deal.bidfloorcur does not inherit the impression currency either.
Omitted imp.secure means the secure state is unknown and non-secure HTTP support can be assumed. true is a bool. In Spec JSON that is a type error. In protobuf JSON, the integer 1 is the type error, and it fails the unmarshal of the whole message, not just the flag. Ask which dialect the pipe uses before you call either file valid. The tester dialect control and --dialect on the CLI are that question.
## Auction type, the test flag, and whose block list arrived
at defaults to 2, second price plus, when it is omitted. The sample that sets at to 1 is a first-price auction. The live request that omits the field is not. A bidder that shades or that expects pay-what-you-bid will be wrong on every impression until someone notices the omission. Values of 500 or greater are exchange-specific. Do not treat an unfamiliar integer as first price.
test defaults to 0. test of 1 is non-billable. A sandbox request left at 1, then copied into the production endpoint, is an auction that must not become spend even when your bidder returns a price and the exchange fires notices. Store the flag against BidRequest.id . The notice side of that mistake is covered in nurl vs burl vs lurl .
bcat , badv , and bapp are on the request that ran, not on a block list the DSP keeps in a UI. Only one of acat or bcat should be present. cattax defaults to taxonomy 1.0, so a Content Taxonomy 2 id with cattax omitted is a different code than the bidder thinks. pmp.private_auction of 1 means only the listed deals. The flag is an integer in Spec JSON. A sample deal with at of 3 means the deal floor is the fixed price, in that deal currency. The sample deal and the live deal are often different ids.
## Do not join the sample to a Prebid capture on imp.id
imp.id is unique inside one request. Exchanges often number impressions 1, 2, 3. That integer will not match a Prebid capture, a TAM request, or an Open Bidding request for what a human calls the same slot. source.tid is shared only when each path sets the same string. imp.tagid is the placement only when the seller sets it and keeps it stable. A solutions engineer who reconciles three debug files on imp.id will conclude the inventory disappeared.
tmax on the sample is whatever the partner typed. On the live path it is the remaining budget, and a downstream hop may only decrease it. A bidder that spends the sample tmax thinking will time out when the live value is what survived the exchange. source.fd of 0 means the exchange receiving the request makes the final sale. 1 means an upstream party still will. Read it on the live file. The sample is often 0 because the drawing in the kickoff slide showed one hop.
If the partner also sends a bid response sample, validate it with --type response --request against the live request, not against the sandbox request. bid.impid has to name an impression on the request you pair. A response that only matches the sample imp.id is a demo. Notice URLs, the price macro, and loss codes are not proved by a request pass.
## What a solutions engineer at a DSP can decide before signature
Validate the sample and a redacted production request as two files. Write down which fields exist only in the sample.
Name the snapshot, the dialect, and the profile. Spec JSON and protobuf JSON do not accept each other flags. Prebid Server, Google Authorized Buyers, Xandr, and Magnite add required extension fields the spec does not.
Require one of site , app , or dooh on the production body. Require regs.gdpr and user.consent on the core objects when the partner claims 2.6.
Require plcmt when the impression is video, and require bidfloorcur wherever the floor is not USD, including each deal.
Require test of 0 on the production path. A sandbox flag copied forward is non-billable traffic.
Do not forecast fill from a sample that has plcmt , a schain, and a single inventory object the live request does not have.
Ask the partner to run rtblint validate in the builder repository, on a fixture generated from the serializer, with exit 1 failing the pull request. Installing the binary at the DSP does not change their deploy.
RTBlint is not affiliated with IAB Tech Lab or with the DSP. A pass means the artifact matches the published snapshot you selected. It does not mean the seat will bid, and it does not mean the publisher consented to the identifier in user.eids . Those are the next questions. They are askable once the two bodies have been compared.
## Further reading
Bid request tester
OpenRTB 2.5 vs 2.6
Privacy signals
Floors and bidfloorcur
Three assemblies of one impression
---
# An exchange bid-request fixture should fail in CI on the builder, not on a cleaned sample. · RTBlint
URL: https://rtblint.org/blog/exchange-bid-request-fixture-fails-in-ci/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## An exchange bid-request fixture should fail in CI on the builder, not on a cleaned sample.
September 27, 2026 · RTBlint
An engineer at an SSP or an ad exchange owns the code that builds the bid request. They do not own the publisher page, and they do not own the bidder. The fixture in the pull request is the only request they can make fail before it is offered.
## The sample in the repo was edited until it passed
Partner reviews produce a pretty JSON file. Someone moves regs.gdpr out of ext , replaces video.placement with plcmt , deletes the extra site object, and checks that file in as fixtures/bid-request.json . CI validates the file. The builder that runs in production still merges a stored site with a live app, still writes regs.ext.gdpr , and still emits imp.secure as true because the struct tags came from the protobuf schema.
Strict partners no-bid that body and send little back. nbr is the bidder declining to bid. It is not a field-level explanation of the request you sent. A revenue dip weeks later is how the cleaned fixture announces itself. The gate has to run on the bytes the builder function returns, with ids and timestamps frozen in the test, not on a document a solutions engineer repaired by hand.
One happy-path banner is not the suite. Keep a fixture the job must reject: both site and app , a string at , imp.secure as a boolean under Spec JSON, regs.ext.gdpr on a pinned 2.6 snapshot, an empty imp array. A suite that only contains the repaired file will stay green on the bug you already shipped.
## Pin the release and the snapshot, and read the exit code
The composite action lives in the rtblint repository. It downloads a release tarball for Linux or macOS, x86_64 or aarch64. A Windows runner is outside that install step. version of auto uses the action ref when you pin a v* tag. A branch ref falls through to latest, so a Monday rule change can fail a Tuesday deploy of a builder you did not edit. Pin the tag. Bump it in a pull request when you want the new findings. cargo install rtblint is the same binary on a laptop.
rtblint validate exits 0 when the payload is valid. Warnings do not fail the process. It exits 1 when there are validation errors. It exits 2 on usage or I/O: a missing file, a bad flag, a snapshot name that does not exist. A red job is a spec error, not a formatting nit. --format json emits stable rule ids, severity, message, and path. The CI guide shows how to allow a known deprecation while still failing structural errors. Do that only for a rule you have a ticket for. An empty allowlist that ignores openrtb.field.moved forever is how source.ext.schain survives a 2.6 migration.
spec-version is the OpenRTB snapshot, passed through as --version . Without it, the CLI uses the latest tracked 2.6 snapshot, which moves when a release lands. Pin 2.6-202505 or whichever snapshot the exchange actually speaks. A field added in 2.6-202211, such as regs.gpp , is not a core field on an older pin. Upgrading the snapshot is a one-line diff, the same way you bump a dependency.
## The step that fails the builder output
- uses: aleksUIX/rtblint@v0.13.3
with:
path: fixtures/bid-request.json
spec-version: 2.6-202505
dialect: spec-json
format: json
# same binary, generated from the builder, not from a repaired sample
rtblint validate fixtures/bid-request.json --version 2.6-202505 --dialect spec-json
dialect defaults to Spec JSON, where flag fields are integers. If the exchange speaks protobuf JSON on the wire, set proto-json . "secure": 1 fails that dialect. "secure": true fails Spec JSON. Running the job in the dialect you do not speak produces a green build and a partner that cannot unmarshal the message. The split is the same 28 flags covered in the two JSON encodings , including regs.gdpr , source.fd , and pmp.private_auction .
profile is optional and defaults to the specification only. prebid-server requires each impression to carry imp.ext.prebid.bidder , a legacy bidder object, or a stored request, and it rejects wseat and bseat with openrtb.profile.field_forbidden . google-ab accepts at of 3, fixed price, and requires imp.ext.billing_id . xandr checks provided Microsoft Monetize bidder fields, including video ext.appnexus.context . magnite validates optional DV+ xAPI extensions. The public sources do not establish universal mandatory inventory IDs for these two contracts. A spec-clean request can still be refused by the exchange whose profile you forgot to set. A profile-clean request can still be illegal as plain OpenRTB if you only ever run the profile.
## Supply-chain checks read a cache you filled, and responses need the request
--resolve --cache checks each SupplyChain hop against sellers.json and the publisher ads.txt or app-ads.txt stored under that directory: sellers//sellers.json , ads//ads.txt , app-ads//app-ads.txt . Nothing is fetched. A green source.schain object means the object matches the spec. It does not mean the seller id is authorized until the cache is populated and the flag is on. An engineer who treats a spec pass as a sellers.json pass has skipped the check.
Bid responses are a second type. --type response validates the response. --request pairs it with the originating request, including in --batch where one request covers many response lines. A request-only fixture never looks at nurl , burl , or lurl . Notice settlement, the price macro, and loss codes are a different contract, written up in nurl vs burl vs lurl . If the exchange builds those URLs, generate a response fixture from that builder too.
--batch reads one JSON object per line. --summary ranks rule ids across a captured stream. That is how you learn that openrtb.field.moved is the common finding in yesterday traffic, which a single golden file will not show. Keep the stream redacted. The CI job should not download a production log that still has device identifiers into the workspace.
## What the red job will not see
CI does not run the publisher page. A Prebid ortb2 merge that only fails for one ad unit will not appear unless that unit output is a fixture. CI does not run the next hop. An exchange that appends a schain node, lowers tmax , or sets source.fd after your builder returns has changed a request your fixture already passed. Capture that outbound body, redact it, and either paste it in the tester or add it as a fixture generated from the same serializer the process uses.
The gRPC sidecar is the same core beside the auction. It does not send payloads off-box. It is not a substitute for the fixture. A sidecar that only logs findings in production is how you discover site plus app after the partner has already stopped bidding. The pull request is the cheaper place.
RTBlint is not affiliated with IAB Tech Lab. Passing the action means the artifact matches the snapshot, dialect, and profile you named. It does not mean the bidder filled, and it does not mean tmax on the wire still matches the fixture after the next hop decreased it.
## What an exchange engineer can gate on the next pull request
Pin aleksUIX/rtblint at a v* tag. Pin spec-version to the snapshot you speak.
Generate the fixture from the builder. A file repaired during a partner review is a different program.
Set dialect to the encoding on the wire. Spec JSON wants integer flags. Protobuf JSON wants bools.
Set profile when the body is Prebid Server, Authorized Buyers, Xandr, or Magnite. Run Spec as well when partners also consume the plain object.
Fail the job on exit 1. Treat warnings as a reading assignment with a rule id, not as a pass you ignore.
Keep a fixture that must fail: two inventory objects, a boolean secure flag in Spec JSON, regs.ext.gdpr on a 2.6 pin.
Pair a response fixture with --request when you build notices. Populate a local cache before you treat --resolve as a sellers.json result.
## Further reading
OpenRTB validation in CI
CLI and library
Common OpenRTB bid request mistakes
Two JSON encodings
rtblint composite GitHub Action
---
# A publisher captured bid request is not the request the DSP bid on. · RTBlint
URL: https://rtblint.org/blog/publisher-captured-request-is-not-the-dsp-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## A publisher captured bid request is not the request the DSP bid on.
September 27, 2026 · RTBlint
An engineer at a publisher owns the page, the Prebid ad unit, and the request that left the browser or Prebid Server. They do not own the exchange adapter that runs after that hop, and they do not own Amazon TAM or Google Open Bidding. The JSON they can export is the artifact the tester can judge.
## Paste the request you built, and set the dialect before you trust a pass
The bid request tester runs the same engine as the CLI, in the browser. Validation itself is local. Payloads you paste may be stored with device IDs, IPs, and consent strings stripped, so a capture that still contains device.ifa or a live IP belongs on rtblint validate on a laptop. The CLI, the library, and the gRPC sidecar do not send payloads. Local rtblint-mcp over stdio does not either. Hosted MCP at rtblint.org/mcp can store what an agent sends, and the tester opt-out does not cover that path.
Set the version to the snapshot you claim to send, usually a tracked 2.6 tag such as 2.6-202505 , not a floating latest. Set the dialect to Spec JSON when the file uses integer flags. Set it to Protobuf JSON when the file came off a gRPC bidstream and flags are true and false . The specification types those flags as integers. The IAB protobuf schema types 28 of them as bool, including imp.secure , regs.gdpr , regs.coppa , source.fd , pmp.private_auction , and the supply-chain complete and hp flags. A payload that is legal in one dialect is a type error in the other, and the error is on the whole message.
Set the profile to Spec unless you are looking at a Prebid Server auction body. The Prebid Server profile requires each impression to name a bidder on imp.ext.prebid.bidder , a legacy imp.ext bidder object, or a stored request, and it refuses wseat and bseat . A spec pass on a Prebid Server payload can hide a missing bidder. A Prebid Server pass on a plain exchange request will fail that same request for fields the exchange is allowed to send. The profile is part of the question. A green badge with the wrong profile is a different auction.
## The fields a publisher capture can actually get wrong
A bid request needs id and a non-empty imp array. Each impression needs its own id , unique inside that request, and at least one of banner , video , audio , or native . An impression object pasted where the array should be is invalid. Several media types on one impression are allowed. A bid still has to conform to exactly one of them.
The request must not carry more than one of site , app , and dooh . They answer the same question, and many bidders drop a request that carries two. The usual cause on a publisher stack is a merge: a stored site object plus a live app object, or a default site left in the Prebid Server stored request while the client sent an app. The capture you paste is the place that merge is visible. The DSP never tells you which object it kept.
at is an integer. 1 is first price. 2 is second price plus. Values of 500 or greater are exchange-specific. Omitted, the default is 2. A string "2" is a type error for a parser that follows the spec. The same string bug shows up on test and tmax . test defaults to 0. test of 1 marks the auction non-billable. A debug capture left on 1 is a request the exchange must not turn into spend, even when bids return.
## Secure, placement, and the privacy flags moved
imp.secure is an integer. 1 means the impression requires HTTPS creative assets and markup. 0 means non-secure is acceptable. If the field is omitted, the secure state is unknown and non-secure HTTP support can be assumed. Sending true is the protobuf dialect, not Spec JSON. A publisher on an HTTPS page who omits the field has told bidders that HTTP creatives are allowed. The page being HTTPS does not fill the field.
imp.video.placement was deprecated in the 2.6-202303 update in favor of imp.video.plcmt . The lists do not map one to one. Plcmt 1 is instream, 2 is accompanying content, 3 is interstitial, 4 is no content or standalone. Copying the old integer into the new field classifies the impression as a different subtype. Buyers key instream off plcmt . A capture that still has only placement is a 2.5 video object wearing a 2.6 version string.
On 2.6, regs.gdpr is an integer on regs : 0 means no, 1 means yes, omitted means unknown. user.consent holds the TCF string. Both moved out of ext . A capture that still writes regs.ext.gdpr and user.ext.consent looks populated in the publisher debug log and empty to a 2.6 reader. regs.gpp and regs.gpp_sid arrived in 2.6-202211. A version pin older than that snapshot will not treat them as core fields. Pin the snapshot you actually emit.
## The floor currency and the final-sale flag are on this request
imp.bidfloor is a CPM, default 0. imp.bidfloorcur is an ISO-4217 code, default USD . It does not inherit cur . A floor of 120 with no currency is 120 US dollars. Deal.bidfloorcur does not inherit imp.bidfloorcur either. A euro floor on the impression plus a bare deal floor is a dollar deal. The publisher who set the number in an ad-unit config and left the currency off has set a floor the bidder will honor and the yield report will not explain.
source.fd says who makes the final sale. 0 means the exchange receiving the request makes that decision. 1 means an upstream party still will, which is the honest value when header bidding sits in front of an ad server. Copying one path onto another is how a Prebid request and an Open Bidding request disagree about who clears. Read fd on the capture you have. Do not assume the next hop keeps it.
source.schain is the SupplyChain object on 2.6, promoted from source.ext.schain . Writing only the old path, or writing both paths with different nodes, is a move the checker reports as openrtb.field.moved when you are on a 2.6 snapshot. complete and hp are integer flags in Spec JSON. A publisher can see whether the chain they attached is well formed. They cannot see the node an exchange appends after the request leaves.
## A spec pass on this file is silent about the other assemblies
Prebid, Amazon TAM, and Google Open Bidding each build a request. The publisher passes an ortb2 document on the Prebid path. TAM runs an auction on Amazon servers and does not take that document. Open Bidding builds the request inside Google Ad Manager. The same SSP called from Prebid and from a yield group is two requests. imp.id is per auction, often 1, 2, 3, and will not join those paths. source.tid joins them only when you set the same string on each. The comparison is in Prebid vs Amazon TAM vs Google Open Bidding . The tester result belongs to the file you pasted.
bcat , badv , and bapp are per request. A block list in the Prebid config is not a block list in TAM. Only one of acat or bcat should be present. cattax defaults to 1, Content Category Taxonomy 1.0. Taxonomy 2 or 3 IDs with cattax omitted are the wrong list. Ad-server exclusions do not become bcat unless the request builder copies them.
tmax is the exchange budget in milliseconds for the whole round trip, including network. The publisher often does not set it. When they do, a bidder that spends the entire value thinking has already timed out. Downstream hops may only decrease it. A capture taken before that decrease is a larger budget than the bidder received.
## What an engineer at a publisher can finish from the capture
Export the request the page or Prebid Server actually sent. Redact device.ifa , IPs, and consent strings before a ticket. Use the CLI when the file still has them.
On the tester, set the 2.6 snapshot you emit, Spec JSON or Protobuf JSON to match the flags, and Spec or Prebid Server to match the body.
Confirm one of site , app , or dooh . Confirm imp is an array and each impression has an id and a media type.
Confirm imp.secure is 0 or 1 in Spec JSON, and that an HTTPS page sends 1 rather than omitting the field.
Confirm plcmt on video, regs.gdpr and user.consent on the core objects, and source.schain on 2.6.
Confirm bidfloorcur on every floor you intend to be non-USD, including each deal. A bare floor is USD.
Read source.fd and test on this file. Do not copy them onto a TAM or Open Bidding request you cannot see.
RTBlint is not an IAB validator and it is not affiliated with Prebid, Amazon, or Google. A pass means the artifact matches the snapshot, dialect, and profile you selected. It does not mean a DSP bid, and it does not mean the next hop sent this JSON.
## Further reading
Bid request tester
Common OpenRTB bid request mistakes
Prebid vs Amazon TAM vs Google Open Bidding
Bid request reference
Spec JSON and protobuf JSON are different flag encodings
---
# nurl vs burl vs lurl lines up a win notice, a billing notice, and a loss notice. · RTBlint
URL: https://rtblint.org/blog/nurl-vs-burl-vs-lurl/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## nurl vs burl vs lurl lines up a win notice, a billing notice, and a loss notice.
September 27, 2026 · RTBlint
People search nurl vs burl, and lurl vs nurl, because all three are URLs on the same Bid . They are not three spellings of one pixel. OpenRTB 2.5 split the win from the bill, and added a loss notice, because a stack that treated the win URL as the invoice was already wrong.
## Three calls, three jobs
nurl is the win notice. The exchange calls it if the bid wins. Winning is the auction result. It is not proof the ad was delivered, viewed, or billable. The response body of that call can carry the markup, and only the markup, when you did not put the creative in adm .
burl is the billing notice. The exchange calls it when, under that exchange's policy, the win becomes something it will pay or charge for. That moment is often delivery or a view. It is not the moment the auction cleared. Best practice in the spec is to fire burl from the exchange server, close to the books, rather than from the device.
lurl is the loss notice. The exchange calls it when it knows the bid lost. The useful token on that URL is ${AUCTION_LOSS} , an integer from the loss reason list. A loss URL with no loss macro tells you that you lost and nothing else. Some exchanges never call lurl . Some call it and blank the price.
Field When it fires What a bidder should book
nurl The bid wins the auction A win. Not a delivered impression, and not a bill, unless you still account on it.
burl The exchange decides the win is billable The money. Policy is the exchange's: delivery, view, or another event it defined.
lurl The bid is known to have lost The reason, if ${AUCTION_LOSS} is on the URL. Not a spend event.
## Billing on nurl double-counts the day you also honor burl
Before burl existed, a lot of bidders incremented spend inside the nurl handler, because the win notice was the only callback they had. That handler is still in production. OpenRTB 2.5 did not delete it. Exchanges that implemented billing notices now call burl as well, and they may still call nurl for the win.
If both handlers add the clearing price to spend, one impression is two invoices. The exchange's own books used burl . The bidder's books used both. The discrepancy ticket looks like an exchange underpay. The log shows two HTTP 200s, one to each path, with the same ${AUCTION_IMP_ID} .
The split to ship is dull and strict. nurl records that this bid id won this impression id, and it can fetch markup if you still serve that way. burl is the only handler that adds money. lurl never adds money. A retry of any of them has to be idempotent on the impression id, because exchanges retry notices.
## A browser-called nurl is a pixel, and the price is in the page
Nothing in the protocol forces the exchange to call nurl from its own servers. Plenty of stacks drop the win URL into the creative as an image, or rely on the device to request it. An ad blocker, a navigated-away page, or a TV that never loads the pixel then looks like the impression did not happen. The auction already awarded it. If you were still billing on nurl , the publisher is unpaid and the bidder thinks it lost a win it actually had.
The same browser call substitutes ${AUCTION_PRICE} before the device requests the URL. The clearing price is then in a query string on the page. That is why exchanges encrypt the price when it has to leave the server, using a suffix the two parties agreed on, such as ${AUCTION_PRICE:B64} . The algorithm is not standardized. A bidder that reads the raw macro on a client-side notice is either seeing a leaked price or a ciphertext it does not know how to open.
burl exists so the bill does not depend on that hop. Server-side, the exchange can put ${AUCTION_PRICE} on the URL without putting it in the browser. A bidder that only looks at client logs will swear burl never fired. It fired on the exchange, toward the bidder's notice host, and the creative never saw it.
## adm wins when both the bid and the notice carry markup
OpenRTB allows the creative in adm , or in the body of the win notice, not as two competing copies. If both are present, adm is what gets served. The nurl response is ignored for markup. A bidder that puts the real creative only in the win-notice body, and also sends a stub in adm , serves the stub.
Markup served on the win notice has a second failure the adm path does not. The exchange has to call nurl and receive a body that is the ad and nothing else before it can render. An HTTP failure after you already won forfeits the impression. Putting the creative in adm removes that round trip. The win notice can still be called for accounting. It should not be the only copy of the ad.
{
"id": "bid-0001",
"impid": "1",
"price": 9.43,
"adm": "...",
"nurl": "https://bidder.example/win?imp=${AUCTION_IMP_ID}",
"burl": "https://bidder.example/bill?imp=${AUCTION_IMP_ID}&p=${AUCTION_PRICE}&cur=${AUCTION_CURRENCY}",
"lurl": "https://bidder.example/loss?imp=${AUCTION_IMP_ID}&loss=${AUCTION_LOSS}&mtw=${AUCTION_MIN_TO_WIN}"
}
That nurl records the win and does not carry the price. The burl carries the price and the currency. The lurl carries the loss code and, when the exchange will say it, the price that would have tied. The creative is in adm , so a failed win-notice fetch does not blank the ad.
## A notice without the macro it exists for cannot settle
Section 4.4 of OpenRTB 2.6 names the substitution tokens. ${AUCTION_PRICE} is the clearing price. ${AUCTION_CURRENCY} is the currency of that price. ${AUCTION_LOSS} is the loss reason. ${AUCTION_MIN_TO_WIN} , added in 2.6, is the minimum price that would have tied the winner when you lost, or the next bid when you won. The exchange replaces a known macro as text. An optional value it does not have becomes an empty string. Values are not URL-encoded for you.
A burl or nurl with no price macro cannot tell the bidder what cleared. The handler may still return 200. Spend stays at the bid price, or at zero, depending on which bug you wrote. A lurl with no ${AUCTION_LOSS} cannot train a shading model. ${AUCTION_MIN_TO_WIN} is allowed to be empty when the exchange will not share price, or when price was not why you lost. Empty is a policy. A missing macro name is a template that never asked.
Typos survive until the notice 404s or the price parser throws. ${AUCTION_PRCIE} is not on the list, so the exchange leaves it in the URL or strips it as unknown, and your handler looks up a column that is the literal string. %%WINNING_PRICE%% is a different exchange's macro. OpenRTB substitution does not expand it. A bid that wins on an OpenRTB exchange with only the percent-encoded Google token bills nothing, and the same creative on an exchange that speaks that token bills normally. The macro alphabet is part of the comparison.
## Loss codes are not no-bid codes
${AUCTION_LOSS} is an integer the exchange chose after it saw your bid. The list lives with the loss reason codes: 100 means the bid was below the auction floor, 102 means you lost to a higher bid, and the 200 range is creative filtering. nbr on a bid response is the opposite direction. The bidder sends it when it chooses not to bid. A 102 on lurl is not an nbr , and an HTTP 204 no-bid never produces a loss notice for a bid you did not send.
Exchanges may withhold the clearing price on lurl , which means ${AUCTION_PRICE} becomes empty even though the macro is present. Shading that treats empty as zero will think the opponent paid nothing. Read empty as undisclosed. Read 102 plus ${AUCTION_MIN_TO_WIN} as the price that would have tied, when the exchange actually substituted one.
A loss notice can also arrive late, after you already counted a provisional win from nurl . If a downstream filter rejects the creative, you can win and then lose. Booking spend on nurl and never reversing it on a later lurl leaves the impression in the win log and in the loss log. The impression id is the join. The URL that fired last is not the one that decides the money. burl is.
## Loss code 0 arrived on lurl, and the bid won
The loss list starts at 0, Bid Won. That code exists so one notice pipeline can report every outcome, including the bids that did not lose. An exchange that calls lurl for every bid will send ${AUCTION_LOSS} = 0 for the winner. A handler that treats every loss URL as a loss will reverse a win, or open a loss row for an impression that also received burl .
Read the integer before you touch spend. 0 is a win reported on the loss channel. 100 is below the auction floor, 101 is below the deal floor, 102 is a higher bid, 103 is a deal that took priority over an open-auction bid. The 200 range is the creative, after the auction: pending scan, disapproved, size, insecure markup. Those are not economic losses, and shading them as if someone paid more trains the model on a filter. Codes at 500 and above are private to that exchange. A parser that maps unknown codes to 102 will call a publisher block a price loss.
Code 4, invalid deal id, is the deal you sent that the exchange does not know. Code 7 is missing markup. Code 8 is a missing crid the exchange required. None of those are fixed by raising the bid. A loss dashboard that only counts 102 hides the notices that are telling you the bid object itself was unusable.
## The id on the notice is not bid.id
${AUCTION_ID} is BidRequest.id . ${AUCTION_BID_ID} is BidResponse.bidid , the optional response-level id, not bid.id and not bid.adid . ${AUCTION_IMP_ID} is imp.id from the request. ${AUCTION_AD_ID} is bid.adid , the markup id, which is also not crid . ${AUCTION_SEAT_ID} is the seat the bid was made for.
An omitted optional value becomes an empty string. If you never set bidid , ${AUCTION_BID_ID} arrives empty, and a join from the notice back to the bid row on that column matches every empty bid, or matches nothing. The id you generated on the bid object has no macro. Put the request id, the impression id, and your own bid id in the query yourself if you need them, and use ${AUCTION_ID} and ${AUCTION_IMP_ID} as the exchange's confirmation of those two. Do not store ${AUCTION_AD_ID} in the creative-id column.
${AUCTION_IMP_TS} is a Unix timestamp in milliseconds of when the impression was fulfilled, not when the auction ran. A billing notice that carries it is telling you fulfillment time. Comparing that number to the auction clock, or treating it as seconds because event_time on a pixel is seconds, files the bill on the wrong day or in 1970.
## The clearing price is after the discount, and it is not your bid
${AUCTION_PRICE} is the clearing price in the same currency and units as the bid, CPM, and it is the final price after the seller discount. ${AUCTION_MBR} , since 2.5, is that clearing price divided by the bid price. ${AUCTION_DISCOUNT_PCT} and ${AUCTION_DISCOUNT_CPM} describe the discount itself. If you book ${AUCTION_PRICE} and then subtract ${AUCTION_DISCOUNT_CPM} , you removed the discount twice.
Booking bid.price instead of the macro is only close when the auction is first price ( at = 1) and there is no discount. Second price clears at someone else's bid. A discount moves the clear even in first price. ${AUCTION_MULTIPLIER} is the quantity of impressions won on multi-viewer inventory, a float that may be below 1. Multiplying the clear by that number as if it were a headcount overstates a screen that the exchange already scored under 1, and ignoring it understates a screen scored above 1.
Currency is ${AUCTION_CURRENCY} , and the macro page calls it confirmation, not a conversion. A handler that assumes USD because the bid was in USD will mis-file a notice whose currency macro says otherwise. Empty price on lurl is still undisclosed. Empty price on burl is a notice that cannot settle, which is a different bug from a loss notice that is allowed to hide the opponent's price.
## The macro inside adm is a second bill
Substitution is not limited to the three notice URLs. The exchange replaces the same tokens inside adm before the markup is served. A VAST Impression URL, or a display pixel , that contains ${AUCTION_PRICE} fires from the device when the ad renders. If the spend handler on that pixel adds the clear, and the burl handler adds it too, you double-counted without ever touching nurl .
The device pixel also puts the price back in the browser, which is the leak burl was meant to avoid. Encrypt it there, with a suffix that exchange actually implements, or leave the price off the creative and keep it on the server-side billing notice. A pixel whose only job is to count a render should not carry ${AUCTION_PRICE} at all.
The win-notice body has the opposite constraint. When markup is served on nurl , that response has to be the ad and nothing else. A handler that returns a JSON receipt, or a 1x1 gif, because the same route also records wins, serves the receipt as the creative. Split the route. Accounting is query parameters and a 200. Markup is adm , or a dedicated body that contains only the ad.
## Two bids for one impression collide on imp.id
A seat may send more than one Bid for the same impid . Each bid has its own nurl , burl , and lurl . Idempotency on ${AUCTION_IMP_ID} alone treats the second notice as a retry of the first and drops it. One of the two bids never settles, or the later price overwrites the earlier one.
bid.id has no macro. The exchange will not echo it unless you placed it in the URL yourself. ${AUCTION_BID_ID} will not save you: that token is one bidid for the whole response, shared by every bid in it. The settlement key is the impression id plus the bid id you wrote into the query. Retries of the same notice still match that pair. A different bid for the same impression does not.
bid.exp and imp.exp are seconds between the auction and the impression, not tmax . tmax is the bid deadline in milliseconds. Loss code 2 means the impression opportunity expired before the bid could be used. A nurl that already fired, followed by lurl with code 2, is a win that never became billable. If burl never arrives, code 2 is the reversal, not a second mystery loss. Booking the win notice and waiting forever for a billing notice leaves that impression in spend after the window closed.
## The clearing price is a CPM, so one impression is not that number
bid.price and ${AUCTION_PRICE} are CPM, cost per thousand, even though the notice is for a single impression. The money for that one impression is the macro divided by 1000, in ${AUCTION_CURRENCY} . A handler that writes the macro straight into the invoice is a thousand times high. The win still looks plausible, because 9.43 feels like a small number, and the books are nine thousand dollars instead of nine.
The spec tells you to do that division in integer or decimal arithmetic, not in a binary float. A CPM of 1.10 divided by 1000 in a float becomes a repeating fraction, and a day of those fractions does not match the exchange's statement. Store the CPM as they sent it, divide once when you post the ledger, and keep the currency macro beside it. ${AUCTION_CURRENCY} is a confirmation of the currency the clear is already in. It does not convert. If it disagrees with BidResponse.cur , you have two currencies for one notice and you do not get to pick the one that makes the day balance.
seatbid.group defaults to 0, which means each impression stands alone. Set to 1, the seat only wants the impressions if it can win all of them. A nurl for one impid in that seat is not a bill yet. If another impression in the group loses, the package fails, and a later lurl on the one you thought you won is the cancellation. Booking each win notice as it arrives, then ignoring the group flag, spends on a package the exchange did not award.
## mtype picks the slot, and the wrong one is a loss you cannot outbid
mtype , added in 2.6, says which impression subtype this bid is for: 1 banner, 2 video, 3 audio, 4 native. The exchange uses it to tie the bid to the right object inside imp . Loss code 204 is incorrect creative format, the case of video markup in a banner slot or the reverse. Code 203 is the size. Neither one moves if you raise price .
A bidder that omits mtype on a 2.6 exchange leaves the exchange to guess from adm . A VAST document in a bid that also claims mtype 1 is a contradiction, and the loss you get is the format code, not 102. Read 204 and 203 before you retune the bid. The creative did not lose an auction. It did not fit the impression the request offered.
OpenRTB 2.3.1 existed in part because ${AUCTION_BID_ID} was being substituted from the wrong field. The correction is BidResponse.bidid . An older notice stack that still writes bid.id into that macro, or reads the macro back into bid.id , joins the settlement to a different row than the one 2.3.1 named. The field list on the current spec is the one to store. The macro name did not change when the source field was fixed.
## AUDIT is the price during a scan, and the scan can call burl
When markup is rendered for testing or ad-quality review, the best practice in the spec is to replace macros with the literal string AUDIT. That is not a number. A settlement handler that parses ${AUCTION_PRICE} as a float will throw, or it will store zero, every time a scanner loads the creative. The auction never happened. The books still moved if the handler's failure path inserts a row.
Scanners also request the URLs in the markup. An Impression pixel, or a burl the exchange calls because the scan counted as a render, arrives at the same host as a real bill. If the only check is that the path is the billing path, the scan is spend. Reject AUDIT before you divide by 1000. Reject a notice whose auction id is not one you sent. A creative-approval tool is not an exchange.
Substitution is textual and does not care if the result is still valid XML or a valid URL. An unknown optional value becomes an empty string, so an attribute that held the price macro can become an empty price, or the literal AUDIT when a scanner rendered it. The player then fails the ad, the nurl already fired, and you have a win with no render and no burl . Put macros in query positions where the substituted value is a number, an id, or an ISO currency code. Do not put them inside markup you also escape, and do not put them where an empty string changes the document.
## test=1 is an auction that must not become spend
test on the bid request defaults to 0. Set to 1, the auction is non-billable test traffic. The exchange may still call nurl , burl , and lurl , because the protocol machinery is the same. A handler that books every burl will book the test. The flag was on the request, which your notice handler does not have unless you stored it against ${AUCTION_ID} .
This is not the AUDIT string. AUDIT is what a scanner puts in place of a macro when nobody ran an auction. test = 1 is a real auction the exchange has already said not to invoice. Drop it before the divide-by-1000 step. A test win that lands in production spend looks like a reconciliation gap against an exchange that correctly omitted it.
Deal.at can override the request auction type for one deal. 1 is first price, 2 is second price, and 3 means the value in that deal's bidfloor is the agreed price, not a minimum. On an at=3 deal, ${AUCTION_PRICE} should be that floor. Booking bid.price bills whatever the bidder offered above or below the agreement. The deal's bidfloorcur does not inherit the impression's bidfloorcur . A euro floor on the impression and a bare floor on the deal means the agreed price is in USD.
## The loss code names a field on the request, not a weak price
Loss 6 is an advertiser domain that was missing, malformed, or not allowed. The bid needed adomain . Loss 205 is that domain against badv . Loss 209 is the creative category against bcat . Loss 206 is an app id against bapp . Loss 210 is a creative attribute against battr , such as autoplay or expandable, on the banner, video, audio, or native object. None of these move if the CPM goes up.
Those lists are on the request that ran. A different request for the same placement can carry a different bcat , or none. Only one of acat and bcat should be present. Category codes are interpreted under cattax . The same integer in two taxonomies is two categories. A loss 209 without the cattax from that request is a code you cannot map.
wseat and wadomain on a deal restrict which seats and which advertiser domains may bid it. Omission means no restriction. pmp.private_auction = 1 means the impression is only the listed deals. An open-auction bid on that impression loses to the deal structure, which is loss 103 when a deal bid took it, not 102. Read the request before you read the loss as a price.
## What to check on one bid before you compare exchanges
nurl records the win. It does not add spend if burl is also in the bid.
burl is server-side and contains ${AUCTION_PRICE} and ${AUCTION_CURRENCY} .
lurl contains ${AUCTION_LOSS} . Treat an empty ${AUCTION_PRICE} on that URL as undisclosed.
The creative is in adm , or only in the win-notice body, not split across both.
Macros are ${AUCTION_*} names from section 4.4. A %%WINNING_PRICE%% token is a different exchange.
Notice handlers are idempotent on ${AUCTION_IMP_ID} .
${AUCTION_LOSS} of 0 is a win. Do not reverse spend for it.
Join on ${AUCTION_ID} and ${AUCTION_IMP_ID} . ${AUCTION_BID_ID} is bidid , and it is empty when you did not set one.
Book ${AUCTION_PRICE} once. Do not also subtract ${AUCTION_DISCOUNT_CPM} . Do not also add it from a pixel inside adm .
Put bid.id in the notice query. Idempotency on ${AUCTION_IMP_ID} alone collapses two bids for one impression.
Divide ${AUCTION_PRICE} by 1000 for one impression. It is CPM. Keep ${AUCTION_CURRENCY} beside it.
If seatbid.group is 1, do not book a partial set of win notices. The seat asked for every impression in the group.
A lurl with code 2 after a nurl expires the win. Do not leave that impression in spend when burl never came.
Loss 203 and 204 are size and format. Check mtype against the imp subtype before you raise the price.
If the price string is AUDIT, it is a scan, not a clear. Do not divide it, and do not book it.
If the request had test = 1, the notices are non-billable. Store that flag against ${AUCTION_ID} .
On a deal with at = 3, the bill is the deal floor, in the deal's currency, not bid.price .
Loss 6, 205, 206, 209, and 210 are domain, category, app, and attribute blocks. Raising the price does not clear them.
The field list and the markup precedence are on the bid response page . The fourteen macros and the encoding suffix are on the macro table . Loss integers are on the loss reason codes . RTBlint warns when a billing notice has no price macro ( openrtb.bid.price_macro_missing ), when a loss notice has no loss macro ( openrtb.bid.loss_macro_missing ), and when a token is not in the 2.6 list ( openrtb.macro.unknown ). Those checks are the template. They do not prove the exchange called the URL, and they do not prove your handler booked the right one.
## Further reading
OpenRTB bid response: seatbid, bid, and the three notices
Substitution macros, section 4.4
Loss reason codes on lurl
IAB Tech Lab openrtb2.x: the 2.6 specification, section 4.4
---
# Prebid vs Amazon TAM vs Google Open Bidding lines up three assemblies of one impression. · RTBlint
URL: https://rtblint.org/blog/prebid-vs-amazon-tam-vs-open-bidding/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## Prebid vs Amazon TAM vs Google Open Bidding lines up three assemblies of one impression.
September 27, 2026 · RTBlint
People search Prebid vs Amazon TAM vs Google Open Bidding because a publisher runs all three on one slot and wants to know which path pays. The fee tables are already published. The bid request is not the same object on the way out, and a field you set in Prebid does not ride along on the other two.
## The comparison is who builds the request
Prebid.js runs in the browser. The publisher page calls the auction, bidder adapters build requests, and those requests can be OpenRTB. First party data is an ortb2 object, plus ortb2Imp on the ad unit, merged into what the adapter sends. If you put source.schain , source.tid , user.eids , regs.gpp , device.sua , or imp.video.plcmt there, a client-side bidder can see them because you wrote them into the merge.
Amazon Transparent Ad Marketplace does not hand you that object. The page calls apstag , Amazon runs the auction on its servers, and a bid comes back to the page for the ad server. The OpenRTB Amazon sends onward to demand is Amazon's assembly. Your controls are the slot, the sizes, the publisher id, and the line item that result becomes. There is no ortb2 document on the page that Amazon is obliged to forward field for field.
Google Open Bidding, the product that used to be called Exchange Bidding, runs inside Google Ad Manager. At ad server time Google calls the yield partners server to server and brings them into the unified auction. The publisher configures a yield group. Google builds the request those partners see. The page does not hold the JSON.
Path Who assembles the OpenRTB What you can edit
Prebid.js The page, then each bidder adapter ortb2 and ortb2Imp on the ad unit. The JSON the adapter sends is that merge.
Prebid Server Your PBS, from a stored request plus the client OpenRTB The stored request and whatever the browser actually forwarded. Adapter ext on the client is not this object.
Amazon TAM Amazon, after apstag returns a bid to the page Slot, sizes, pub id, and the bid that lands in the ad server. Not an ortb2 document.
Google Open Bidding Google, inside Ad Manager, to each yield partner The yield group and what the Google tag collected. Not an ortb2 document.
## A Prebid debug log is evidence about Prebid
The usual QA is a Prebid debug console on one page view. source.schain is populated, regs.gpp matches the CMP, device.sua is present, video.plcmt replaced video.placement . That log is the client-side bidder request. It is not the request Amazon sent, and it is not the request Google sent to a yield partner for the same impression.
Buyers who later reject the domain for a missing chain, or for a US Privacy string where they expected GPP, may be looking at a different path than the one you screenshotted. The impression can clear on Prebid with a complete chain and clear on Open Bidding with whatever Google assembled. Both are the same ad unit in the ad server report. They are not the same payload.
The fields that matter for that argument are the ones a buyer actually filters on: source.schain and whether complete is 1, user.eids , regs.gpp plus regs.gpp_sid against regs.us_privacy , device.sua against a frozen device.ua , and imp.video.plcmt against a legacy placement . Set them where you own the JSON. Then capture the request on each other path before you tell a buyer the slot "has schain."
## Prebid Server is a second assembly, even inside Prebid
Prebid.js and Prebid Server are not one request with the transport swapped. The browser sends an auction to your Prebid Server. PBS merges that OpenRTB with a stored request and calls bidders from the server. A key a client adapter hung on imp.ext for its own bidder does not become a field on a different server-side bidder's OpenRTB. The stored request is the other half of the merge. A source.schain that exists only in the stored request is what the bidder sees when the client omits source . A client that sends a source object is now part of that merge, and you have to know which copy wins for the fields you care about.
Timeouts shrink on the way. The browser auction has its own limit. By the time PBS calls a bidder, part of that budget is gone, and the tmax on the server-side request is the time PBS still has, not the number you configured on the page. A bidder that looks slow only on the server path may be seeing a shorter tmax than the client adapter on the same slot. Floors and currency can also be rewritten before the bidder sees them. The ad unit's floor in the page config is not automatically imp.bidfloor plus bidfloorcur on every server hop.
Hybrid pages make this worse. Some bidders stay client-side and receive the ortb2 merge. Some are marked server-side and receive the PBS merge. A publisher who "set GPP in Prebid" set it for the path whose merge includes it. The other bidder in the same auction can be on the other merge. Debug one bidder and you have not debugged the auction.
## The same SSP on two paths is two requests
Mature stacks run Prebid and Open Bidding together, and often TAM as well. The mistake that shows up in the ad server is the same SSP enabled as a Prebid bidder and as an Open Bidding yield partner. That SSP receives two requests for one impression. It may bid both. If the Open Bidding response wins, the impression clears through Google's path, including Google's fee, on demand you might already have reached from Prebid without that hop.
Deduping those bids is an ad server problem: line item priority, price granularity, and whether you meant to prefer one path. It does not make the two OpenRTB bodies identical. One of them went out from the page or from your PBS, with your ortb2 . The other went out from Google, with the yield group's request. Turning the yield partner off, or turning the Prebid bidder off, is how you stop paying twice for one look. It is also how you stop pretending a single debug log describes both.
TAM beside Prebid is the same shape. Amazon's bid returns to the page as something the ad server can rank against Prebid's bid. The request Amazon already sent to its demand is not editable at that moment. If a deal or a floor existed only in the Prebid ad unit, Amazon's callers did not see that ad unit.
## tid is three scopes, and only the path you built will share them
Auction dedup and log join depend on which id you stored. source.tid is the transaction. imp.ext.tid is the impression inside it. A page-level refresh or a second path's auction will not reuse them unless that path was given the same values. Prebid can set both from ortb2 and ortb2Imp . A TAM bid and an Open Bidding bid for the same slot arrive with the identifiers those platforms put on their own requests. Joining all three in a log on source.tid fails open: the rows do not share a tid, so they look like three auctions, which they are.
source.schain has the same problem. A complete chain on the Prebid request means the nodes you, or your wrapper, wrote. It does not mean the Open Bidding request's source.schain lists the same nodes, or that TAM forwarded the chain you would have written. Supply-path QA that crawls ads.txt and sellers.json still has to be pointed at the chain that was actually on that request. The file on the publisher host does not change per path. The schain object does.
Privacy strings split the same way. A CMP that wrote regs.gpp into Prebid's ortb2 did not automatically write it into Google's yield-partner request or into Amazon's. A US Privacy string left in regs.us_privacy on one path, and a GPP string on another, is two different signals for one user. Buyers who drop one and keep the other are not contradicting themselves. They saw two requests.
## The same integer is not the same video placement
video.placement and video.plcmt are both integers, and they do not share a table. A 1 on the old field is not a 1 on the new field. Prebid can send plcmt because you set it on ortb2Imp . Another path for the same slot can still be sending placement , or inferring a placement from the ad unit size, or sending both and letting them disagree. A buyer who filters instream on plcmt will keep one path and drop the other while the ad server report shows one line item.
The same trap sits on the flag fields. The OpenRTB specification types regs.gdpr , imp.secure , device.dnt , and the rest of that family as integers, 0 or 1. The IAB protobuf schema types those same fields as bool. A browser Prebid request is usually the integer JSON. A server-side hop that was built from the protobuf dialect sends true and false . A filter written as gdpr == 1 drops the bool path and keeps the integer path. Both requests were trying to say the call is in scope. The two JSON dialects are not a Prebid-only problem, and they show up the moment one of the three assemblies is not the page's JSON.
device.sua against a reduced device.ua splits the same way. Prebid can pass the structured user agent because the page collected client hints and wrote ortb2.device.sua . A path that only forwards the frozen user-agent string will classify the device from placeholders. Buyers who require sua are not rejecting your inventory. They are rejecting the assembly that never received it.
## A floor and a deal on the Prebid ad unit are not on the other auctions
imp.bidfloor and imp.bidfloorcur are properties of the request that bidder sees. Prebid can set them on the ad unit that becomes the client request, and Prebid Server can rewrite them again before its own bidder call. Amazon's auction and Google's yield-partner call have their own floors. A bid that clears the Prebid floor can lose the Open Bidding auction for price, and the loss notice, if you get one, is 100, below the auction floor of the auction that actually ran. That floor is not the number in the Prebid config.
Deals are the same split. imp.pmp on the Prebid request lists deals you put on that ad unit. TAM and Open Bidding do not inherit it. A bidder that replies with a dealid the exchange has never been told about gets loss code 4, invalid deal id. A bidder that sees the deal only on the Prebid path and bids the open auction on the other paths is not under-bidding a deal. The deal was never in those requests. Loss code 101, below the deal floor, only makes sense on a path where that deal was actually offered.
The price the ad server ranks is not automatically the OpenRTB price . It has already been interpreted in some currency, and ${AUCTION_PRICE} later will be the clearing price after discount, in the bid's units, CPM. Comparing a Prebid CPM, a TAM CPM, and an Open Bidding CPM as three readings of one number skips cur , the auction type, and which assembly applied a floor. Pick the path after you have those, not after you have a fee card.
## source.fd says who is still allowed to pick the winner
source.fd is who makes the final sale. 0 means the exchange that received this request. 1 means an upstream source: a header-bidding wrapper, another exchange, or an ad server that still mixes direct and programmatic demand. The field exists because header bidding is the case where the exchange on this hop does not control the sale. source.tid is how those hops are supposed to share an id. fd is how a bidder is supposed to know this hop is not the end.
A Prebid call that sits in front of Google Ad Manager is upstream of the final decision, so fd = 1 is the honest value: the ad server still ranks that bid against TAM and Open Bidding. Marking the Prebid request fd = 0 tells every bidder that this exchange already is the sale. They shade, and they spend, as if the ad server were not about to rank that bid against TAM and Open Bidding. The hop that really is the final sale is the one that can be fd = 0. Read the flag on each captured request. Copying one path's value onto the others inverts it on at least one of them.
Do that read before you describe the slot as one auction. A bidder that offers its full value only when fd is 0, and shades when fd is 1, will price the two hops differently even when the impression, the floor, and the fee are the same. That gap shows up in the ad server as a path preference. It is the flag.
## schain and the consent string moved, and only some paths moved
In OpenRTB 2.6, source.schain is the SupplyChain object. The previous location was source.ext.schain . user.consent is the TCF string on the user object. It used to live under user.ext , the same move regs.gdpr made out of ext . A buyer who reads only the 2.6 field sees an empty chain and an empty consent on a path that is still sending the ext form, and passes a path that moved.
Prebid can be configured to send the core fields. A stored request written for 2.5, or a yield partner still on the ext object, will not match that capture. RTBlint reports the old schain path as openrtb.field.moved . The finding is per payload. It does not propagate to the other two assemblies of the impression. Run it on each request you saved, not on the Prebid debug object alone.
imp.exp is seconds from auction to impression. tmax is milliseconds to answer the bid. They are not substitutes, and they are not shared across paths. Prebid Server's tmax is the time it has left. Amazon and Google set the deadline on their own calls. A bidder that no-bids one path for timeout and bids another is answering two clocks. Loss code 2 later, on the path that did bid, means that path's impression window expired. It does not explain the path that never received a bid.
## buyeruid is one bidder on one path, and the other paths do not have the sync
user.id is the exchange's identifier for the browser. user.buyeruid is the bidder's identifier, written from a cookie sync: the exchange looks up its own cookie and inserts that DSP's id before it sends the request. user.eids is the array of extended ids, each with a source and a uid. A DSP can frequency-cap and retarget on buyeruid . It cannot do that with user.id unless it built its own map.
Prebid's user-id modules run on the page and can fill eids , and sometimes buyeruid , on the request those bidders receive. That sync is Prebid's. Amazon's call and Google's yield-partner call do not execute those modules. The same DSP, on the same page view, can see a buyeruid from Prebid and an empty buyeruid from Open Bidding. It bids like it knows the user on one path and like the user is new on the others. The ad server then ranks a recognized bid against an anonymous one and calls the difference a price.
source.pchain is the older payment-chain string, still a field on source beside schain . A checker that only reads the SupplyChain object treats a pchain-only request as having no chain. One assembly can be on schain , one still on source.ext.schain , and one on pchain alone. All three can be authorized supply. Only one of them looks authorized to a reader of a single field.
## imp.id is this auction, and tagid is the placement
imp.id is required, and bids copy it into impid . It is often just 1, 2, 3 for the slots in that request. It is not stable across refreshes, and it is not stable across paths. Joining Prebid, TAM, and Open Bidding on imp.id joins unrelated auctions that happened to number their first slot 1.
imp.tagid is the placement id the publisher means: the ad unit, the slot name. It joins the three paths only when each assembly was given the same string. Prebid's ad unit code does not become Amazon's slot name, and neither becomes the Ad Manager ad unit path, unless you set tagid yourself on each request. A log that almost matches on tagid, off by a prefix one platform added, is three placements to a buyer and one slot to you.
Without a shared tagid , the ids you do have are source.tid if you passed one, and the ad server's own auction id after the fact. The OpenRTB requests do not share an id just because they competed for the same line item. Capture tagid , imp.id , and source.tid per path and expect them to differ. The bug is a report that averages them into one request.
## The floor currency defaults to USD, and secure omitted is not secure
imp.bidfloor is a minimum CPM. imp.bidfloorcur is the currency of that floor, and it defaults to USD. It does not inherit cur on the request. A floor of 120 that was meant as yen, sent without bidfloorcur of JPY, is a 120 USD floor, and it kills every bid on that path. Each deal in imp.pmp.deals has its own floor and its own currency, with the same USD default. Prebid can set one floor. Amazon and Google set theirs. A loss code 100 on one path is that path's floor in that path's currency, not the number in another system's config.
imp.secure is an integer. 1 means the impression requires HTTPS markup. 0 means non-secure is acceptable. Omission does not mean secure. If the field is absent, the secure state is unknown and non-secure HTTP can be assumed. Sending true instead of 1 is the bool dialect, and a strict reader drops it. A Prebid request built from an HTTPS page can send 1. A server-side assembly that never received the flag can omit it. Buyers who require secure impressions keep one path and reject the other. Loss code 207, creative not secure, is the creative loading HTTP into an HTTPS impression. It only happens on the path that actually said secure was 1.
A request must not contain more than one of site , app , and dooh . They answer the same question, and many bidders drop a payload that has two. That payload shows up when a stored request still carries site and the live call adds app , or the reverse. The other assemblies of the same impression may be a clean site or a clean app . One path no-bids as malformed. The ad server still fills from the path that was only one object. The fix is to look at the JSON that left, not at the ad unit form that produced it.
## at is per request, so the three CPMs are not one kind of price
at is the auction type on that request. 1 is first price: the winner pays their own bid. 2 is second price: the winner pays just above the next bid. OpenRTB has no field for bid shading. The model lives in the bidder and learns from lurl , especially ${AUCTION_MIN_TO_WIN} . A path that is at = 1 and a path that is at = 2 teach that model two different lessons, and the CPM that comes back to the ad server is not the same kind of number.
Read at on each captured request before you rank the paths by the price in the ad server. A first-price bid is what the bidder was willing to pay on that hop. A second-price clear is what the auction settled at, which ${AUCTION_PRICE} will confirm later, after discount, in CPM. Averaging them, or picking the path whose ad-server CPM is higher, mixes a bid with a clear. The fee is a third adjustment on top of that, and it is still not this comparison.
## A block list on one request does not protect the other two
bcat , badv , and bapp are the blocked categories, advertiser domains, and app ids on this request. battr is the blocked creative attributes on the banner, video, audio, or native object. Only one of acat and bcat should be present. Category numbers mean what cattax says they mean. The same integer under two taxonomies is two categories.
Prebid sends the lists you put in ortb2 and on the format object. Amazon and Google send the lists on the requests they build. An ad-server category exclusion is not automatically bcat on the Prebid call, and a Prebid badv is not automatically a protection on Open Bidding. Loss 209, 205, 206, or 210 on one path means that path's list rejected the creative. The other paths can still serve it. A buyer who says the slot blocks a category saw one request.
pmp.private_auction = 1 limits the impression to the deals in imp.pmp.deals . wseat and wadomain on a deal limit who may bid it, and omission means no limit. A private auction on the Prebid ad unit is not a private auction on TAM or Open Bidding unless those requests also say so. An open bid that loses with code 103 lost to a deal on the request that had one.
## If at is missing, the auction is second price
at defaults to 2. That is second price plus, not first price. A request that omits at is second price plus: the winner pays just above the next bid. A path that sends at = 1 is first price, and the winner pays their bid. Reading a missing field as 1, because that is the auction you run in the ad server, makes ${AUCTION_PRICE} look like a bug when it comes back below the bid.
Values 500 and above are exchange-specific. A 500 on one path and a 1 on another are not comparable, and a bidder that does not know that exchange's private type should not treat it as first or second. Deal.at overrides the request for that deal only, including 3, where the floor is the fixed price. Capture at on the request and on each deal before you explain a CPM in the ad server. The default is the part people skip, and it is 2.
## What to capture before you pick a path on price
For each Prebid client bidder, save one real request and check source.schain , source.tid , user.eids , regs.gpp , device.sua , and video.plcmt .
For each Prebid Server bidder, save the request PBS sent, not the browser adapter's imp.ext . Compare tmax to the page timeout.
For TAM, save the bid that returned to the ad server and, if Amazon gives you a sample of the outbound request, the fields on that sample. Do not paste the Prebid log into the TAM column.
For Open Bidding, list yield partners against Prebid bidders. One SSP on both lists is two requests. Confirm which OpenRTB body each partner received before you describe the slot as a single chain.
Do not join the three paths on source.tid unless you passed the same tid into each assembly. You usually did not.
Compare video.plcmt to video.placement per path. The integers do not map.
Note whether regs.gdpr and the other flags are 0 or 1, or true or false. A filter for one dialect drops the other.
List imp.pmp and imp.bidfloor per path. A loss code 4 or 100 on TAM or Open Bidding is that path's auction, not the Prebid ad unit.
Read source.fd per path. 0 means this exchange decides the sale. 1 means an upstream ad server still will. Header bidding is the second case.
Look for source.schain and, if it is absent, source.ext.schain . The same for user.consent and user.ext.consent . A pchain string is not a schain object.
Compare user.buyeruid and user.eids per path. A sync that ran in Prebid did not run for TAM or Open Bidding.
Record imp.tagid and imp.id separately. Only tagid can name the placement, and only if you set the same string on each path.
Record imp.bidfloor and imp.bidfloorcur per path. A missing currency is USD, not the request cur .
Record imp.secure per path. Omitted is not 1. true is not 1 either.
Record at per path before you compare the CPM numbers in the ad server. 1 and 2 are different prices. If the field is absent, it is 2.
Reject a request that contains more than one of site , app , and dooh . Bidders drop it, and the fill you see came from a different path.
Diff bcat , badv , bapp , and battr per path, and note cattax . A block on one request is not a block on the others.
Note pmp.private_auction and each deal's at . 3 means the floor is the price. The deal currency does not inherit the impression floor currency.
Fee schedules still matter, and they are a different article. This one is the request. Prebid's first party data merge is documented as ortb2 . Prebid Server's half of the merge is the stored request. Amazon and Google document their own auction surfaces, and neither of those surfaces is that JSON. RTBlint checks the OpenRTB you actually have: the chain, the GPP pair, the plcmt value, the tids. Point it at each path's payload. A single green Prebid request does not clear the other two.
## Further reading
ads.txt, sellers.json, and schain
OpenRTB 2.5 vs 2.6, including plcmt
Three years of plcmt: placement is not a rename
Prebid: first party data and the ortb2 merge
Prebid Server: stored requests
user.id, buyeruid, and eids
---
# Two-thirds of tested publisher homepages let every synthetic bot through. OpenRTB still treats device.ua as identity telemetry. · RTBlint
URL: https://rtblint.org/blog/publisher-homepage-bot-gates-spoofed-crawler-ua-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## Two-thirds of tested publisher homepages let every synthetic bot through. OpenRTB still treats device.ua as identity telemetry.
September 26, 2026 · RTBlint
Invalid traffic arguments usually stop at the impression: datacenter IP, mismatched bundle, a thin device object. On September 22, 2026, a bot-security vendor published its State of Bot and Agent Security Report 2026, combining twelve months of customer traffic with an external test of 21,491 heavily visited domains in June 2026. Sixty-five point three percent of those domains let every one of ten synthetic visitors through without a block or a challenge. Only 2.4 percent stopped all ten. The same report finds more than seven in ten sites letting a spoofed AI agent or crawler through, because blocklists match published names, not impersonation. That is a homepage result. Programmatic buyers still read device.ua on the bid request as if it were the same class of signal.
## What the benchmark actually measured
The external test is not a crawl of ad tags. Researchers sent automated requests to homepages across fifteen industries, routing through residential proxies in the United States, Canada, and France so sites could not filter on datacenter IP alone. Each domain received ten bot types across four tiers: two basic bots with minimal headers, four spoofed AI agents and crawlers with forged headers for a major search crawler, a conversational agent, a training crawler, and another assistant crawler, one disguised bot with forged TLS and HTTP/2 behavior, and three real-browser automations with anti-detection tooling.
A site counted as fully protected only if it blocked or challenged all ten. Partial protection meant at least one tier was stopped. Unprotected meant none were. In 2026, 65.3 percent were unprotected, up from 61.2 percent in a 2025 edition with a smaller sample. Partial protection fell from 36 percent to 32.3 percent. Fully protected sites fell from 2.8 percent in 2025 to 2.4 percent in 2026, and from 8.4 percent in 2024. The vendor warns the year-on-year decline is directional because the 2026 suite added spoofed AI agents and more sophisticated bot types, and the sample grew by more than 4,500 domains.
Tier-level results matter for how you read user-agent strings elsewhere. Only 5.5 percent of sites detected every basic Tier 1 bot. Tier 2, the spoofed AI and crawler names, had the highest detection rate: 29.3 percent stopped at least one forged agent and 14.1 percent stopped all four. The report attributes that to blocklists: publishers who added rules for well-known training crawlers catch spoofed versions as a side effect, not because the site can detect impersonation. More than seven in ten sites still let a spoofed AI agent through without challenge, and a bot using an unknown agent string passes the same lists untouched.
The customer-traffic half of the report is a different population: more than 75,000 sites that already pay for downstream bot filtering, often behind a CDN with basic bot filtering enabled. Bad bot traffic on that base grew 124.0 percent over the year while human traffic grew 13.2 percent. AI agent and crawler traffic totaled 52.7 billion requests. AI requests to login pages rose from 11.9 million in January 2026 to 99.7 million in June, an increase the report frames as 735.8 percent. Login pages took 51.7 percent of high-risk AI endpoint traffic in the first half of 2026, up from 23 percent in the prior edition. Forms still grew in absolute terms but fell as a share. None of that appears on a seller fill report. It appears on pages where lead pixels and checkout events fire after the click.
## Why the bidstream sees a different gate
OpenRTB carries the user agent on the device object. Pre-bid lists, datacenter filters, and many IVT classifiers treat that string, together with IP, app or site identifiers, and schain, as the telemetry available at auction time. Media Rating Council invalid traffic guidance lists unmodified user agent among the signals that determine whether an impression is classifiable. A request that clears the exchange with a plausible device.ua is not automatically fraud. It may be exactly what a classifier needs. It is also not proof that the publisher's public homepage would have challenged the same automation on a form post.
// Same string family, different enforcement surfaces
"device": {
"ua": "Mozilla/5.0 ... GPTBot/1.0 ...", // pre-bid list may GIVT-flag
"ip": "203.0.113.10",
"ifa": "..."
},
"site": {
"page": "https://publisher.example/signup",
"publisher": { "id": "..." }
}
The homepage benchmark tests the marketing domain's edge. The bid request may arrive from an in-app WebView, a reseller path, or SSAI middleware where the user agent is a server string or a frozen Chrome reduction value. Buyers who sample SSP logs see one row. Security teams who run bot tests see another. Comparing them without labeling the surface is how a low platform-side IVT rate coexists with lead forms that never saw a human typist.
Spoofing rates rose in the report's February to July 2026 window. Traffic claiming known agent identities without being those agents increased 45 percent in aggregate across tracked agents. Meta-ExternalAgent saw 16.4 million spoofed requests in February and 12.7 million in July. Individual agents such as PerplexityBot showed spoofing rates around 2.4 percent in February and conversational agents near 5.6 percent spoofed by July in one category breakdown. OpenRTB has no field that says this user agent was cryptographically issued by the crawler owner. It has a string. Blocklists on the buy side and blocklists on the publish side both key off that string, which is why Tier 2 detection peaks above Tier 1 even when overall protection collapses.
## The mechanism from impression to polluted downstream pools
Scraping dominated bad bot volume on the vendor customer base at 70.9 percent and grew 185.2 percent over twelve months. Simple bots, the kind that expose WebDriver signals from basic automation frameworks, made up 49 percent of a classified bad-bot sample and evaded detection on 88.6 percent of websites tested. The report's explanation for why attackers still run them is blunt: they continue to work. When those sessions trigger display clicks, fill lead forms, or add items to carts, they enter retargeting and lookalike pools that DSPs price on a later bid request with no memory of the homepage test outcome.
Coverage of the same report ties form endpoints to marketer pain explicitly: 198.9 million AI requests reached forms in six months on the vendor network, with lead fraud and form abuse among the named risks. DoubleVerify reported on July 29, 2026 that AI bots generated up to ten times more clicks than humans in some unprotected campaigns. A Lunio survey cited in the same synthesis found only 5.3 percent of marketers running a dedicated invalid traffic platform while 75.6 percent estimated losing budget to bots. Those numbers sit in click and conversion denominators. The OpenRTB impression that preceded them can look ordinary.
AI-referred traffic adds a measurement split. The report counted 89.4 million AI-referred visits to customer sites in the first half of 2026, with one assistant product generating 83.4 percent of referrals. Google Analytics added an AI Assistant channel on May 13, 2026 to classify some of that traffic. Referrals and automated requests are different quantities: roughly one referred visit for every 330 AI requests in the same half-year window in the report's arithmetic. A buyer optimizing on referral growth is not automatically filtering the crawl and login traffic that shares the same brand names in user-agent strings.
None of this replaces MRC decision-rate discipline on classified impressions. It complicates the story that if the bid request is clean, the path to conversion is clean. Unknown impressions remain unknown under MRC rules. Homepage bot gates that fail open push uncertainty to the post-click surface where pixels, not OpenRTB, record outcomes.
## What to do on the buy and sell side
Separate impression IVT from landing-page bot exposure in QBRs. A protected campaign rate on classified impressions does not describe form fills on a site that blocked zero of ten synthetic homepage visitors in June 2026.
Sample device.ua and device.sua by supply path, not only by domain. Compare SSAI and reseller hops where the user agent is middleware against direct app traffic on the same publisher brand.
Treat spoofed crawler strings as a list problem, not proof of intent. Tier 2 detection in the benchmark worked when names matched published crawlers. Unknown agents and disguised TLS bots bypass the same logic on both homepage and bidstream.
Validate structural bid requests before blaming fraud tools. Missing device fields, inconsistent video objects, and broken schain push impressions toward unknown in accredited measurement. Paste production traffic into the bid request tester or follow the CI validation guide on every exchange integration release.
RTBlint does not detect bots, invalid traffic, or homepage bot management. It flags malformed or inconsistent OpenRTB payloads. A well-formed request with a spoofed or automation-heavy user agent can pass validation and still fail every business test on the landing page.
## Sources
Figures on the 21,491-domain benchmark, tier detection rates, traffic growth, AI login volume, spoofing counts, and referrals come from coverage of the September 22, 2026 State of Bot and Agent Security Report 2026. OpenRTB field names follow IAB Tech Lab publications. MRC invalid traffic terminology follows accredited guidance cited in prior RTBlint posts. The analysis is our own. RTBlint is independent and not affiliated with DataDome, IAB Tech Lab, or PPC Land.
PPC Land: Full bot protection drops to 2.4% of popular websites (September 26, 2026), synthesis of the September 22, 2026 bot and agent security report
DataDome: State of Bot and Agent Security Report 2026 (publisher page)
RTBlint: MRC invalid traffic rules require a decision rate (August 31, 2026)
---
# Comscore uniques at a flagship publisher fell seventy-eight percent since 2021. OpenRTB site.domain did not shrink with them. · RTBlint
URL: https://rtblint.org/blog/comscore-uniques-fell-open-exchange-domain-did-not/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## Comscore uniques at a flagship publisher fell seventy-eight percent since 2021. OpenRTB site.domain did not shrink with them.
September 24, 2026 · RTBlint
AdExchanger's September 18 roundup tied the ad-tech equity mood to a harder publisher fact: destination traffic is not what it was when open-web programmatic became the default reach buy. The same week, Status published audio from a Business Insider all-hands where CEO Christian Baesler walked staff through Comscore curves. Talking Biz News summarized the slide on September 17: average monthly uniques peaked at ninety-five million in 2021, averaged twenty-eight million in 2025, and sit at twenty-one million year-to-date in 2026, a seventy-eight percent drop from the peak. That is a publisher audience statement. It is also a bidstream statement, because nothing in OpenRTB retires the domain when Comscore uniques fall.
## What the Comscore curve measures (and what it does not)
Comscore uniques count people the panel attributes to a property over a month. They are not impressions, not bid requests, and not ad-server billable events. They are a third-party estimate of who still shows up on the owned site after search referrals, social distribution, and direct visits are all netted out. When that number falls from ninety-five million to twenty-one million, the publisher is telling advertisers and its own staff that the traffic-driven model that funded the newsroom for a decade is structurally smaller.
Baesler's response, as reported, is to pivot revenue toward newsletters, franchises, and off-platform audiences the company has not fully monetized. That is a sales strategy. It does not change what a demand-side platform sees at bid time. A browser or in-app webview that loads a article page still emits a bid request with site.domain , site.page , and often a publisher.id or exchange-specific seller mapping. Those fields describe where the ad slot lives, not how many humans visited that publisher last month according to Comscore.
Measurement vendors will rightly note that Comscore changed methodologies since 2021, so year-over-year lines are not perfectly comparable. Staff quoted by Status treated the 2025 to 2026 slope as less catastrophic than earlier years, which might mean stabilization or might mean the floor. For programmatic buyers the directional fact is enough: the publisher itself presented a audience curve down seventy-eight percent from peak while still operating a ad-supported site that clears in open exchange pipes.
## Why bid volume decouples from publisher uniques
Open-web programmatic scale is built from many sellers, not one Comscore line item. When search-referred traffic collapses at a flagship news brand, several things can still keep bid requests flowing on domains buyers recognize. Syndicated and licensed content reuses the same site template. Archive pages stay indexable and monetized. International editions and vertical subdomains carry separate site.domain values but the same buyer mental model. Remnant inventory from networks and exchanges does not pause because Comscore moved.
Meanwhile the long tail of open exchange supply did not shrink when Business Insider uniques did. MFA domains, arbitrage paths, and low-CPM news aggregators still compete in the same auctions where a buyer typed "news" into a domain list. A campaign optimizing toward cheap CPC on broad contextual news can increase bid request consumption even as measured uniques at tier-one publishers fall. The auction counts requests, not panel uniques.
That decoupling is why equity analysts conflate open-web ad tech with traffic risk while operators still see fill on news-shaped inventory. Both can be true. Total addressable audience for premium publisher relationships shrinks. Total bid requests carrying news-like signals can stay flat or grow if buyers widen domain lists to hit reach goals set before the traffic collapse.
## What shows up on the wire
A typical open-web banner or outstream video request still looks structurally valid when the human audience behind the publisher brand is much smaller than five years ago. The device object carries a real user agent. GDPR and US privacy strings may be present. The problem is interpretive: buyers treat site.domain as a proxy for "this many people saw this brand this month," but the request only certifies that this URL served an ad slot now.
{
"id": "req-open-web-news-1",
"imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }],
"site": {
"domain": "businessinsider.com",
"page": "https://www.businessinsider.com/example-story-2026-9",
"publisher": { "id": "pub-exchange-8842", "name": "Business Insider" }
},
"device": { "ua": "Mozilla/5.0 ...", "ip": "198.51.100.42" },
"source": { "schain": { "complete": 1, "nodes": [ /* ... */ ] } }
}
Nothing in that JSON tells the bidder that Comscore uniques averaged twenty-one million this year. Nothing flags that the page view might be syndicated, cached, or arriving from a traffic source the publisher no longer prioritizes. A shape validator confirms the site object is present and the domain matches IAB content categories you expect for news. It does not reconcile panel reach. That reconciliation still lives in post-campaign reporting, if it happens at all.
Supply-path tools add another layer. A complete schain tells you which seller IDs participated. ads.txt and sellers.json tell you whether those IDs were authorized for that domain. Authorized syndication can be legitimate and still serve an audience nothing like the ninety-five million uniques peak buyers remember from media plans written in 2021. Directness validation answers "was this seller allowed to resell this domain?" It does not answer "how many humans still read this publisher?"
## AI search and the open-web bidstream
The AdExchanger traffic narrative is not only about one publisher. Search interfaces that summarize articles without sending referrals shrink the numerator in publisher analytics while leaving HTML pages and ad tags in place for the fraction of users who still click through. Programmatic demand that was bought as "open web news" often does not distinguish search-referred humans from dark social, app webviews, or international readers. When uniques fall, frequency on the remaining visitors rises unless buyers cut caps. The bidstream does not automatically raise CPMs to compensate; it keeps clearing impressions on the same domain keys until buyer-side filters or pacing kick in.
Off-platform growth the CEO described (YouTube serials, LinkedIn, newsletters) may be the right business response. Those channels often do not arrive as standard site traffic in OpenRTB at all. They arrive as app inventory, social placements, or email clicks that never touch the domain buyers still target in their open-exchange line items. A media plan that funds open-web domain lists while the publisher moves revenue to non-website channels is optimizing a shrinking slice of the relationship.
RTBlint is independent and not affiliated with Business Insider, Comscore, Status, AdExchanger, or any exchange. The linter checks whether the request matches OpenRTB shape and exchange profiles. It does not measure audience size or detect traffic collapse. The gap between panel uniques and bid requests is exactly where payload discipline matters: if you cannot trust reach, you need to know the request you priced was structurally the inventory class you thought you bought.
## Checklist for buyers still on open-web domain lists
Reconcile Comscore, Similarweb, or publisher-direct audience claims with your own log-level unique counts on site.domain before you reset reach targets. If uniques in your DSP are flat while third-party panels show a seventy-eight percent decline, you are either buying a different inventory mix than the brand site implies or counting devices, not people.
Split reporting by site.page path patterns: homepage and section fronts vs long-tail URLs often diverge when search traffic disappears.
Require source.schain.complete and validate seller IDs against ads.txt before you treat news domain buys as premium publisher direct. Syndicated paths can be authorized and still low reach.
Compare frequency caps to panel trends. Falling uniques with steady impression volume usually means heavier retargeting on a smaller pool.
Validate request shape on sampled bid streams: missing site.page , wrong site.domain formatting, or app objects on web lines are common data-quality defects that pollute domain reports.
Run those samples through a structural validator before you blame supply quality for performance drift. RTBlint's OpenRTB tester catches malformed site objects and incomplete chains; it is a cheap filter before you renegotiate CPMs on news domains whose measured audience no longer matches the plan.
## Sources
Talking Biz News: Examining the traffic drop at Business Insider (September 17, 2026; Comscore figures via Status reporting)
Status: Business Insider's Traffic Tumult (September 17, 2026)
RTBlint: sellers.json, ads.txt, and schain trust stack
---
# CTV pre-bid show targeting can splice a Content object from app.bundle alone while the exchange still forwards an empty content block. · RTBlint
URL: https://rtblint.org/blog/prebid-epg-splices-content-from-bundle-only/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## CTV pre-bid show targeting can splice a Content object from app.bundle alone while the exchange still forwards an empty content block.
September 21, 2026 · RTBlint
On September 21, a verification vendor published OpenEPG DB 1.0 with a pre-bid API for open programmatic CTV. The catalog maps 375,000+ raw bundle ID variations to 580,000+ TV shows across 13,900+ FAST and linear channels, covering 6,192 U.S. streaming apps on nine OS platforms. The API requires zero publisher opt-in. It parses OpenRTB 2.6 bid requests using two required inputs, app.bundle and device.ua , and returns the same request with program metadata spliced into app.content . That is a bidstream event, not a creative delivery event, and it changes what "missing content.title" means in production.
## Two copies of the same impression
A FAST aggregator can send a structurally valid CTV request where app.content is empty or thin. The seller is not lying about the app. The publisher simply does not pass show names in open exchange traffic, and the gap is widest on multi-channel FAST inventory where one bundle carries hundreds of channels. Buyers who hard-require content.title filter that traffic. Buyers who attach a pre-bid enrichment hop may receive a different JSON for the same impression milliseconds later.
The vendor describes the output as a native OpenRTB 2.6 Content object that can include content.title , content.series , content.genre , content.contentrating , and content.channel.id plus content.channel.name , with a statistical confidence score from 0.00 to 1.00 on each resolved response. Channel identifiers or channel names already on the request feed match confidence. None of that requires a publisher SDK.
RTBlint is independent and not affiliated with Pixalate or any exchange. The point is not which vendor ships the hop. The point is that show-level targeting on CTV can move entirely off the seller payload and onto inference from bundle, user agent, and optional channel signals. Your QA sample depends on which hop you capture.
## What the metric actually measures
Post-bid rankings and monthly indices measure spend and reach at show level after the fact. We already wrote about that population when the July OpenEPG Index mapped 532,000+ U.S. streaming shows from bundle IDs without publisher opt-in. This release is the pre-bid mirror: the same class of resolution, invoked before the bidder prices the impression, with explicit OpenRTB field output rather than a dashboard export.
The September 21 announcement states that show-level data for streaming TV usually comes from program schedules content owners submit to metadata providers, or from automatic content recognition. Neither appears in most open programmatic bid requests. Pre-bid enrichment is a third source: public EPG plus open-exchange signals, returned as spec fields the buyer already targets against.
Confidence scores matter for buyers. A genre filter applied at 0.95 confidence is not the same policy as one applied at 0.60. If your DSP stores only the enriched payload and drops the score, you cannot reconcile why two impressions with the same title string cleared different brand-safety rules. Split reporting: raw seller JSON, enriched JSON, and the score if the API exposes it.
## Mechanism on the wire
The vendor documents a three-step flow. Input is a standard OpenRTB 2.6 bid request with app.bundle and device.ua . Resolution matches those fields, plus any channel identifier or channel name on the request, against the EPG catalog in real time. Output is the same bid request with resolved program metadata in app.content . Integration overhead is listed as zero SDKs and zero lines of publisher code.
// Seller-origin request (common on FAST aggregators)
"app": {
"bundle": "com.example.fast",
"content": {}
},
"device": { "ua": "..." }
// After pre-bid enrichment hop (same auction, different JSON)
"app": {
"bundle": "com.example.fast",
"content": {
"title": "...",
"series": "...",
"genre": "...",
"contentrating": "...",
"channel": { "id": "...", "name": "..." }
}
}
A bidder that logs requests at ingress sees the empty block. A bidder that logs after enrichment sees titles. Both logs are true. Neither alone describes the supply path. If your blocklist keys on content.genre without checking whether enrichment ran, you can block inventory that would have been eligible post-hop, or buy inventory whose title was inferred rather than declared by the seller.
Bundle normalization is part of the story. The catalog maps 375,000+ raw bundle variations to parent apps. The same CTV app reaching you under three bundle strings through three paths is still three allowlist entries unless you normalize. Pre-bid EPG adds another normalization layer on top of bundle fraud mechanics reports already document for platform mimicry. Our bundle mimicry post and the live show-level spend post cover adjacent failure modes; this post is the pre-bid splice.
## Why FAST aggregators break content QA
Tubi, Samsung TV Plus, and The Roku Channel appear explicitly in the release as FAST channels the DB covers. One app bundle can represent hundreds of linear-style channels inside a single wrapper app. Sellers often send stable app.bundle with no per-channel content object because the ad server does not know which show is playing at bid time, or because metadata contracts never required open-exchange disclosure.
Pre-bid resolution is how buyers get genre and title without a publisher metadata deal. It is also how two buyers on the same exchange see different content quality on the same underlying supply: one integrated the API in private beta, one still reads raw logs. Private beta availability for DSPs, SSPs, and exchanges means the split is live in market structure even before it is visible in your spreadsheet of seller fill rates.
OpenRTB never marks whether content.title was publisher-declared or vendor-inferred. There is no content.provenance flag in 2.6. Governance teams that treat enriched titles as contractual representations from the seller are misreading the chain. Legal and ops need a label in the buyer stack, not in the spec.
## What to do
Log raw and enriched JSON separately. Store capture point (SSP edge, exchange, DSP pre-filter) on every sample. Comparing fill without that dimension confuses seller omission with buyer filter.
Keep confidence with the enriched fields. If you filter on inferred genre, persist the score that justified the match.
Do not treat post-bid indices as pre-bid coverage. Monthly show rankings describe measured spend populations. They do not prove your bidder received enriched content on every eligible request.
Normalize bundle IDs before EPG match. 375,000+ variation mappings exist because sellers send messy bundles. Your allowlist should not fight the same normalization the API applies.
Validate structural content anyway. Enrichment can populate content.genre while cattax is still wrong for content.cat . Inference does not fix enum drift on other fields.
RTBlint checks OpenRTB JSON for structural and consistency rules. It does not resolve EPG or infer shows. It will flag empty content on a CTV request, type mismatches on genre lists, and implausible device and app pairings. Paste the payload your bidder actually prices, not only the seller-origin copy.
Validate a bid request · CTV bid request reference
## Sources
Pixalate: OpenEPG DB 1.0 and Pre-Bid API launch (September 21, 2026)
Pixalate: July 2026 OpenEPG Index (August 27, 2026)
---
# Jounce puts ninety-eight percent of the bidstream in reach of directness validation. Blunt supply filters act like ads.txt was never crawlable. · RTBlint
URL: https://rtblint.org/blog/jounce-bidstream-directness-validation-ads-txt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## Jounce puts ninety-eight percent of the bidstream in reach of directness validation. Blunt supply filters act like ads.txt was never crawlable.
September 17, 2026 · RTBlint
IAB Tech Lab published "Rewriting ads.txt Won't Save You (But Reading It Might)" on September 17, 2026. The piece is a response to summer noise about replacing ads.txt with a fresh authorization file for agentic buying. Buried in the argument is a number buyers should treat as operational, not rhetorical: recent Jounce research, cited by Tech Lab, says ninety-eight percent of the bidstream enables independent validation of directness. That is not a maturity score for agents. It is a statement about how much traffic still arrives with enough public metadata for a buyer to reconcile who sold the impression without trusting the seller's slide deck.
## What the metric actually measures
"Independent validation of directness" is not the same as "every hop is direct." It means a demand-side platform can cross-check the seller chain on the bid request against files the publisher and each intermediary already publish: ads.txt or app-ads.txt on the inventory owner, sellers.json at each asi domain in source.schain , and the hop list itself. When those three align, a buyer can distinguish an authorized reseller from a path that never appeared in the publisher file. When they do not align, the buyer has a falsifiable reason to no-bid that does not depend on a proprietary fraud score.
Tech Lab's essay stresses dual verification: ads.txt alone certifies that a seller ID is listed; sellers.json explains what that ID means at the exchange or SSP; source.schain is the audit trail on this specific request. Remove any leg and demand-side platforms lose their most practical tool for blocking unauthorized sellers, which is why the author argues agent-only authorization proposals that skip counterparty files re-open a verification gap the industry spent years closing. The ninety-eight percent figure describes reach: how often those files exist in the wild enough to run the check, not how often buyers bother to run it.
That distinction matters for supply path optimization. SPO dashboards love hop counts and fee tables because they compress well in a quarterly business review. Reading ads.txt per publisher domain, matching sid values to sellers.json entries, and comparing the result to the live schain is slower work. Tech Lab literally drafts the agent prompt buyers could run instead of inventing a parallel standard: upload a site list, crawl ads.txt and sellers.json, export the shortest authorized seller IDs for deal creation. The pre-work is crawling; the alternative pre-work is negotiating a new file format nobody's DSP validates yet. Ninety-eight percent reach says the crawl target is already there for almost all requests.
## Why the bid request still fails anyway
Validation reach and validation execution diverge at the edge. OpenRTB carries source.schain , but exchanges vary on whether complete is honest, whether redundant nodes appear after a forwarder concatenates upstream chains, and whether asi is a bare registrable domain or a string that breaks sellers.json lookup. Buyers answer with blunt rules: drop anything with more than N hops, drop anything without complete: 1 , drop entire SSPs after a bad week. Those rules reduce unauthorized spend, but they also discard paths that would verify cleanly if someone read the publisher file.
The no-bid reason code table separates parse failures from policy choices. nbr 16 , Incomplete SupplyChain, is demand that wanted the impression but could not establish authorization from the payload. That is different from nbr 2 , Invalid Request, where the JSON failed the bidder's validator before economics ran. Teams that never see nbr back from the exchange cannot tell incomplete schain from low bid density, so they tune SPO on hop count alone and call it hygiene.
"source": {
"ext": {
"schain": {
"complete": 1,
"ver": "1.0",
"nodes": [
{ "asi": "exchange.example", "sid": "pub123", "hp": 1 },
{ "asi": "ssp.example", "sid": "seat456", "hp": 1 }
]
}
}
}
Buyer check (offline):
1. Fetch publisher ads.txt → is exchange.example pub123 listed?
2. Fetch exchange.example/sellers.json → does pub123 exist?
3. Repeat for ssp.example / seat456 if reselling
4. Compare hop order to the nodes array
If step 1 fails, the path is unauthorized regardless of CPM.
Tech Lab's comparison table rebuttal in the same article is useful context for field-level arguments: OWNERDOMAIN names the inventory owner, INVENTORYPARTNERDOMAIN extends CTV rights cases ads.txt 1.1 already tried to cover, and DIRECT versus RESELLER plus sellers.json relationship types already encode much of what newer agent authorization charts claim is missing. When an LLM-generated spec chart says ads.txt cannot describe the property, the counterpoint is literally that the file lives at domain.com/ads.txt and must correspond to site.domain or app.bundle on the request. Misinformation is not a reason to rewrite the file; it is a reason to ground automation in the current spec text.
## Agentic buying without dropping the crawl
Agentic workflows change who reads the rules, not whether the rules exist. Tech Lab argues agents can apply nuanced decisioning humans skip because ads.txt lines are boring and sellers.json relationship enums are intimidating. That is compatible with keeping adagents-style files as an additional declaration if buyers still reconcile agents against the seller IDs in ads.txt. It is not compatible with treating agent permission as a substitute for counterparty verification: an agent authorized in a well-known JSON file but absent from schain still produces a bid request that looks like ordinary OpenRTB.
We already wrote about the split between adagents.json and schain on this site. The September Tech Lab essay adds the industry-scale framing: roughly one thousand implementers have already voted with their feet on how much granularity belongs in authorization files versus OpenRTB extensions like GPID, and blunt buyer strategies were part of that consensus. Agents do not magically fix bluntness unless they are trained on the same crawls SPO engineers avoided. Grounding an agent in ads.txt, sellers.json, and SupplyChain validation is the difference between automating nuance and automating a hop-count cap.
Supply Chain Validation 1.1 public comment, linked from the essay, is the forward path for custody nodes and completeness semantics, not a greenfield replacement for publisher authorization. Buyers planning 2026 integrations should watch that repo for changes to what complete means, then update validators accordingly. RTBlint tracks spec shape on the payload you paste; it does not crawl ads.txt or certify that a seller ID is listed. The crawl remains your side of the contract.
## What to do on the buy side
Treat the ninety-eight percent figure as coverage for crawls, not as proof your campaigns use it. Sample live schain objects against the publisher ads.txt for your top domains weekly.
Split no-bid reporting by nbr where the exchange exposes it. A spike in 16 is a supply-chain data problem; a spike in 2 is a validator or field drift problem.
Before you cap hops globally, check whether a shorter authorized path exists in ads.txt for the same inventory. Tech Lab's suggested agent workflow is the same work as a scripted SPO pass.
For CTV, read INVENTORYPARTNERDOMAIN and MANAGERDOMAIN lines instead of assuming web-style OWNERDOMAIN covers platform rights. Tech Lab acknowledges CTV media rights need more illustration; the fields are already there for parsers that look.
Validate OpenRTB schain shape at ingress so incomplete chains fail fast with a clear JSON path. Paste suspicious requests into rtblint.org/validate/ to separate malformed nodes from authorized paths your policy never read.
Independent of IAB Tech Lab and Jounce. RTBlint checks payload consistency; it does not detect fraud, bots, or unauthorized sellers by itself.
## Sources
IAB Tech Lab: Rewriting ads.txt Won't Save You (But Reading It Might) (September 17, 2026)
Jounce Media (cited in the IAB Tech Lab article for the ninety-eight percent bidstream directness validation figure)
IAB Tech Lab: Supply Chain Validation repository
RTBlint: sellers.json, ads.txt, and schain trust stack
---
# Half a billion AI slop impressions in H1 2026 can still arrive as clean OpenRTB requests, because nothing on the bid labels generated junk. · RTBlint
URL: https://rtblint.org/blog/ai-slop-impressions-openrtb-cat-blind-spot/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## Half a billion AI slop impressions in H1 2026 can still arrive as clean OpenRTB requests, because nothing on the bid labels generated junk.
September 14, 2026 · RTBlint
Trade coverage on September 14 reported that verification technology detected more than half a billion impressions of low-quality AI-generated content, what the industry is calling AI slop, during the first half of 2026. The figure is large enough to headline. The footnote underneath it is what matters for programmatic buyers: the count includes impressions blocked before an ad served and impressions measured after an ad already appeared. Those are not the same population, and neither one is labeled on the OpenRTB request that cleared the exchange.
## The denominator mixes defense with exposure
When a verification vendor publishes a single integer for AI slop, read the sentence after the number first. The September 14 reports say the half-billion figure includes slop impressions identified through the vendor's technology, as well as whether they were blocked from serving an ad or measured after an ad appeared. Blocked inventory never reached your DSP. Measured-after inventory did, and only shows up in a post-bid or log-level data feed if you bought that layer.
A buyer who turned on pre-bid avoidance in Q1 can honestly say slop exposure fell on defended lines while the industry total still climbed. That is not a contradiction. It is two budgets looking at two slices of the same supply pool. Unprotected programmatic spend is still the monetization engine the report describes: low-quality AI content can be produced quickly and cheaply, creating an incentive to generate content at scale and monetise the resulting traffic through advertising.
The same release notes a coordinated network of more than 200 AI slop domains where operators left the AI prompts used to create the network in the sites' code. That detail is useful because it confirms the supply is programmatic in practice: hundreds of interchangeable domains, not one bad URL you can add to a static blocklist and forget. RTBlint is independent and not affiliated with DoubleVerify or any verification vendor.
## Categories on the page are not categories on the bid
The data also shows how varied AI slop has become. In EMEA, travel was the number one content category for AI slop, with significant volume across sports, technology and computing, violence, and vehicle disasters. A travel buyer who reads that list may assume their travel segment is safe because they excluded violence. Programmatic targeting does not work that way. The slop page can carry an IAB content taxonomy code that reads like travel while the article body is generated filler about destinations nobody verified.
OpenRTB carries category signals on site.cat , app.cat , and inside the content object as content.cat with a cattax pointer. Sellers populate those fields from their CMS, their SSAI classifier, or a best guess. Buyers filter on them. Nothing in the bid request asserts human editorial review, model provenance, or image authenticity. A made-for-advertising domain and a legitimate travel publisher can both emit content.cat values that parse cleanly and mean different things in the real world.
That gap is the same structural blind spot MFA inventory has exploited for years. Our MFA definition notes that nothing in OpenRTB marks a request as made for advertising, and MFA inventory usually passes ads.txt, sellers.json, and payload validation cleanly. AI slop is MFA with a generative production line attached. The bid still looks like a page view on a domain with a category array and a valid seller chain.
## What the request looks like when slop monetizes
Here is a simplified site request for a display imp on one of those interchangeable slop domains. Every field below can validate against OpenRTB 2.x and AdCOM enums while the page is still low-quality generated text with auto-refreshing slots. The buyer sees travel taxonomy codes because that is what the seller sent, not because a human travel editor approved the article.
{
"id": "req-slop-travel-001",
"site": {
"domain": "ai-travel-digest.example",
"page": "https://ai-travel-digest.example/budget-trips-paris",
"cat": ["IAB20"],
"publisher": { "id": "pub-8842", "name": "Travel Network LLC" }
},
"source": {
"fd": 1,
"tid": "tid-slop-001",
"schain": {
"complete": 1,
"nodes": [
{ "asi": "reseller.example", "sid": "8842", "hp": 1 },
{ "asi": "exchange.example", "sid": "441", "hp": 1 }
]
}
},
"imp": [{
"id": "1",
"banner": { "w": 300, "h": 250, "pos": 0 },
"bidfloor": 0.08,
"ext": { "refresh": 30 }
}]
}
A linter checking required objects, ID formats, and schain completeness returns green. A buyer applying a travel inclusion list on site.cat or content.cat may bid. A buyer relying on domain reputation alone may bid if the domain is new enough not to be on last month's blocklist yet. The impression only becomes slop in post-bid classification or in a verification log, after money moved. That timing mismatch is why the half-billion number can rise while your pre-bid dashboard looks calm.
## UK brand risk is a supply-path problem too
The release highlights UK consumer sensitivity. Nearly half, 48 percent, of UK consumers say seeing a brand advertised alongside low-quality AI-generated content would negatively impact their perception of that brand, including 30 percent who say it would have a very negative impact. Brand teams will read that as a creative adjacency issue. For programmatic operators it is also a path issue: the adjacency is chosen by the auction, not by a human trafficker, unless you enforce inventory rules upstream of the bid.
Quotes in the coverage argue that identifying and avoiding individual pieces of content is not enough because new sources emerge daily. That maps directly to bidstream architecture. Piece-level post-hoc reporting helps finance reconcile spend. It does not stop the next domain in the 200-site network from sending tomorrow's request with a fresh site.domain and the same publisher.id pattern. Domain lists decay. Category allowlists inherit whatever the seller asserted. Fresh slop domains rotate faster than quarterly list updates unless you automate ingestion from verification feeds or build performance-based exclusion on log-level outcomes.
Preventing ads from appearing alongside slop, as the release puts it, reduces the financial incentive to produce more of it. That only works when enough spend is actually blocked or bid-adjusted pre-auction. Measured-after impressions in the same headline total did contribute to the economics until someone turned the filter on.
## Where buyers can still see the request
OpenRTB will not add an ai_generated: true flag tomorrow. Practical filters stay where they already live for MFA and IVT: vendor segments attached in imp.ext or bid request extensions, deal IDs that require a declared quality segment, domain and app bundle blocklists maintained from log-level data, and bcat / category exclusions that match how your team maps IAB codes to verticals. Refresh intervals on display imps remain a tell: auto-refreshing slots show up in imp.ext.refresh on some exchanges and never appear on others, which is its own consistency problem when you compare supply paths.
For sellers, inconsistent content.cat versus on-page topic is a long-term trust problem. Mislabeled travel inventory trains buyers to distrust your taxonomy, which hurts legitimate packages. Sending both deprecated and current video fields is already a documented CTV failure mode; sending confident category codes on generated pages is the display equivalent. Validation catches malformed IDs, not editorial truth.
If you receive BidResponse.nbr codes from partners, none of them currently encode slop. You will see nbr 2 for malformed requests and inventory filtered for business reasons you configured off-request. Slop remains invisible at auction time unless you imported an external segment. Our no-bid reason guide covers what you can diagnose from nbr ; slop is not on that list yet.
## Checklist before you trust a category target
Split verification metrics into blocked pre-bid versus measured post-bid before you compare quarters or regions.
Do not treat site.cat or content.cat as ground truth for editorial quality. Treat them as seller assertions you corroborate with log-level outcomes and domain history.
Refresh domain and bundle blocklists from verification feeds faster than the slop networks rotate domains. A 200-domain network is a template, not a finite set.
Watch imp.ext.refresh and ad density proxies where your exchanges expose them. High refresh plus paid traffic acquisition patterns overlap MFA and slop economics.
Validate OpenRTB shape on ingress so you separate parse failures from business filters. A malformed schain and a clean request on a slop domain are different fixes. RTBlint checks payload consistency; it does not detect AI-generated text or bots.
Inspect a live bid request on rtblint.org/validate/ when you are debugging field drift, schain completeness, or category arrays that look plausible in JSON and wrong in the placement report.
## Sources
Advanced Television: Data: AI slop hits 500m+ impressions in H1 2026 (September 14, 2026)
ExchangeWire: DoubleVerify Data: AI Slop Hits 500M+ Impressions in First Half of 2026 (September 14, 2026)
RTBlint: What are MFA (made for advertising) sites?
---
# Console-native FAST sells authenticated gaming identity. The OpenRTB request still reads like generic CTV unless the path declares it. · RTBlint
URL: https://rtblint.org/blog/ps5-fast-authenticated-identity-bidstream-gap/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## Console-native FAST sells authenticated gaming identity. The OpenRTB request still reads like generic CTV unless the path declares it.
September 11, 2026 · RTBlint
On August 31, Sony Pictures Television launched Live TV on PS5 in the United States: more than 100 free, ad-supported channels reachable from the console Media tab without a separate app download. TechTimes reported the ad stack as Publica for server-side insertion and PubMatic for programmatic supply. That is a familiar FAST headline until you notice what sits underneath every impression: a mandatory PlayStation Network sign-in that already tracks games played, purchases, and session time. The auction still clears through the same OpenRTB pipes as household FAST on a stick. The identity layer underneath is not the same, and nothing in a default CTV bid request tells you which one you bought.
## Two FAST surfaces on one console, two identity models
FAST is growing quickly. TechTimes cited the sector at $12.28 billion in 2025 rising to $14.88 billion in 2026, a 21.2% annual rate. Most of that inventory still arrives in programmatic systems as connected TV: large screen, video placement, app bundle, device identifier. That description is accurate for a Roku stick or a Samsung TV Plus session where the platform knows a household IP and viewing history at the device level.
Live TV on PS5 is structurally different. Every console requires a PlayStation Network account. Opening the service links that account to a Sony Pictures CORE profile. Behavioral signals Sony already collects as platform operation, which games were played, what was purchased, how long sessions ran, can flow into ad delivery when a user watches the NFL Channel or a Crunchyroll exclusive. TechTimes contrasted that with third-party FAST apps installed on the same hardware: those apps can read device-level identifiers, not the authenticated PlayStation Network behavioral profile tied to the signed-in individual.
Sony's own launch materials describe the advertising environment as premium and integrated directly into the console experience, with Publica and PubMatic named as core ad technology partners. PubMatic is the programmatic marketplace layer. Publica handles SSAI on Sony's side before the stream reaches the player. For a buyer, that means the impression may be stitched server-side and sold through RTB, but the seller story is not generic living-room CTV. It is authenticated console inventory with first-party gaming context. The bid request your bidder receives may not say that explicitly.
## What the scale numbers actually measure
TechTimes reported PlayStation Network at 125 million monthly active users as of March 2026, with a peak of 132 million in December 2025. Fewer than 50 million of those users pay for PlayStation Plus, leaving roughly 75 million active accounts generating limited direct subscription revenue. Live TV on PS5 is framed as a way to monetize that installed base through advertising rather than through another upsell.
Those figures are platform population counts, not programmatic fill rates or reachable bidstream volume. They tell you how large the authenticated denominator could be in the United States at launch, not how many impressions PubMatic will expose per day or what share will clear in open exchange versus private marketplace deals. A buyer who hears "125 million users" and maps that directly to reachable CTV reach is making a category error: MAU is account inventory, not ad-request inventory.
The same article noted that Tubi, the largest pure-play FAST service, saw only 5% of its viewership on live linear channels in early 2025, with most consumption on demand. Sony's launch bundles substantial on-demand programming alongside live channels. For supply-path planning, that split matters: live SSAI pods and on-demand ad breaks may traverse different insertion paths and may surface different OpenRTB objects even when the brand label is the same Live TV product. Treating the service as one homogeneous CTV app in your taxonomy hides that operational split.
## Why devicetype=3 is not the argument
Console FAST still presents as connected TV in most trafficking workflows. The screen is a television. The player is native to the OS. Buyers who filter on device.devicetype: 3 will include this inventory, and that filter is not wrong on surface class grounds. The disagreement is about what identity rides along with the request, not whether the device enum says TV.
Household FAST platforms infer audience from IP, device graph, and viewing patterns at the device or household level. Authenticated console FAST can attach individual-level gaming and commerce behavior to the same session because the user signed in before the first channel tuned. TechTimes quoted Sony executives describing a gaming-heavy audience that is "not likely showing up in other connected TV environments often." Whether you accept that positioning or not, the buy-side question is operational: does the bid request declare authenticated first-party enrichment, or does it look like any other CTV app bundle with an IFA?
Privacy settings add another layer buyers must not confuse with absence of data. TechTimes reported that users can disable "Personalized Advertising" under Settings > Users and Accounts > Privacy, which limits use of individual PlayStation Network profile data for targeting while ads still serve. A request that arrives without enriched segments may reflect user choice, not a clean device-class signal. Pricing and measurement models that assume gaming-intent targeting on every impression will drift when opt-out rates climb.
// Third-party FAST app on PS5 (device-level path)
"device": { "devicetype": 3, "ifa": "…", "ip": "…" },
"app": { "bundle": "com.pluto…", "name": "Pluto TV" }
// Seller sees device/session; no platform gaming profile in-band
// Console-native FAST (authenticated path — illustrative)
"device": { "devicetype": 3, "ifa": "…", "ip": "…" },
"app": { "bundle": "…", "name": "Live TV on PS5" },
"user": {
"ext": {
"eids": [ /* first-party or partner IDs when declared */ ]
}
}
// Same devicetype; different addressability contract if eids populate
The illustrative block is not a guaranteed wire format from PubMatic or Publica. It shows the inspection problem. Two requests can pass the same CTV lint rules, share devicetype: 3 , and still differ on whether user.ext.eids , publisher first-party segments, or supply-chain metadata document authenticated enrichment. Buyers who only QA device class and video placement will not catch that gap until reach or frequency reports disagree with the brief.
## Who can observe what across the hops
Sony operates the authenticated session and the content bundle. Publica performs SSAI before playback. PubMatic connects inventory to programmatic demand. Each hop can see a different slice of identity depending on contract, privacy setting, and what the SSP forwards. The exchange normalizes the object. The DSP applies filters and bid models. Neither side automatically knows that the impression originated from a mandatory sign-in flow unless fields or deal metadata say so.
Supply-chain completeness matters here for a different reason than fraud. A buyer authorized to purchase Sony first-party segments needs to see consistent schain and seller declarations that match the integration they contracted for. Incomplete chains ( schain.complete != 1 ) produce no-bids that look like thin demand when the real issue is authorization metadata. That pattern is familiar on open CTV; console-native inventory does not exempt it.
Compare with the device-class split documented in our open programmatic CTV spend map post: open exchange CTV money divides across TV OS and mobile app bundles while campaigns still traffic one label. Console-native authenticated FAST adds a perpendicular split on the same hardware: native service versus sideloaded FAST apps. Both can clear as CTV in the bidder UI. Only one carries platform account behavior into the ad decision unless your filters distinguish them.
## What to check before you reclassify the line item
Separate native console FAST from sideloaded FAST in deal taxonomy. Bundle and app name should identify Live TV on PS5 (or future console-native FAST) as distinct from third-party FAST apps on the same device class.
Inspect whether authenticated enrichment is declared in-band. Look for populated user.ext.eids , publisher first-party segment fields, or PMP metadata that documents account-level targeting versus device-only delivery. Absence is not proof the seller lacks data; it is proof your bidder cannot see it.
Map privacy opt-out to expected segment density. Personalized advertising toggles on console settings change what can be used for targeting while ads still serve. Do not benchmark gaming-intent performance without knowing opt-out prevalence on the supply you bought.
Split live linear SSAI from on-demand breaks in sampling. Channel guides and library titles may not share identical insertion or request shapes. Validate samples from both paths if your deal covers the full product.
Read nbr before widening CTV filters. Unsupported device and incomplete supply chain codes often trace to metadata mismatches, not missing demand. See the no-bid reason code guide .
Paste live requests into the bid request tester. Confirm devicetype , app.bundle , video placement, and identity extensions match the contract you think you are buying in the OpenRTB tester .
## The honest limit
We do not have impression-level OpenRTB samples from PubMatic's Live TV on PS5 integration in this post. TechTimes and Sony's launch materials establish the ad-tech partners, the authenticated account requirement, and the contrast with third-party FAST apps on the same console. We are not going to invent fill rates, CPMs, or segment penetration percentages.
What is defensible is narrower. Console-native FAST can sell authenticated first-party identity while clearing through the same programmatic CTV pipes buyers already use. Standard device-class filters cannot tell native authenticated inventory from sideloaded device-level FAST on the same hardware. Until deal metadata and request fields declare that difference, buyers will mix reach models, frequency caps, and incrementality readouts that assume the wrong identity layer. That mismatch shows up in the request before anyone prices it.
## Sources
RTBlint is independent and not affiliated with Sony, Integral Ad Science, PubMatic, or IAB. Figures below come from TechTimes reporting and Sony launch materials unless noted.
TechTimes: Live TV on PS5 launch, Publica and PubMatic ad stack, PlayStation Network identity contrast with third-party FAST apps, PSN MAU figures, FAST market size, Tubi live versus on-demand viewership, privacy settings
Sony Pictures Television press release, August 31, 2026: 100+ channels, Publica and PubMatic as core ad technology partners
PlayStation Blog: launch details, PlayStation Network sign-in flow, channel lineup
RTBlint: OpenRTB enumerated values (device.devicetype definitions)
---
# 57 ad SDKs ship precise location into ad requests without manifest disclosure. OpenRTB device.geo inherits that gap. · RTBlint
URL: https://rtblint.org/blog/sdk-precise-location-bidstream-disclosure-gap/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## 57 ad SDKs ship precise location into ad requests without manifest disclosure. OpenRTB device.geo inherits that gap.
September 9, 2026 · RTBlint
Mobile programmatic buyers treat device.geo as a field the exchange or SSP assembled from IP, registration, or an explicit consent signal. That mental model breaks the moment you remember where the bid request is born: inside an app, on a device, often inside an ad SDK that packaged the auction payload before any intermediary saw it. A September 2026 source-code audit of 698 ad and data-broker SDKs reports that 57 contain code transmitting precise geolocation without declaring that collection in their bundled privacy manifest, impacting up to 88,787 apps from 25,564 developers, and that more than 60 SDKs are built to broadcast precise location directly into the advertising bidstream without detected disclosure in policy or manifest files.
## The store label is not in the bid request
Apple and Google both hold app developers responsible for the SDKs they integrate. Apple expects privacy nutrition labels assembled from each SDK's self-declared privacy manifest; Google points developers to its public SDK Index for data-safety guidance when filling out Play Store labels. Neither store verifies accuracy. Google's own data safety documentation states review is not designed to verify completeness of developer declarations, and Apple's labels carry an explicit disclaimer that Apple has not verified the information.
None of that metadata travels in OpenRTB. What travels is whatever the SDK and its mediation stack put in the JSON: app.bundle , device.ifa , device.geo.lat , device.geo.lon , and the rest. A buyer filtering on bundle allowlists or MRC invalid-traffic signals is downstream of SDK behavior they cannot see from the request alone. Independent academic work on 158 widely used Android SDKs found more than 30 percent publish no privacy policy at all, and among those that do, 37 percent collect more data than disclosed (Meng et al., 2024). The new audit scales that observation across 698 ad-facing SDKs and names a specific failure mode: precise location leaving the device in network-bound ad payloads.
The regulatory frame is not hypothetical. The FTC has pursued enforcement across the SDK-to-bidstream location pipeline against SDK operators and downstream brokers, alleging disclosure gaps and harvesting from real-time ad auctions as unfair practices. The audit separates two risk dimensions: App Store terms-of-service risk when code behavior diverges from the SDK's bundled manifest (57 SDKs, up to 88,787 apps), and FTC Section 5 risk when code diverges from the public privacy policy or no policy exists (33 SDKs combining undisclosed transmission and absent policies, up to 10,613 apps from 4,873 developers). Those are publisher-side liability buckets. For buyers, the same divergence means coordinates in the auction may not match any consent story the app displayed at install time.
## What the audit actually measured
The index is built from three layers per SDK: static code analysis (does the SDK read location APIs or accept location through its own surface and package it into ad requests or event uploads), manifest inspection (does PrivacyInfo.xcprivacy or AndroidManifest.xml declare precise location collection), and privacy policy review (does a policy exist and does it disclose location). SDKs that collect flexible location, meaning precise when available and coarse otherwise, are counted as precise collectors for the rating.
The headline population is 698 ad SDKs and data brokers, not 698 apps. App impact numbers are estimates of how many published apps integrate flagged SDK versions. The 600+ billion download figure in the release subhead is cumulative reach across that app set, not a quarterly bidstream volume. Treat app counts as exposure estimates, not auction counts.
Ratings reflect the auditor's opinion from automated analysis as of May 2026 policy snapshots and May 21, 2026 code review; they are not legal determinations. That caveat matters for buyers too: you are not getting a compliance certificate in the bid, you are getting coordinates that may have been assembled by code the publisher never independently verified against manifest or policy.
## Where precise location enters the auction
On mobile and in-app video, the first programmatic hop is usually an SDK ad request to a mediation layer or exchange endpoint. Location can arrive three ways buyers later see as indistinguishable in logs: the SDK reads GPS or fused location and writes device.geo , the host app passes coordinates into the SDK API surface and the SDK forwards them, or a downstream enricher infers geo from IP after the SDK fires the request. The audit focuses on the first two: code paths that package precise location into ad-bound payloads without disclosure.
OpenRTB does not include a field for SDK manifest accuracy or privacy policy URL validation at bid time. A syntactically valid request from a real Android phone can include high-precision coordinates whether or not the Play Store data safety form mentioned location. Buyers who block lat/lon below a precision threshold reduce exposure but do not learn which SDK sourced the signal or whether the publisher's label claimed collection.
{
"id": "req-9f2a",
"app": {
"bundle": "com.example.weather.free",
"name": "Example Weather",
"storeurl": "https://play.google.com/store/apps/details?id=com.example.weather.free"
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14; …)",
"devicetype": 4,
"ifa": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"geo": {
"lat": 37.7749,
"lon": -122.4194,
"type": 1,
"accuracy": 5
}
},
"imp": [{ "id": "1", "banner": { "w": 320, "h": 50 } }]
}
Nothing in that skeleton proves undisclosed collection. Everything looks like a normal in-app banner call from a weather utility. If the integrating ad SDK transmits precise location without declaring it in manifest or policy, the buyer's geo bid modifier, frequency cap, and consent audit trail inherit the gap. SSPs that operate their own ad SDKs face a compounded version of the same problem: a critical SDK rating is also a statement about supply the exchange may be sourcing from its own embedded code paths.
Google's public SDK Index shows Android permissions an SDK requests but, as independent researchers note, does not close the loop on which data categories are actually collected or whether declarations match behavior (Khandelwal et al., USENIX Security 2024). Relying on permission lists or self-attested checkmarks at integration time does not substitute for code-level verification before the SDK ever joins the mediation waterfall that produces your bidstream rows.
## What buyers and sellers can do
Exchange-side validation cannot fix upstream SDK omission. These checks reduce how often undisclosed signals become priced impressions without pretending to detect fraud intent.
Strip or coarse-grain device.geo on mobile app traffic unless a documented consent path ties the impression to declared collection; log when precision exceeds your policy threshold.
Segment reporting by app.bundle and seller, not only campaign line, so geo anomalies trace back to integrating apps when post-auction review flags a cluster.
Require publishers to maintain an SDK inventory with manifest snapshots and policy URLs for each ad SDK in the waterfall; refresh when SDK versions change.
Treat first-party SDK requests differently from resold SDK traffic in supply path review; an SSP-owned SDK with undisclosed location code is both a compliance risk and a supply quality signal.
When investigating a bundle, paste raw requests into RTBlint validate to confirm OpenRTB shape, required app and device fields, and inconsistencies between declared device type and geo precision before you adjust blocklists or deal floors.
Field validation catches malformed IDs and impossible device blocks. It does not read SDK bytecode. The honest workflow pairs bid-request lint with publisher SDK due diligence, not one or the other.
## The honest limit
Not every high-precision device.geo is misconduct. Many apps legitimately disclose location and use it for weather, maps, or local offers. The argument is narrower: when self-attestation is the only gate, undisclosed SDK behavior scales across tens of thousands of apps and shows up in the same OpenRTB fields your bidder already trusts.
CTV and SSAI paths have different location stories; this audit is mobile SDK source code, not living-room IP-only defaults. The bidstream lesson still generalizes: the request is assembled below the exchange, and labels visible in app stores do not ride along to help you reconcile what you bought.
## Sources
Field names refer to OpenRTB as published by IAB Tech Lab. SDK counts and app exposure figures come from the September 9, 2026 audit release cited below. RTBlint is independent and not affiliated with the auditor, Apple, Google, the FTC, or IAB Tech Lab.
Pixalate: Q2 2026 Ad SDK Trust Index 1.0 release, September 9, 2026 (primary; 698 SDKs, 57 manifest gaps, 33 FTC-risk SDKs, bidstream location claim)
Meng et al., 2024: Android SDK privacy policy vs collection behavior (cited in primary)
Khandelwal et al., USENIX Security 2024: limits of Google SDK Index (cited in primary)
IAB Tech Lab: OpenRTB
Google Play: Data safety guidance for developers
---
# A 25 percent lead rate at half the CPA is not a supply win. It is an optimization signal fraudsters can manufacture. · RTBlint
URL: https://rtblint.org/blog/conversion-event-fraud-optimization-feedback-loop/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## A 25 percent lead rate at half the CPA is not a supply win. It is an optimization signal fraudsters can manufacture.
September 7, 2026 · RTBlint
Performance marketers are trained to celebrate a falling cost per lead. An investigation published on Bizcommunity on August 26 describes a pet-insurance campaign where one cluster of third-party mobile app placements produced roughly 70 percent of lead volume at a fraction of the cost of Facebook feed inventory, with reported form completion rates between 15 percent and 25 percent. The dashboard called it an optimization breakthrough. Call-centre agents calling those leads heard something else: consumers who had never requested pet insurance, or who did not own a pet at all. A significant share of the questionable leads arrived between 11pm and 6am, when the Android phones that generated them were likely idle on bedside tables.
## The conversion event is not the customer
Most programmatic stacks end measurement when the platform records a success event. For a lead campaign, that event is usually a completed form: contact fields populated, questions answered, a pixel or postback fired. The media report closes. Finance sees a cheap acquisition. The optimization engine receives a positive label and searches for more inventory that can reproduce the same event at lower cost.
Commercial reality starts later. Did the person answer the phone? Did they confirm the enquiry? Did they qualify, pay, or renew? Those downstream facts live in CRM, dialler, and billing systems the ad platform never reads unless you wire them back in. When they disagree with the frontend conversion, you are not looking at a targeting miss. You are looking at conversion-event fraud: technology that produces the event the buyer defined as success without the human intent that event was supposed to represent.
The investigation traced part of the pattern to a utility app whose stated purpose was spam-call protection. Evidence suggested ads could load in the background, interactions could be generated, and information already held by the app could populate marketer forms while the user was not consciously engaging with an advertisement. The consumer denied making the enquiry. The platform had already logged a conversion and treated it as training data.
## Real devices, real bid requests, fabricated outcomes
Pre-bid invalid-traffic filters often ask a narrow question: does this request look like a bot farm or a datacenter? A genuine Android handset with a valid IFA, a plausible IP, and an installed app that remains connected for hours answers yes to the device question while still producing traffic unrelated to attention or purchase intent. Dr Augustine Fou's work through FouAnalytics has made that distinction for years: the phone can be real, the utility app can be real, the network request can be technically valid, yet the advertising activity may have no relationship to a person choosing to act.
Documented fraud operations show what that looks like at bid-request scale. Human Security's September 2025 disclosure of SlopAds described 224 Android applications downloaded more than 38 million times across 228 countries and territories, using hidden WebViews to navigate threat-actor sites and generate fraudulent impressions and clicks. At peak, Human recorded 2.3 billion fraudulent bid requests per day. In 2026, Human's Trapdoor operation involved 455 malicious applications with more than 24 million downloads; many first-stage apps presented as ordinary utilities such as PDF readers and device cleaners, with peak volume of 659 million bid requests per day attributed to the operation.
Pareto, another Human disclosure cited in the same investigation, infected nearly one million Android phones that pretended to be consumers watching advertising on connected televisions, generating an average of 650 million bid requests per day while spoofing more than 6,000 CTV apps. One involved application was a flashlight utility advertised as ad-free; analysis found code generating fraudulent advertising activity without visible ads to users. The bidstream sees app identity and device class. It does not see whether a hidden browser is open behind the UI.
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"imp": [{ "id": "1", "banner": { "w": 320, "h": 50 } }],
"app": {
"bundle": "com.example.utility.spamshield",
"name": "Spam Shield",
"storeurl": "https://play.google.com/store/apps/details?id=com.example.utility.spamshield"
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14; ...)",
"ifa": "38400000-8cf0-11bd-b23e-10b96e40000d",
"os": "Android",
"devicetype": 4
}
}
Nothing in that skeleton flags fraud by syntax alone. app.bundle resolves to a store listing. device.ifa is present. devicetype may read as phone or tablet. Buyers who block only anonymous traffic or datacenter IPs will still bid. The failure arrives later, when the same environment also manufactures the post-click event the buyer sends back as a positive optimization label.
## Why optimization amplifies the fraud
Click flooding and click spam are old names for a related pattern: background apps fabricating clicks so an fraudulent source steals attribution or wastes spend. AppsFlyer and Adjust both document utility tools that invisibly load and click ads, producing convincing device and campaign metadata without user interaction. Conversion-event fraud raises the stakes because it does not stop at stealing credit for someone else's sale. It teaches the platform where to spend next.
Modern buying systems optimize toward whichever event the advertiser declares. If that event is a completed lead form, the engine searches for placements that produce more completed forms at lower cost. Unless higher-quality downstream outcomes are returned, a fabricated form and a genuine enquiry look identical in the training signal. A placement reporting 15 percent to 25 percent lead rates at unusually low cost does not merely flatter a dashboard; it can pull budget toward the source that manufactured the events.
That is Goodhart's law in operational form. Once the proxy becomes the target, participants learn to produce the proxy. The marketer believes they are buying demand. The system may be buying the appearance of demand. Fraud creates its own feedback loop: manufacture the conversion, receive a success label, receive more spend, repeat until a human outside the platform notices that CRM callbacks contradict the media report.
Google Play's ad-fraud policy is explicit that apps must not render ads invisible to users, auto-generate clicks without user intention, or display advertising when the user is not actively in the app. The offence is misrepresenting user interest. Digital advertising depends on that assumption at every layer: an impression is an opportunity to see something, a click reflects interaction, a lead form means someone asked to continue the conversation. Divorce those signals from intent and the auction still clears while the measurement stack reports fiction.
## What disagreement between systems actually looks like
There was no single dashboard alert in the pet-insurance case described above. Media metrics said the campaign was efficient. Form data looked plausible. Cost per lead was attractive. The contradiction lived in call-centre conversations: people who did not recognize the product, who denied submitting details, who were probably asleep when the record claimed they converted.
That pattern generalizes beyond one vertical. Lead-generation fraud schemes documented by partners such as impact.com include publishers obtaining genuine personal information and automatically populating advertiser forms, so automated activity resembles legitimate lead gen with real identities attached to fake acquisition events. Identity can be authentic while the event is not. Pre-bid filters focused on synthetic IDs miss that entirely.
SlopAds also illustrates conditional behaviour: Human found fraudulent activity activated only for certain installs tied to the threat actor's acquisition path. Static app review or a one-time store inspection can show a benign build while a different entry path loads the hidden WebView stack. Supply-path diligence on ads.txt and sellers.json does not reach inside the APK behaviour that fires after install.
## What to check before you scale the placement
Treat an unusually cheap cost per lead as a hypothesis, not proof of skill. Compare frontend conversion timestamps to business hours and to dialler contact rates. Split performance by app.bundle and by seller, not only by campaign line item in the DSP UI. If downstream systems cannot be reconciled to the platform event, stop sending the platform a blind success signal for that inventory.
Require post-conversion validation (contact, qualification, revenue) before feeding an event back as an optimization target, or segment fabricated and verified conversions in separate line items.
Inspect bid requests for app supply with high conversion rates and low CPM: confirm app.bundle , app.storeurl , and device.devicetype are internally consistent and match the inventory you intended to buy.
Monitor time-of-day concentration on lead events; bulk overnight activity on Android utility inventory is a routing signal, not proof of fraud by itself, but it is worth isolating before budget scales.
Do not treat pre-bid IVT clearance as proof of human intent; real-device bid requests are compatible with background WebView and form-automation fraud.
When source.schain and seller authorization check out but outcomes disagree with CRM, the problem is likely event fabrication inside authorized app supply, not a missing hop in the chain.
Bid-request shape checks will not detect fraud intent. They do catch the inconsistent app metadata and malformed device blocks that make it harder to attribute suspicious supply back to a bundle or store URL when you investigate. Paste suspicious requests into RTBlint validate or follow the OpenRTB validation guide before you promote a placement from test to scaled spend.
## The honest limit
Not every cheap lead is fraudulent, and not every overnight form is fabricated. Utility apps are not inherently suspicious; Android is not the problem. The argument is narrower: when the only success signal the platform sees is the conversion event you defined, any supply that can manufacture that event cheaply will look like your best partner until another system contradicts it.
The delivery-side version of hidden WebView inflation (attention scores and engagement beacons divorced from the surface the user watched) is covered on vastlint . This piece is the bidstream mirror: the same environments can pass as real devices in the auction while corrupting the optimization feedback that decides where the next dollar goes.
## Sources
Field names refer to OpenRTB as published by IAB Tech Lab. Human Security, AppsFlyer, Adjust, and Google Play policy citations appear in the primary investigation article below. RTBlint is independent and not affiliated with Bizcommunity, Offernet, Human Security, or IAB Tech Lab.
Bizcommunity / Offernet: AI is optimising for ad fraud… because you told it to, August 26, 2026 (primary; includes cited Human Security SlopAds, Trapdoor, and Pareto volumes)
Human Security: SlopAds mobile ad fraud disclosure, September 2025
Google Play: Ad fraud policy
IAB Tech Lab: OpenRTB
---
# Open programmatic CTV spends 57 percent on TV sets and 43 percent on phone apps. The auction still sells it as one class. · RTBlint
URL: https://rtblint.org/blog/open-ctv-bid-request-device-class-split/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## Open programmatic CTV spends 57 percent on TV sets and 43 percent on phone apps. The auction still sells it as one class.
September 5, 2026 · RTBlint
MediaPost reported in August on a June 2026 U.S. study of open programmatic connected TV: large-screen devices, smart TV sets, account for 57% of that spend, and 43% runs on small-screen phones, tablets, and other iOS and Android surfaces. The headline is a spend map, not a fraud score. It still matters on the buy side, because the open exchange sells both halves under one CTV label while the fields buyers use to segment reach mostly assume a living room.
## What the metric actually measures
The study scope is narrow on purpose. Open programmatic streaming buys are public RTB auctions open to any demand-side platform buyer. That slice is roughly 18% to 19% of overall U.S. CTV ad spend, about $6 billion to $7.5 billion against industry estimates of $33.1 billion to $40.4 billion total. Private marketplace and programmatic guaranteed are excluded from the open bucket even though programmatic transactions overall, including PMP and PG, represent around 84% to 88% of all U.S. CTV ad spending.
Within that open slice, the 57/43 split is spend by screen class, not impression count and not fill rate. On large screens, Amazon Fire TV accounts for 30% of open TV programmatic ad spend, Roku for 18%, Samsung Smart TV for 5%, and Apple TV for 4%. Warner Bros. Discovery properties dominate network-level open deal concentration among the top ten: Food Network at 34%, CNN at 20%, Investigation Discovery at 7%, TLC at 4%, and Animal Planet at 2%. Reality-unscripted and news programming pull in 41% and 23% of open programmatic ad deals respectively. New programming dominates small-screen spend at 64%. Morning hours, 6 a.m. to noon, hold a 30% share of large-screen open spend; overnight, 11 p.m. to 6 a.m., holds a 31% share on small screens.
None of that tells you whether a given bid request cleared. It tells you where open exchange CTV money lands when nobody has curated the path. For auction debugging, the takeaway is simpler: when you buy open CTV programmatic, you are not buying a living-room-only line item. You are buying a portfolio that is almost evenly split between TV OS players and mobile streaming apps, traded under the same deal type.
## Why one deal label hides two device classes
OpenRTB does not expose a screen-class field that mirrors the spend map. Buyers segment with what exists: device.devicetype , app.bundle , app.storeurl , and the content object. AdCOM defines devicetype 3 as Connected TV, 4 as Phone, 5 as Tablet, and 6 as Connected Device for consoles and streaming boxes. Many CTV integrations filter on devicetype: 3 and treat that as the whole buy.
That filter aligns with the TV OS half of the spend map and excludes the 43% on phones and tablets unless the buyer deliberately widens the allowlist. The opposite mistake is just as common: a line item labeled CTV with no devicetype constraint accepts mobile app inventory the campaign plan assumed was big-screen. Neither error shows up as a parse failure. Both show up as reach that does not match the brief, or as no-bids that look like thin demand when the request simply landed on the wrong side of the split.
// Large-screen open spend concentrates on TV OS app bundles
// (Fire 30%, Roku 18% of large-screen open TV programmatic in the study).
"device": { "devicetype": 3, "ifa": "…" },
"app": { "bundle": "com.roku…", "name": "…" }
// Small-screen open spend (43%) often arrives as phone/tablet
"device": { "devicetype": 4, "ifa": "…" },
"app": { "bundle": "com.discovery.mobile…", "name": "…" }
// Same exchange seat, same "CTV" deal type, different reach.
Platform share compounds the mapping problem. Fire at 30% and Roku at 18% of large-screen open spend means the TV half of the line item is concentrated on two app ecosystems with different bundle namespaces and different historical enum mappings. A buyer who allowlists one TV OS bundle family but not the other is not buying 57% of large-screen open spend; they are buying a subset of it. Genre skew adds a planning layer: reality and news lean large screen in deal composition; new programming leans small. Content-level targeting on content.genre without a matching device-class plan can optimize creative context on one surface while spend runs on another.
## Who can observe what in the path
Sellers see the request they emit. Exchanges see the normalized object they forward. Buyers see the filtered view their bidder receives. The spend map is built from transaction logs aggregated across those hops. A buyer whose reporting keys on deal name plus devicetype will not reconstruct the 57/43 split unless every path populates device class consistently, and open exchange paths are where inconsistency is worst.
Daypart skew makes blind spots harder to catch in QA. Morning-heavy large-screen spend and overnight-heavy mobile spend mean a bid request sampled at noon in a desktop inspector never sees the traffic mix that will actually run. That is not a measurement vendor problem. It is a field-population and filter-design problem on the request.
The creative delivery half of the same split, codec and mezzanine coverage on TV OS versus mobile players, is documented on vastlint . This post stays on the auction side: what the buyer asked for in OpenRTB versus where open exchange money actually lands.
## What to check before you blame demand
Match devicetype filters to the spend map you intend. Connected TV only ( devicetype: 3 ) is a living-room line item, not an open exchange CTV line item. If the buy includes open RTB, decide explicitly whether the 43% mobile slice is in or out.
Audit app.bundle allowlists against TV OS share. Fire and Roku dominate large-screen open spend in the study. A bundle list built for one OEM or one FAST app misses concentrated inventory that still clears as CTV.
Align content targeting with device class. News and reality skew large screen; new programming skews small. Genre filters without device filters optimize context on the wrong half of the portfolio.
Split no-bids by nbr before widening the deal. Unsupported device ( nbr: 6 ) and invalid request ( nbr: 2 ) often trace to enum or bundle mismatches, not to missing demand. See the no-bid reason code guide .
Validate real open-exchange samples, not a single curated imp. Paste requests from both TV OS and mobile app paths into the bid request tester and confirm devicetype , app.bundle , and content match what your filters expect.
## The honest limit
Spend share is not bid-request share. The study measures dollars in open programmatic CTV, not the impression-level mix your bidder sees on a Tuesday morning. We are not going to invent a conversion factor between the two.
What is defensible is narrower. Open exchange CTV is marketed and trafficked as one class while the spend map is almost evenly split across TV OS and mobile apps. Buyers who treat that class as homogeneous in OpenRTB filters are either excluding money that still clears as CTV or accepting reach they did not plan for. That mismatch is fixable with explicit device-class and bundle policy, and it shows up in the request before anyone prices it.
## Sources
RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Pixalate. Figures below come from MediaPost coverage of the June 2026 U.S. open programmatic CTV study unless noted.
MediaPost: Study Finds More Than Half Of CTV Programmatic Served On Large Screens (August 2026 coverage of June 2026 open programmatic CTV spend split, platform shares, genre and daypart concentration, open vs total CTV spend context)
RTBlint: OpenRTB enumerated values (device.devicetype definitions)
The delivery half: VAST and playback on TV OS versus mobile (vastlint)
---
# UK consumers block fewer ads than the global average, but two-thirds opt out of cookie tracking. That split is a bidstream problem. · RTBlint
URL: https://rtblint.org/blog/uk-cookie-opt-out-addressable-reach-split/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## UK consumers block fewer ads than the global average, but two-thirds opt out of cookie tracking. That split is a bidstream problem.
September 3, 2026 · RTBlint
ExchangeWire published survey findings on September 2 from a study of 22,000 consumers across 22 markets. In the UK, 40% say they use an ad blocker, below the 47% global figure. Meanwhile, 68% say they have opted out of cookie tracking, matching the global average. The headline reads like a tolerance story. For anyone sending UK bid requests, it is a reach classification story.
## Ad tolerance and tracking tolerance are different metrics
Treating ad blocking and cookie opt-out as one privacy signal is how inventory gets mispriced. An ad blocker removes the impression entirely. A cookie opt-out removes the cross-site profile while the slot may still render, still fire server-side measurement, and still clear on contextual or first-party terms.
The UK numbers make that split visible. Fewer users block ads than the global norm, which suggests more viewable inventory on paper. Two-thirds have opted out of the tracking cookies that third-party identity, retargeting, and much frequency logic depend on. A buyer who reads lower ad-block rates as higher addressable reach is importing the wrong conclusion from the right survey.
The same release extends the distinction to AI chat placements. UK consumers responded negatively to ads alongside "highly personal" AI conversations (32% negative vs. 22% positive). Ads alongside "highly relevant" AI conversations were the only scenario tested where positive sentiment beat negative (32% positive vs. 18% negative). Relevance to the session mattered. Personal profiling did not. That is the same axis as cookie opt-out versus ad acceptance, just measured in a newer surface.
## What the survey actually measured
The underlying study is a commissioned consumer survey, not a log-level measurement of programmatic traffic. Respondents self-report ad-blocker usage and whether they have opted out of cookie tracking. Tracking cookies are defined in the release as small files placed by sites or third parties to monitor activity, remember preferences, and build browsing profiles.
That population is UK consumers broadly, not a defended campaign cohort or a single publisher's logged-in base. You cannot map 68% directly onto match rates in your SSP dashboard. You can use it as a sanity check on how UK inventory should be labeled in the bidstream: most of the audience the survey describes has already rejected the mechanism your identity extensions assume.
The release is part of a broader Global Insights report on media quality and AI. The UK slice is one market in a 22-market design. The figures quoted here are the UK-specific bullets from the ExchangeWire summary, not invented extrapolations.
## Where the split shows up in OpenRTB
None of this is visible in a CPM column. It shows up in whether the request tells buyers which parts of identity and measurement are still in bounds.
regs.gdpr 1 when the impression is in scope for GDPR.
Omission means unknown, not exempt.
user.consent TCF consent string when GDPR applies.
Absent on a GDPR-scoped request tells buyers
they cannot rely on vendor-level consent for
the IDs and sync pixels in user.eids.
device.lmt 1 when the user has limited ad tracking.
Pairs with absent or zeroed device.ifa on CTV
and mobile. Different from cookie opt-out in
mechanism, same buyer question: what reach is
actually for sale?
user.eids Identity extensions only matter when consent
and regulation allow them. Shipping eids on a
request with gdpr:1 and no user.consent is not
neutral; it is a claim buyers must discount or
drop.
A UK app or site with high viewability and thin privacy metadata looks like premium inventory right up until a buyer's GDPR filter runs. That filter is not measuring whether the user would have blocked the ad. It is measuring whether the request documents permission to use the identifiers attached to it. Our privacy signals reference and GDPR personal-data answer walk the field paths.
## Why sellers misread this as a demand problem
Unfilled UK inventory often gets explained as weak CPMs or missing buyers. Some of that is true. Some of it is buyers passing on requests they cannot legally or operationally use for identity-heavy line items, while the seller still counts the opportunity as addressable in a direct report.
The ad-block half of the survey is the number sales teams like. The cookie opt-out half is the number that should change how requests are constructed. If your UK path still defaults to sending full user.eids arrays with regs.gdpr: 1 and an empty or stale user.consent , you are not failing because UK users hate ads. You are failing because the request describes a user who has already said no to cross-site tracking, without encoding that refusal where buyers read it.
Contextual and content-level signals become the honest reach story: content.genre , content.title , site.cat , app.bundle , and the page or app URL the impression actually runs in. Those fields describe what the user is watching, not who they were on another site yesterday. That aligns with the survey's emphasis on contextual relevance over personal targeting, including in AI chat environments.
## What to check on a UK request this week
Pair regs.gdpr with user.consent on every UK EEA path. A GDPR-scoped request without a consent string is a filter trigger, not a bargain.
Stop treating missing consent as "unknown but probably fine." Unknown is how buyers classify requests they will not price with identity extensions.
Audit user.eids against consent scope. If you cannot map each extension to a permitted purpose in the TCF string, drop it before the auction, not after the pass.
Separate viewable reach from addressable reach in reporting. Lower ad-block rates do not convert into higher match rates when cookie opt-out is twice as common as blocking.
Validate a production UK sample in the tester. Paste a real request and read privacy paths before you trust a dashboard average. The bid request tester flags moved fields and missing consent pairs.
## The honest limit
A consumer survey is not a measurement of your bid stream. It does not tell you what fraction of your impressions carry valid TCF strings or how many UK users in your app have limited ad tracking enabled. It does tell you the direction UK users say they prefer: ads yes, cross-site tracking no, contextual relevance over personal profiling.
RTBlint validates payload shape and consistency. It does not detect fraud, bots, or consent compliance in law. It will tell you when a UK request claims GDPR scope while omitting the fields buyers use to decide whether identity belongs in the bid at all. That is a cheap check against an expensive misread of what 68% opt-out means for addressable reach.
## Sources
Survey figures are quoted from the ExchangeWire summary of the Global Insights consumer research. OpenRTB field names are from IAB Tech Lab specifications. RTBlint is independent and not affiliated with DoubleVerify, ExchangeWire, or IAB Tech Lab.
ExchangeWire: Global Study: UK Consumers Accept Ads, Reject Tracking, September 2, 2026
RTBlint: Privacy signals in OpenRTB
RTBlint: OpenRTB bid request best practices
---
# MRC invalid traffic rules require a decision rate. Unknown impressions are not clean. · RTBlint
URL: https://rtblint.org/blog/mrc-ivt-decision-rate-unknown-not-valid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## MRC invalid traffic rules require a decision rate. Unknown impressions are not clean.
August 31, 2026 · RTBlint
Invalid traffic headlines are almost always a percentage of classified impressions. The Media Rating Council requires something else in the same report: a decision rate, the share of rendered impressions where the vendor had enough information to reach a verdict. In the MRC worked example, 85 of 100 rendered impressions qualify and 15 are unknown. Unknown traffic must not be assumed valid. That rule is what separates a vendor dashboard from a population you can compare.
## What the metric actually measures
Invalid traffic is advertising activity that should be removed from the numbers advertisers pay against. The MRC splits it into General Invalid Traffic, identified through lists and standardized parameter checks, and Sophisticated Invalid Traffic, which requires advanced analytics and human review. GIVT detection is mandatory for every accredited measurement organization. SIVT detection is optional and separately accreditable.
The consequence is regulatory, not cosmetic. GIVT is meant to be consistent between vendors because it leans on shared resources: the IAB/ABC International Spiders and Bots List and the Trustworthy Accountability Group data-center address list. On data centers the MRC requires filtration of invalid traffic from the three largest hosting entities: Amazon AWS, Google, and Microsoft. SIVT findings must be segregated and disclosed only at campaign total level, because transaction-level detail would let operators reverse-engineer the logic.
Back-end detection is mandatory. Sophisticated adjustments made after a campaign closes must land within 14 days of completion. Up-front blocking is not required, and the MRC is openly cautious about it, warning that blocking telegraphs the method to the traffic source and invites A/B testing against the filter.
Because filters only work on the signals they receive, vendors must also publish a decision rate: recorded impressions where enough information existed to reach a verdict, divided by total impressions intended for measurement. Fifteen unknown out of one hundred rendered impressions is a 15 percent unmeasured bucket sitting beside an IVT rate computed on the other 85. Treating the headline IVT percentage as if it described all one hundred is the mistake practitioners make when they compare vendor charts without reading the denominator footnote.
## Where the telemetry lives on the bidstream
The MRC lists the signals that determine whether an impression is classifiable. They map cleanly onto a programmatic stack: IP address including X-Forwarded-For, unmodified user agent, device and app identifiers, referrer, consent string, publisher and placement IDs, ads.txt information, pre-fetch headers, and OpenRTB attributes.
// Fields that feed IVT decision rate, not just pre-bid lists
"device": {
"ip": "...",
"ipv6": "...",
"ua": "...", // unmodified; SSAI server UA → unknown
"ifa": "...",
"lmt": 0
},
"app": {
"bundle": "...", // April 2024 MRC update: CTV bundle spoofing
"publisher": { "id": "..." }
},
"source": {
"ext": { "schain": { ... } } // ads.txt / sellers.json chain
},
"regs": {
"ext": { "gdpr": ..., "us_privacy": "..." } // consent context
},
"imp": [{
"id": "...",
"video": { "placement": ..., "plcmt": ... }
}]
A bid request that clears the auction with a thin device object is not automatically fraud. It is often unclassifiable. Pre-bid datacenter lists and device reputation feeds answer a narrow question on the fields they receive. Post-bid IVT measurement answers a broader one on the same fields, and marks the gap as unknown when the chain breaks. That gap does not appear on a seller fill report. It appears inside the buyer's measurement vendor as impressions that never entered the IVT numerator or denominator the dashboard headline assumes.
The April 24, 2024 MRC interim update added bundle ID spoofing in connected TV to the IVT guidance. CTV supply paths that strip or rewrite app.bundle do not only confuse targeting. They remove one of the corroboration points SIVT detection depends on, which pushes impressions toward unknown or toward misclassification when the vendor guesses from partial data.
## Why the published rates disagree by an order of magnitude
Reported IVT rates diverge depending on who measures what. Verification vendors report low single digits on protected inventory. Integral Ad Science measured global invalid traffic at 1.203 percent before the 2026 FIFA World Cup and 1.134 percent after kickoff, against an expected seasonal decline to 0.876 percent. DoubleVerify reported fraud and SIVT violation rates down 41 percent year over year in North America and 45 percent in EMEA on July 29, 2026, with North America still the highest tracked market at 0.6 percent on protected campaigns.
Click-level vendors report far higher figures. Lunio recorded LinkedIn at a 17.62 percent invalid traffic rate in the first quarter of 2026, and found retail search campaigns running Google AI Max exposed to 72 percent more invalid traffic than campaigns without it, at 5.28 percent against 3.07 percent in the second quarter of 2026.
Part of the gap is definitional: clicks and impressions are different denominators, and protected campaigns are not a random sample. A March 2025 investigation spanning more than a petabyte of traffic concluded that at least 40 percent of web traffic is non-human, and found cases where verification tools identified a visitor as a bot and served an ad anyway.
Reclassification moves the numbers too. Declared AI crawlers count as GIVT rather than fraud, and their volume is new: DoubleVerify recorded an 86 percent year-over-year rise in GIVT during the second half of 2024, 16 percent of it linked to AI tools. Changes to three MRC accredited metrics in Display and Video 360 on July 14, 2025 were expected to roughly double reported invalid and GIVT begin-to-render impressions, a detection improvement that reads on a dashboard as deterioration.
None of those comparisons is honest without the decision rate beside them. A protected campaign at 0.6 percent IVT on 95 percent classified impressions is a different claim from 0.6 percent on 60 percent classified. The second leaves 40 percent of spend in the unknown bucket the MRC says you cannot treat as clean.
## The mechanism on defended versus open traffic
Pre-bid filtration and post-bid measurement sit on opposite sides of the same auction. A buyer who blocks datacenter ranges before pricing never sends those impressions to post-bid IVT at all. A buyer who measures only after delivery sees everything that served, including traffic missing the telemetry needed to classify it. Sellers who compare their low platform-side IVT credits to a buyer's post-bid report are often comparing different populations without knowing it.
Google's buy-side documentation lists six types of invalid activity on search, including double-click duplicates, competitor clicks, automated tools, known data-center traffic, and impressions designed to depress clickthrough rate. Activity caught before an invoice generates is never billed. Activity caught afterwards produces credits, which Google states are adjustments rather than refunds. Campaign-level visibility into those credits arrived when Google published help documentation for the Invalid Activity Credit Report on June 1, 2026, limited to Search and Performance Max.
Sell-side exposure runs in reverse. Publishers receive no credits; they lose revenue and, inside Google's owned channels, serving capacity. A Lunio survey of 131 senior marketing leaders fielded in May 2026 found 5.3 percent using dedicated invalid traffic tools, with 39.7 percent citing confidence in platform-side prevention as the reason not to, while 38.9 percent rated their trust in platform invalid click credits at 4 or below on a ten-point scale. Platform-side prevention and third-party decision rates are not the same instrument.
## What to do
Ask for decision rate beside every IVT headline. If the vendor report shows 1.134 percent global IVT without stating how many impressions were classifiable, you do not have a rate. You have a rate on an undisclosed subset.
Audit the telemetry list on live CTV traffic. Sample bid requests from every path you sell through, including SSAI and reseller hops. Count how often device.ua is a server string, how often device.ip is missing while the impression still clears, and whether app.bundle is stable across exchanges for the same title.
Split pre-bid blocks from post-bid unknowns in reporting. Datacenter blocks remove inventory before measurement. Unknowns are inventory that served without classifiable signals. Merging them in one "clean" line hides structural gaps.
Validate requests before they leave your stack. Structural errors (missing device fields, inconsistent pod objects, deprecated-only video enums) are not IVT scores. They are reasons a downstream classifier marks unknown. Paste production traffic into the bid request tester or run the CI validation guide on every integration release.
RTBlint does not detect invalid traffic, bots, or fraud. It flags malformed or inconsistent OpenRTB payloads. A request that fails validation is a request another system may refuse to classify, which is a different failure mode from a high SIVT rate on traffic that looked well formed.
## Sources
MRC Invalid Traffic Detection and Filtration Guidelines (Version 1.0 final October 27, 2015; IVT 2.0 final June 25, 2020; interim updates April 24, 2024) define GIVT, SIVT, decision rate, and required telemetry. Field names in this post follow OpenRTB and AdCOM as published by IAB Technology Laboratory. The analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, MRC, or PPC Land.
PPC Land: Explaining invalid traffic (August 2026), synthesis of MRC IVT guidance, decision rate example, and comparable vendor rates
Integral Ad Science: World Cup IVT at 1.203 percent pre-tournament, 1.134 percent after kickoff, versus 0.876 percent seasonal expectation (July 2026)
DoubleVerify: North America protected violation rate at 0.6 percent, 41 percent YoY decline; 86 percent GIVT rise in 2H 2024 (July 2026 coverage)
Adalytics investigation: at least 40 percent non-human web traffic; verification serving ads to declared bots (March 2025)
Google Invalid Activity Credit Report documentation, June 1, 2026
---
# A spec-valid video bid can still fill with empty VAST. · RTBlint
URL: https://rtblint.org/blog/video-bid-is-not-vast-proof/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Video
## A spec-valid video bid can still fill with empty VAST.
August 29, 2026 · RTBlint
A bid request can carry a complete imp.video object. The response can carry a bid.adm that starts with , loads media, fires tracking , and matches companions by pixel size. None of those steps are fields on the Video object. The VAST and OpenRTB guide draws that boundary. The Video object reference lists every request constraint. Neither page can tell you what the last hop returned.
Validate the bid in the OpenRTB tester . That is the right tool for protocols , api , plcmt , and duration. It is the wrong tool for a wrapper that 200s with an empty .
## Three ways a clean bid still fails to play
The wrapper resolves and there is no ad. VAST error 303 is No Ads VAST response after Wrapper. The outer document was legal. The last hop was empty, a timeout dressed as XML, or another wrapper with nothing behind it. That is not an OpenRTB no-bid. The seat already won. Walk the chain on the VAST inspector , not in the bid JSON. How to validate the envelope, then the live hops, is How to Validate VAST Wrappers .
The interactive file is not the media. SIMID lives in . Players that do not speak SIMID play the sibling . A tag that only ships a JavaScript VPAID leftover fails as player error 901 on CTV. imp.video.api can list SIMID and still win a creative that never implemented it. Envelope checks are How to Validate SIMID in VAST Tags .
The companion has no size to match. Publishers match banners by width and height, not by creative id. A with a JPEG and no dimensions is not a 300x250. required="all" can kill the linear if no size matches. That failure never appears in imp.banner because the companion is not the auctioned impression. How to Validate Companion Ads , plus the problem pages for companions that do not show and IAB sizes .
## What to run on which document
Paste the bid request and the bid response into RTBlint. If adm is inline VAST, copy that XML into a VAST validator. If adm is a wrapper or a tag URL, fetch it. The VAST tester follows the live URL. The inspector is the hop-by-hop view when 303 or 302 shows up in the player log.
Do not treat a 200 on the wrapper host as a filled break. Do not treat a valid imp.video.maxduration as proof the inline has . Those are two contracts. The second one is not in this repo.
## Sources
VAST and OpenRTB: how video creatives are delivered
OpenRTB Video object
bid.adm vs nurl
VAST tag tester
A Companion with no width is not a 300x250
IAB Tech Lab: VAST
---
# Half a million streaming shows get ranked from app.bundle alone. Your content object is optional to everyone but you. · RTBlint
URL: https://rtblint.org/blog/bundle-id-resolves-show-level-ctv-spend/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## Half a million streaming shows get ranked from app.bundle alone. Your content object is optional to everyone but you.
August 28, 2026 · RTBlint
On August 27, Pixalate published the July 2026 OpenEPG Index update. The ranked universe grew from 12,875 shows at launch to more than 532,000 shows mapped across 13,600+ channels and 6,100+ apps. The index measures U.S. open programmatic ad spend and consumer reach by streaming TV show, split by large-screen CTV and small-screen mobile. Resolution uses standard bidstream bundle IDs with no publisher opt-in. That last clause is the part buyers should read twice.
## What the index actually measures
OpenEPG ranks shows by estimated U.S. consumer reach and reports each show's share of open programmatic ad spend. The July release breaks spend and reach by screen class, genre, market tier, and daypart. Large-screen rankings combine Roku, Amazon Fire TV, Samsung, and Apple TV. Small-screen rankings combine Android and iOS. These are open-exchange signals, not a walled-garden report from any single SSP.
Pixalate states explicitly that show resolution runs on bundle IDs from the bidstream. The database behind the index does not wait for a seller to populate content.title , content.series , or content.episode . Public EPG data and open-exchange traffic do the mapping. If your buyer-side filter treats an empty content object as low-quality inventory, you are applying a rule the measurement layer does not need.
RTBlint is independent of Pixalate and not affiliated with IAB Tech Lab. The numbers below come from Pixalate's July 2026 blog post and linked U.S. spend report unless noted.
## July spend patterns: same genre label, different screens
News, Reality, and Documentary accounted for 75% of estimated U.S. CTV open programmatic ad spend on streaming TV shows in July. On mobile, News alone took 52% of spend. Reality flipped the split: 8% of mobile streaming TV ad spend versus 30% on CTV. Comedy was 16% mobile and 4% CTV. Drama was 4% mobile and 3% CTV. Sport sat at 2% on both surfaces.
National versus local news diverged by screen as well. National news outlets captured 40% of mobile streaming TV ad spend compared with 12% for local stations. On CTV the gap was wider: 34% national versus 3% local. A single content.genre string, if it arrives at all, cannot carry that national/local split unless the seller also sends consistent market metadata and the buyer's taxonomy matches how the seller encodes it.
News over-monetized on CTV in July: 37% of ad spend against 28% of reach, which Pixalate reads as heavier ad loads and higher CPMs on large screens. Mobile news sat near parity at 52% spend versus 51% reach. HGTV (13%) and Food Network (11%) together accounted for roughly a quarter of CTV ad spend. Scripps News alone accounted for 22% of U.S. mobile streaming TV open programmatic ad spend. The Weather Channel swept the top three mobile slots by reach and held 25% of mobile streaming TV ad spend.
## Genre IVT is not uniform
Among leading genres in July, News carried the highest invalid-traffic rate at 6.1%, nearly double Reality at 3.2%. Pixalate notes these IVT figures follow its MRC-accredited methodology and are not legal findings of fraud. Still, a buyer blocking on genre without knowing whether content.genre or content.genres in the request matches the show-level classification downstream is blocking blind.
If verification vendors classify genre from bundle resolution and public EPG while your DSP reads only what the seller typed into content , your pre-bid filter and your post-bid report can disagree on the same impression. That is not a measurement bug. It is two different inputs.
## The mechanism in OpenRTB
Show-level context in OpenRTB lives on the Content object: content.title , content.series , content.season , content.episode , content.genre , and since 2.6-202501, content.gtax and content.genres . App inventory nests that object under app.content ; site inventory uses site.content . CTV sellers often send a thin object or omit it entirely while still transmitting a valid app.bundle , app.name , and device fields.
Bundle ID is the key third parties use when publishers do not opt into enriched content signaling. The same identifier appears in ads.txt and sellers.json rows, in blocklists, and in fraud reports that flag platform mimicry. Inconsistent app.bundle across exchanges already splits one app into three allowlist entries. OpenEPG adds another consequence: show-level spend rankings and genre IVT rates can be computed from traffic that would fail a buyer rule requiring content.title .
// Minimal CTV app request: valid auction, empty show context
{
"app": {
"bundle": "com.example.fastnews",
"name": "Example FAST"
// no app.content block
},
"device": { "devicetype": 3, "ifa": "…" },
"imp": [{ "video": { "plcmt": 1 } }]
}
// Downstream show resolution (vendor EPG + bidstream)
// → "Morning Rush" on Scripps News, News genre, 6.1% genre IVT bucket
Neither shape is malformed by itself. The gap is operational: buyers optimize filters on fields sellers skip; sellers lose demand to filters that measurement vendors bypass.
## What to do
Audit empty content on live CTV traffic before you block it. Sample open-exchange requests by app.bundle . If title and series are missing but bundle and IFA are present, you are in the population show-level indexes already classify.
Split genre analysis by screen class. July's Reality skew (30% CTV spend, 8% mobile) means a genre allowlist tuned on one surface mis-prices the other. Device type and bundle together beat a lone content.genre string.
Align on content.gtax and content.genres where you can. OpenRTB 2.6-202501 added taxonomy fields so genre is not free text. See our 2.6-202501 review for the migration notes.
Treat national versus local as a separate signal. The July national/local split (40% versus 12% mobile, 34% versus 3% CTV) will not appear in a generic News genre flag unless someone sends it.
Validate fixtures against both bundle and content. A test request with a perfect content block and a spoofed bundle is still wrong. A real bundle with an empty content object is common live traffic.
## Check the payload
RTBlint checks structural and consistency rules on OpenRTB JSON. It does not resolve EPG or detect IVT. It will flag missing cattax when categories are sent, type mismatches on content.genres , and implausible combinations of app, device, and video fields. Paste a production CTV request and read what the seller actually ships.
Validate a bid request · OpenRTB 2.6-202501 Content object review
## Sources
Pixalate: July 2026 OpenEPG Index blog post (August 27, 2026)
Pixalate: July 2026 OpenEPG Index U.S. State of Streaming TV Ad Spend Report
OpenEPG Index public rankings (monthly top 100 by reach)
---
# adagents.json does not audit schain. Those two trust files do not talk. · RTBlint
URL: https://rtblint.org/blog/adagents-json-does-not-audit-schain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Agentic
## adagents.json does not audit schain. Those two trust files do not talk.
August 26, 2026 · RTBlint
AAO published adagents.json so a publisher can declare which sales agents may represent its inventory. IAB Tech Lab already published ads.txt, sellers.json, and the OpenRTB SupplyChain object for who may sell that inventory. Those two questions are not the same, and the bid request still only carries one of them.
## Four files, one hop
ads.txt is the publisher's list of authorized sellers. sellers.json is each intermediary's account map. source.schain is the hop list on the bid request. Buyers who reconcile those three have a working (if incomplete) picture of who is entitled to sell the impression.
adagents.json sits at /.well-known/adagents.json . It names agents, not seller IDs. An AdCP or AAMP path can be authorized as a seller in ads.txt and still be an agent the publisher never listed. The reverse is also possible: a listed agent whose hop is missing from schain, or whose asi does not match the agent URL. OpenRTB 2.6 has no field that says this request was produced by agent X.
## What the bid request actually carries
The auction still looks like an ordinary bid request. Deal IDs land in imp.pmp.deals . The agent that negotiated the package is not a first-class object. If you only validate schain completeness, hp, and ads.txt membership, you will pass inventory an agentic buyer was never allowed to represent.
ads.txt who may sell this publisher (seller IDs)
sellers.json what those IDs mean at each intermediary
source.schain the hops on this request
adagents.json which agents may represent this inventory (new)
OpenRTB carries schain. It does not carry adagents.json.
That split is why a green schain check is not an agentic authorization check. The supply chain trust stack guide and the AdCP explainer cover where the files sit. Neither file currently cross-checks the other in the spec.
## What to do on the receive side
Keep reconciling source.schain against ads.txt and sellers.json. Agentic buying did not retire that stack.
Fetch adagents.json for publishers you already ads.txt-crawl, and store it next to the seller list. Treat a missing file as unknown, not as unauthorized, until your policy says otherwise.
Do not invent a schain node type for agents. SupplyChain 1.1's hp=0 custody nodes are a different proposal. Mixing them with adagents.json in one check will fail both.
Validate the bid request you actually get. Paste it into the OpenRTB tester . An agentic package that executes as a malformed imp.pmp or a broken video.plcmt is still a bad request.
## The honest limit
RTBlint does not crawl adagents.json and does not certify agents. It checks that the OpenRTB payload is consistent with the snapshot you pinned. A valid schain is not proof the agent was listed. An listed agent is not proof the hop was well-formed. Independent of IAB Tech Lab and of AgenticAdvertising.org.
## Sources
AgenticAdvertising.org: adagents.json
AdCP explained
ads.txt, sellers.json, schain
SupplyChain object reference
---
# imp.native.request is a JSON string, not a nested object. · RTBlint
URL: https://rtblint.org/blog/native-request-is-a-json-string/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## imp.native.request is a JSON string, not a nested object.
August 26, 2026 · RTBlint
OpenRTB 2.x did not nest the Native request as JSON objects under imp.native . It stuffed a whole Native markup request, itself JSON, into a string field named request . A decoder that maps that field to map[string]any or a struct will fail closed or, worse, fail open and bid without assets.
## Two JSON documents, one HTTP body
The bid request is JSON. The Native request is also JSON. The second document is quoted inside the first. That is IAB Native 1.1/1.2 as carried by OpenRTB 2.x, not a vendor quirk. imp.native.request is a string. imp.native.ver names the Native spec version. Assets, eventtrackers, and context live inside the string.
{
"id": "req-1",
"imp": [{
"id": "1",
"native": {
"request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":140}}]}",
"ver": "1.2"
}
}]
}
If your type for request is an object, most languages will error on unmarshal. If your type is json.RawMessage or string and you never parse it, you will bid on a native impression whose title length, image sizes, and required assets you never read. That looks like fill. It is inventory you cannot render.
## Where it breaks in production
Exchanges sometimes send the Native object unquoted because an internal model already had structs. Bidders that only accept a string then drop the imp. Bidders that only accept an object drop the spec-shaped requests. Both payloads exist. A single integration test against one exchange will not show the other dialect.
OpenRTB 3.0 / AdCOM moved Native into the shared object model so this double encoding could die. Plenty of 2.6 traffic has not moved. If you still speak 2.x, you still have a string.
## What to check
Decode imp.native.request as a string, then JSON-parse that string into the Native request. Do not skip the second parse.
Read ver on both the OpenRTB native object and inside the request document. They should agree. When they do not, pick a policy and log it.
Reject required assets you cannot fill. A bid with empty adm native markup is how you win and then fail to render.
Paste a real native request into the tester . The Native object reference is the field list.
## The honest limit
This is a parse contract, not a fraud check. A well-formed string can still describe MFA inventory. RTBlint reports when the native payload is not usable as specified. It does not score content quality. Independent of IAB Tech Lab.
## Sources
OpenRTB Native object
AdCOM and why 2.6 moved the enums
Bid request tester
---
# Car head units now join the residential proxy pool. OpenRTB still has no field for that device class. · RTBlint
URL: https://rtblint.org/blog/automotive-head-unit-residential-proxy-blind-spot/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## Car head units now join the residential proxy pool. OpenRTB still has no field for that device class.
August 25, 2026 · RTBlint
In June 2026, researchers found malware delivered through the built-in updater on Android-based automotive head units running DoFun firmware. The infection chain installs a clicker for fraudulent ad impressions and a reverse-proxy module that enrolls the infotainment system in a residential proxy botnet linked to the BADBOX ecosystem. That is the first documented in-the-wild case on car head units. For programmatic buyers, the punchline is not the novelty of automotive malware. It is that another device class now feeds the same residential IP pool your pre-bid datacenter blocklists treat as clean, and OpenRTB has nowhere to record that the impression came from a dashboard screen.
## What the finding actually measures
This is endpoint security research, not an ad-tech measurement study. Kaspersky documented how attackers weaponized TWCore, a legitimate system application that pushes firmware updates on DoFun head units, to install JarService, a Trojan dropper with no user interface. JarService decrypts and launches a downloader that phones home to a command-and-control server, receives further payloads, and can execute a clicker: malware that inflates ad impressions by making HTTP requests and opening web pages under remote control.
The operators also install a module called zhima that adds infected head units to a botnet used for residential proxy services. Kaspersky tied the operation to MoYu Group and the broader BADBOX malicious platform, which centers on infecting Android devices and reselling their network access. Investigators found infrastructure overlaps with PXYEDGE and ProxyForU, commercial residential proxy services that route client traffic through compromised devices so buyers appear to browse from household IP addresses.
DoFun develops firmware and cloud services for aftermarket Android infotainment systems. Kaspersky cites DoFun's public claim of serving more than 30 million vehicle owners worldwide. The malware does not affect every automotive head unit: only units on DoFun software, delivered silently through the update channel rather than a store download a user could refuse. After disclosure, DoFun addressed the update-channel abuse Kaspersky identified.
That population is different from the defended campaigns in a verification dashboard. These are compromised edge devices monetized for proxy resale and click fraud, not publishers selling authorized inventory. Any bid request that exits through a zhima-infected head unit carries a residential IP and plausible consumer network metadata (model, screen resolution, Wi-Fi SSID, MAC address reported to C2). Post-bid IVT that scores individual impressions may eventually flag anomalous patterns. Pre-bid datacenter CIDR lists will not, because the address is not cloud-hosted.
## The mechanism on the bidstream
Residential proxy botnets are not new to programmatic. BADBOX-linked operations already targeted cheap Android TV boxes, tablets, and projectors, running hidden ad activity and reselling proxy access. Kaspersky's conclusion explicitly places car infotainment alongside TV set-top boxes as the next expansion surface. Each new device class adds IPs that look like home broadband to a bidder who only checks whether the address belongs to AWS, Google, or Microsoft.
OpenRTB gives you device.ip , device.ua , device.devicetype , device.make , device.model , and for app traffic app.bundle . None of those fields assert device integrity or distinguish an aftermarket car dashboard from a phone on the same carrier NAT. A head unit running Android can plausibly emit app traffic with a mobile or connected-TV devicetype depending on how the SSP maps automotive hardware. The fraud is in the device state, not in a malformed bundle string.
// What the auction sees vs what happened
"device": {
"ip": "73.42.18.104", // residential; passes datacenter block
"devicetype": 4, // phone or tablet, mapping varies
"make": "Generic",
"model": "Android head unit"
}
// Not present: compromised via supply-chain updater,
// enrolled in residential proxy + clicker, not a store-listed app surface
Proxy services sit adjacent to, and often upstream of, the ad fraud. Clients buy egress through infected hardware to scrape, credential-stuff, or route automated browsing that generates billable events. When the same module family ( zhima ) appears across device categories, the programmatic path and the security path converge on one fact: your filters key on network and app identity, while operators key on anything with Android, an update channel, and an always-on connection.
Click fraud on the head unit itself is cruder: remote HTTP and WebView commands under C2 direction. That is closer to classic invalid traffic generation than to spoofed CTV bundle IDs. It still clears pre-bid gates that only exclude datacenter ranges, because the requests originate on a consumer network interface, often the vehicle's Wi-Fi or tethered phone hotspot.
## What to do
Treat residential proxy expansion as a supply-path problem, not only a malware headline. Device-class churn (TV boxes, then automotive dashboards) grows the pool of IPs that pass datacenter checks. Split reporting on pre-bid blocks by reason: datacenter CIDR, app deny list, device reputation. A stable datacenter IVT rate can hide proxy-sourced traffic.
Do not infer device class from IP alone. Sample raw CTV and in-app requests in the bid request tester and log when device.make , device.model , and device.devicetype disagree. Automotive aftermarket units often ship generic Android builds.
Keep app-level and network-level filters separate. Delisted bundle blocklists and datacenter IPv4/IPv6 feeds close different holes. Residential botnet traffic can carry a well-formed app.bundle on a clean residential IP.
Validate shape before policy. Reputation and blocklist rules assume parseable device objects. Gate OpenRTB payloads in CI per the validation guide so policy runs on fields that actually populated in production.
Ask SSPs what they reconcile beyond the request. Store listing status, update-channel integrity, and OEM attestation are outside OpenRTB. If the answer is nothing, proxy-sourced residential IPs remain indistinguishable at bid time.
## The honest limit
A linter cannot detect compromise, botnet membership, or residential proxy routing. It detects malformed or inconsistent OpenRTB fields. Kaspersky's finding is a reminder that the device behind a clean residential IP is not necessarily the phone or TV your targeting assumed. During BADBOX-scale operations, that gap is large enough to matter in the bidstream even when headline IVT on defended campaigns looks stable.
## Sources
Field names are from OpenRTB as published by IAB Tech Lab. The analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Kaspersky.
Kaspersky: Botnet on the road: the first trojan for car head units (August 21, 2026)
Kaspersky Securelist: full technical analysis of the head-unit malware (linked from the blog post)
RTBlint: OpenRTB bid request reference (device object fields)
---
# A spec-valid SupplyChain hop can still be pooled inventory. ads.txt certifies the seller ID, not the site. · RTBlint
URL: https://rtblint.org/blog/dark-pooling-authorized-seller-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## A spec-valid SupplyChain hop can still be pooled inventory. ads.txt certifies the seller ID, not the site.
August 21, 2026 · RTBlint
Buyers built a three-file trust stack for a reason: ads.txt says who may sell a domain, sellers.json says who that account is, and the SupplyChain object names the hops on this request. Dark pooling is the case where all three agree and the inventory is still not the site you thought you bought. The files certify a seller ID. They do not certify that the ID is used by only one property, or by properties under one owner.
## What the metric actually measures
Pooling, in the ordinary sense, is allowed. Two sites under one publisher sharing a DIRECT account is how a network runs ads.txt without minting a new seller ID per subdomain. Dark pooling is the industry term for the other case: organizationally unrelated domains, often of different reputation, listing the same DIRECT identifier. Payment after the auction goes to the owner of that seller ID. The bid request can still name a domain the buyer would never clear.
Vekaria, Nithyanand, and Shafiq spelled the pass condition at IEEE S&P 2024. A low-quality site copies a vetted publisher's seller ID into its ads.txt as DIRECT. The exchange's sellers.json still lists that ID. Every basic supply-chain check succeeds, because the ID is real. Invalidating every shared ID would also kill legitimate subsidiaries. The remaining work (are these properties related, did the exchange actually vet this domain) is not in the three files.
Papadogiannakis, Kourtellis, Papadopoulos, and Markatos crawled more than 7 million Tranco domains in February 2023 for WWW 2025. They fetched ads.txt from 456,971 domains and extracted 81,985,768 valid entries, including 591,546 distinct DIRECT publisher identifiers. They treat a DIRECT ID as pooled when more than one website uses it, then ask which of those pools mix unrelated properties. That is a file census, not a live bidstream. It is still the right population for the authorization claim, because the claim lives in those files.
## The pools that contain objectionable sites are not small
Across all DIRECT pools they measured, the median size is 4 sites and the mean is about 122. That mean is a long tail of large networks, not a typical publisher. Pools that contain at least one misinformation site, using MediaBias/FactCheck labels, have a median of 336.5 and a mean of about 2,975. Pools that contain at least one piracy site, using NextDNS torrent and warez lists, have a median of 645 and a mean of about 4,915. They report that earlier dark-pool size estimates, including the S&P 2024 crawl, were low by a factor of 15 once the census is this wide and restricted to DIRECT IDs.
Ninety-two percent of sites that served an ads.txt file listed at least one Google DIRECT publisher ID. Popular networks are where shared IDs concentrate, which is also where a buyer's allowlist is most likely to treat the ID as a quality signal. The WWW paper estimates that identifier pooling lets bad actors absorb thousands of dollars from the ecosystem; it does not publish a global dollar total. Treat that as direction, not a TAM.
They also found 30 ad resellers that list themselves as content owners in other networks. Some of those resellers work with almost 200 objectionable or illegal sites, and that pattern held across a seven-month window. That is a different abuse (intermediary as publisher) sitting next to pooling. Both survive a hop check that only asks whether asi and sid appear in sellers.json.
## What a bid request can and cannot prove
OpenRTB will carry site.domain or app.bundle , source.schain , and often a publisher ID the exchange minted. A linter can decide the structural questions: required fields, complete , adjacent duplicate nodes, hp in range, payment hops present in a local ads.txt and sellers.json cache. RTBlint does that with --resolve --cache . It is a real check. It is also exactly the check the pooled site is designed to pass.
site.domain the page the buyer thinks they bought
publisher.id exchange account, often the pooled seller ID
source.schain.nodes asi + sid for each payment hop
ads.txt domain, seller ID, DIRECT | RESELLER
sellers.json seller_id, seller_type, domain (or confidential)
None of those rows answers: how many other domains list this DIRECT ID, and are they under the same owner? Confidential sellers.json entries make even the domain lookup fail closed or fail open, depending on your policy. A complete chain with hp=1 on every node is a disclosure of money hops. It is not a census of the ID.
SupplyChain v1.1 adds custody nodes with hp=0 . That is a different transparency problem (who touched the request). It does not fix pooling. A pooled DIRECT ID still sits on a payment node. See the v1.1 hop note for what hp=0 changes, and do not fold that into this one.
## What to do
Keep the hop check. Reject requests whose payment nodes are absent from ads.txt or sellers.json. That still kills fabricated IDs and unauthorized resellers. It is not optional because pooling exists.
Count domains per DIRECT ID, off the bid request. Crawl ads.txt for the seller IDs you actually buy. A median-4 pool is a network. A median-336 pool that includes a misinformation label is a different object. The WWW crawl is the method; your allowlist is the population that matters.
Do not treat Google (or any dominant) DIRECT as a brand-safety proxy. 92% of ads.txt sites in that crawl already have one. The ID is common by construction.
When sellers.json marks the account confidential, decide whether you bid. The file cannot name the property. Passing the hop is passing a redacted hop.
Split site.domain / app.bundle from the seller ID in reporting. If the domain you paid for never appears in the ID's ads.txt cluster, the authorization files and the inventory claim have diverged.
Paste a bid request into the tester , or run the CLI with a local ads.txt and sellers.json cache. Field context is in the supply chain reference and the trust stack guide . RTBlint is independent of IAB Tech Lab and of the papers cited here. It does not detect fraud, IVT, or whether two domains share an owner. It detects malformed or unauthorized hops. Owner-graph and pool-size checks are a different job, and they are the job dark pooling actually requires.
## Sources
Vekaria, Nithyanand, Shafiq. The Inventory is Dark and Full of Misinformation. IEEE S&P 2024. arXiv:2210.06654. Mechanism: shared seller ID passes ads.txt and sellers.json; 669 misinformation sites in the labeled set.
Papadogiannakis, Kourtellis, Papadopoulos, Markatos. Welcome to the Dark Side. WWW 2025. arXiv:2306.08418. 7M+ domains, 456,971 ads.txt files, DIRECT pool-size medians, 15× revision of prior pool size, 30 reseller-as-publisher cases.
IAB Tech Lab ads.txt and sellers.json specifications. What DIRECT and the seller ID are defined to mean.
---
# OpenRTB carries device.ipv6 beside device.ip. IPv4-only datacenter blocks miss the parallel path. · RTBlint
URL: https://rtblint.org/blog/ipv6-datacenter-openrtb-prebid-gap/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## OpenRTB carries device.ipv6 beside device.ip. IPv4-only datacenter blocks miss the parallel path.
August 21, 2026 · RTBlint
Pre-bid datacenter blocklists are finally shipping as separate IPv4 and IPv6 CIDR feeds. That is not a format tweak. OpenRTB has carried device.ip and device.ipv6 as sibling fields for years, and the industry spent most of the dual-stack transition checking only one of them against cloud ranges. A residential IPv4 can sit in the same bid request as an IPv6 address rooted in hosting infrastructure. Buyers who block only the v4 path pay for traffic that never should have cleared pre-bid; buyers who blunt-block the whole v4 prefix reject good impressions to stop a minority of invalid ones.
## What the metric actually measures
Datacenter blocklists are not impression IVT scores. They are weekly CSV files of CIDR ranges associated with cloud and hosting providers, intended to be matched before an auction prices inventory. The Media Rating Council expects filtration of invalid datacenter traffic to include ranges from the three largest hosting providers: Amazon AWS, Google, and Microsoft. Vendor feeds extend that with internally curated ranges for smaller clouds.
That is a different population from device reputation lists, which attach fraud types and probabilities to individual IPs and update on a faster cadence (IPv6 device lists twice per day in one vendor schema). Datacenter lists answer a narrow question: does this address belong to infrastructure that should not originate a consumer ad impression? Pre-bid means the check runs on the bid request, not on the rendered pixel.
The transitional market state matters. IPv4 and IPv6 coexist on residential and wireless interfaces for years. One vendor FAQ walks through a household example: if only 10 percent of impressions behind an IPv4 are invalid, blocking the entire address rejects the other 90 percent. When IPv6 is available for that bad slice, a separate v6 check can block the invalid fraction without touching the rest. That only works if your stack actually reads device.ipv6 and maintains a v6 datacenter feed, not if you treat IPv4 as the only network identity in OpenRTB.
## The mechanism on the bidstream
OpenRTB places both addresses on the same device object. They are optional and independent. An SSP assembling requests from dual-stack CTV hardware may populate one, both, or swap which field reflects the path the ad server saw. Fraud originating from cloud VMs, proxy farms, or misconfigured SSAI often arrives with a datacenter footprint on whichever field your integration ignores.
// Same impression, two network claims
"device": {
"ip": "73.42.18.104", // household NAT, looks residential
"ipv6": "2607:f8b0:4001:c06::65", // may map to hosting range
"ua": "...",
"ifa": "..."
}
// IPv4-only datacenter match: pass (residential range)
// IPv6 datacenter match: no-bid (cloud CIDR hit)
// Check only device.ip: buyer never sees the failure mode
IPv6 adoption is concentrated where CTV lives. Residential ISPs report IPv6 interface adoption above 90 percent in many cases, even while most observed traffic volume is still IPv4. CTV devices behind a single router share one public v4 address; v6 gives per-device granularity that changes both targeting and fraud detection economics. None of that helps if the bidder normalizes everything to v4 or drops requests missing device.ip while silently accepting datacenter v6.
Integration is not a flag flip. One vendor notes that clients may operate separate IPv4 and IPv6 servers for blocking because the address formats and observation points differ. A given IPv4 can map to multiple IPv6 addresses; threat intel may flag specific v6 prefixes while leaving the v4 unlisted to avoid collateral damage. Pre-bid fabric delivery (API, object storage, RTB fabric hooks) must load both weekly datacenter files. Datacenter feeds update on Fridays; checking hourly on Friday is the documented integration pattern when new CIDR files land.
Proxies add a second axis. When an X-Forwarded-For chain is present, datacenter guidance says to treat the leftmost client IP as authoritative for matching, but also to scan other hops in the chain against blocklists even when the client IP is clean. Proxy hops often classify as datacenter or masked IP in post-bid IVT taxonomies. That is adjacent to, not a substitute for, matching device.ipv6 on the OpenRTB object itself.
## What to do
Match datacenter CIDRs against both device.ip and device.ipv6 at pre-bid. Maintain separate v4 and v6 lists; do not assume blocking one protocol covers the other.
Log which field triggered a block. Dashboards that only report "IP block" hide whether v6 coverage is missing. A falling datacenter IVT rate on v4 with flat spend can mean fraud moved to v6.
Do not treat absent device.ipv6 as proof of v4-only supply. Missing fields are common; so is dual-stack hardware that your adapter never forwarded. Sample raw requests in the bid request tester before changing block policy.
Separate datacenter blocks from device reputation thresholds. Reputation feeds use probability scores; datacenter lists are binary CIDR membership. Conflating them in one rule engine makes tuning impossible.
Validate shape before policy. An IPv6 string with wrong formatting never reaches your CIDR matcher. Gate OpenRTB device objects in CI per the validation guide so policy runs on payloads that parse consistently.
## The honest limit
CIDR blocklists are vendor-maintained opinions about hosting ranges, refreshed weekly. They will not catch residential botnets, delisted CTV apps, or spoofed bundle IDs. They also cannot prove an impression rendered on a living-room screen. They close one specific hole: cloud-originated traffic riding the alternate IP field your stack was not checking. During a multi-year dual-stack transition, that hole is large enough to matter in the bidstream even when headline IVT rates look stable on defended campaigns.
## Sources
Field names are from OpenRTB as published by IAB Tech Lab. The analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Pixalate.
Pixalate: Data Center Block List knowledge base (IPv4 and IPv6 feeds, MRC scope, weekly cadence)
Pixalate: Blocking FAQ (dual-stack rationale, 10 percent household example, IPv6 update cadence)
RTBlint: OpenRTB bid request reference (device.ip, device.ipv6)
---
# Fraudulent CTV bundle IDs mimic each platform's ID grammar. OpenRTB validates shape, not spoof. · RTBlint
URL: https://rtblint.org/blog/ctv-fraudulent-bundle-id-platform-mimicry/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## Fraudulent CTV bundle IDs mimic each platform's ID grammar. OpenRTB validates shape, not spoof.
August 19, 2026 · RTBlint
On August 18, a vendor published a mechanics report on the 50 highest-traffic fraudulent Connected TV bundle IDs in its weekly Ad Fraud Indicators of Compromise database. The headline percentages are not a market-wide fraud rate. They describe how those 50 IDs behave: 80 percent of fraudulent Roku bundles spoof a recognizable brand name, 67 percent of fraudulent Fire TV bundles follow native ASIN and .amz suffix conventions, 74 percent of fraudulent Samsung bundles mimic numeric store IDs, and 100 percent of fraudulent Apple TV bundles in the sample also appear on three or more other platforms. Twenty-four of the fifty highest-traffic fraudulent bundle IDs showed up on Amazon Fire TV. The argument is not that CTV is 80 percent fraudulent. It is that spoofers learn each store's ID grammar and write bid requests that look native to automated validators.
## What the sample actually measures
The report ranks bundle IDs by traffic among entries flagged in an open IOC feed updated weekly from buy-side and supply-path observation. That is a curated worst-of list, not a random sample of CTV impressions. The percentages describe patterns within those fifty rows: which spoofing tactic dominates on which operating system, how often the same bundle string travels across platforms, and how many of the top-traffic fraudulent IDs concentrate on Fire TV versus Roku or Samsung.
Flagged bundle IDs, in the vendor's taxonomy, show signs of spoofing known apps, malformed or missing app-store mappings, or platform mismatches. That last category includes mobile bundle IDs appearing in CTV bid streams: a request that claims living-room inventory while carrying a phone app identifier. Impression-level invalid traffic filters may still fire on bot-like behavior downstream. They do not, by themselves, answer whether the bundle field matched the device class, store, and publisher authorization chain before the auction cleared.
Contrast that with delisting risk, which is a different failure mode we covered separately: a bundle that was legitimate and is no longer on a store shelf but still bids. This report is about active spoofing and ID manipulation while the auction is open, not shelf status alone.
## Platform mimicry is the mechanism
OpenRTB treats app.bundle as an opaque store identifier. Validators check that the field exists, that it is a string, that it is not empty. They rarely check whether the string's shape matches the platform implied by device.os , device.make , or the exchange's CTV taxonomy. Fraud operators exploit that gap by copying each ecosystem's native conventions.
On Roku, brand spoofing dominates the fraudulent sample: 80 percent of flagged Roku bundle IDs spoof a specific, recognizable brand, more than on any other platform by percentage. The string reads like a channel a buyer already trusts. On Amazon Fire TV, 67 percent of flagged IDs follow native conventions, including ASIN-style codes and .amz or .amzn suffixes. On Samsung Smart TV, 74 percent mimic the platform's numeric ID format. Each pattern is designed to pass a human glance and a shallow regex.
Multi-platform proliferation is the other signal. Every fraudulent Apple TV bundle ID in the sample also appeared on three or more other platforms, the strongest overlap pattern in the dataset. On Roku, 60 percent of fraudulent bundle IDs were found on three or more other platforms. Real apps sometimes ship on multiple stores under related IDs. Fraudulent IDs reuse the same claim everywhere because the cost of copying a string is zero and each additional exchange is another auction that never compares notes.
// Same bundle string, incompatible stories
Request A (claims Roku):
device.os = "Roku OS"
app.bundle = "41468" // numeric, Roku-native shape
Request B (claims Fire TV, same traffic source):
device.os = "Fire OS"
app.bundle = "B08XYZ1234.amzn" // ASIN mimicry
Request C (claims CTV, mobile bundle):
device.os = "tvOS"
app.bundle = "com.example.game" // phone game ID in CTV stream
// Schema: three valid app objects
// Policy: at most one can be true
Exposure concentration matters for buyers who treat Fire TV as safer because CPMs look stable. Twenty-four of the fifty highest-traffic fraudulent bundle IDs in the sample were identified on Amazon Fire TV. That is not a platform indictment. It is a reminder that high traffic on a spoofed ID flows through whichever exchanges accept the claim without cross-checking store metadata.
## Why format validation is not enough
Supply-path tooling already checks app-ads.txt against schain nodes, sellers.json, and MFA lists. Those checks assume the bundle identifies an app the authorization file was written for. Spoofing breaks the assumption without breaking the file format: a bundle that mimics a major brand may still resolve to a developer domain nobody recognizes, or to a missing mapping the bidder never fetches.
Blocklists keyed on bundle plus platform close part of the gap by excluding known-bad pairs before pricing. They are reactive. Mimicry is generative. New IDs appear faster than any weekly top-fifty feed rotates, especially when the spoof copies legitimate formatting.
The durable check is consistency across fields, not string shape alone:
Does app.bundle match the store format for the declared device.os and device class?
Does the same bundle appear on multiple platforms in your logs with incompatible device claims in the same week?
Does app.storeurl resolve to a live listing whose bundle matches the request?
Does the first payment hop in schain appear in app-ads.txt for that exact bundle, not a lookalike string?
Mobile bundle IDs in CTV streams are the blunt case. A phone game identifier in a request labeled tvOS or Roku OS is not a subtle spoof. It is a category error that should fail before app-ads.txt is consulted. Many integrations never emit that comparison because each field validated independently passes.
## What to do
Log bundle, platform, and device class together. Spoof detection starts when you can pivot on app.bundle across exchanges and see incompatible device.os values in the same hour.
Reject cross-platform duplicates with conflicting device claims. If the same bundle bids as Roku and Fire TV and Apple TV, at least two requests are lying.
Fetch store metadata on ingress for high-CPM CTV paths. A numeric Samsung-shaped ID should resolve to Samsung's catalog API or your vendor equivalent before the request reaches open auction.
Layer IOC feeds under consistency rules, not instead of them. Weekly top-fifty lists catch known high-traffic bad IDs. Mimicry checks catch the next ASIN-shaped string before it hits the list.
Validate bid request shape in CI. Paste production CTV requests into the bid request tester and gate app.bundle presence and type per the OpenRTB validation guide . RTBlint checks malformed or inconsistent payloads. It does not detect fraud or label a bundle spoofed. It catches missing bundle fields and structural drift that prevent your own consistency rules from running at all.
## The honest limit
The percentages in the August report describe tactics within a vendor-maintained IOC sample, not a census of programmatic CTV. They are still useful because they name the spoofing strategies your validators must anticipate: brand mimicry, native format mimicry, and cross-platform copy-paste. No single field in OpenRTB v2.x attests that a bundle is canonical for the platform. Until store attestations ride in the bid request, the work stays on the buyer and seller to compare claims against each other and against live metadata.
## Sources
Field names are from OpenRTB as published by IAB Tech Lab. The analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Pixalate.
Pixalate: July 2026 CTV Bundle ID Fraud Mechanics report, August 18, 2026
Pixalate AdFraud IOC-DB: fraudulent CTV bundles watch list
RTBlint: OpenRTB supply chain trust stack
---
# A CTV app delisted from the store can still bid. The auction keys on bundle ID, not shelf status. · RTBlint
URL: https://rtblint.org/blog/delisted-ctv-apps-prebid-blocklist-gaps/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## A CTV app delisted from the store can still bid. The auction keys on bundle ID, not shelf status.
August 16, 2026 · RTBlint
On August 14, a vendor published an expanded CTV app pre-bid blocklist built from daily monitoring of 378,622 app-platform pairs across nine operating systems, covering 52,102 unique apps. One of nine risk reason codes is delistedApp : apps removed from official stores that continue to generate ad traffic. That code exists because the programmatic path and the app store path diverge. A bid request can look well formed while the inventory it claims no longer exists on any shelf buyers could verify.
## What the auction actually sees
OpenRTB identifies application inventory through app.bundle , the store identifier, and optionally app.storeurl , app.name , and app.publisher . None of those fields assert that the app is currently listed, maintained, authorized in app-ads.txt, or compliant with store terms. They are claims about identity, not about eligibility.
Delisting is a store-side event. A Roku channel pulled for policy violation, a Fire TV app abandoned after three years without an update, an Android TV package removed from Google Play: each removes the public proof that the app is a legitimate publisher surface. Devices that already installed the app, sideloaded builds, and fraud operators spoofing bundle IDs can still emit bid requests. SSPs and exchanges that do not reconcile bundle against live store metadata will keep auctioning the name long after the store stopped standing behind it.
That is not a hypothetical edge case in the August blocklist announcement. The delistedApp reason code is explicit: apps removed from app stores that continue to generate ad traffic. The same feed also flags missing app-ads.txt (inventory generating impressions without an authorization file), abandoned apps (no developer update in three or more years), apps with General Invalid Traffic above 5 percent or Sophisticated Invalid Traffic above 15 percent over a rolling three-month window, and made-for-advertising placement patterns. Delisting sits beside IVT thresholds, not inside them.
## Why impression-level IVT misses it
The announcement draws a line the industry has been blurring: app-level structural risk versus impression-level invalid traffic classification. Under Media Rating Council guidance on invalid traffic detection and filtration, known dangerous or fraudulent sources can be handled as lists separate from per-impression measurement. Impressions from apps on a high-risk list are not automatically counted as IVT; IVT applies when impression-level invalid signals fire on that specific event.
That separation matters for buyers who treat a low post-bid IVT rate as proof of clean supply. A delisted app can still serve real devices with real IPs. The fraud is in the inventory claim, not necessarily in every beacon. Waiting for impression-level classification means paying for some fraction of requests before the pattern shows up in post-bid filters, and it means conflating two decisions: whether this app should ever be in the auction, and whether this particular impression looks bot-like.
Pre-bid blocklists invert the order. Exclude flagged bundle and store pairs before pricing. The August feed ships daily through RTB fabric APIs, FTP, and object storage, keyed by bundle ID with platform metadata and one or more reason codes per row. Buyers can block all nine codes or only delisted and missing app-ads.txt if that matches their compliance posture.
## The mechanism on the bidstream
Supply-path checks most teams already run, ads.txt and app-ads.txt against schain nodes, sellers.json lookups, MFA domain lists, do not ask whether the bundle is still published. A delisted app can fail app-ads.txt for a different reason (missing file) or pass authorization on a domain while the store listing is gone. The blocklist is an orthogonal signal: store and compliance telemetry merged into an app ID deny list.
// Typical CTV bid request fragment
"app": {
"bundle": "com.example.streamtv", // identity claim
"storeurl": "https://...", // may 404 after delisting
"publisher": { "id": "..." }
}
// Nothing here answers: is this bundle live in the store today?
// Pre-bid blocklist: match bundleId + platform → delistedApp → no-bid
SSPs can enforce at ingress: drop requests whose bundle-platform pair appears on the feed. DSPs can filter in the bidder before sending a seatbid. Exchanges sitting in the middle need a policy for whether they pass reason codes downstream or silently suppress. Either way, the fix is upstream of creative delivery; no VAST validator on the response side learns that the app should not have been in the auction.
Coverage is uneven by platform. The source notes that risk type coverage differs across CTV operating systems based on each platform's transparency and metadata availability. Roku, Fire TV, Samsung, Apple TV, LG webOS, and others do not expose the same store APIs. A blocklist is only as current as the vendor's crawl cadence. That is still faster than discovering delisted inventory through monthly IVT reconciliation.
## What to do
Subscribe to an app-level deny feed if you buy CTV programmatically. Impression IVT and app blocklists solve different failures. You need both if delisted and unauthorized apps are in your supply mix.
Log app.bundle and platform on every CTV request you sell. When a buyer disputes inventory, you cannot correlate to a blocklist row without those fields populated consistently across resold paths.
Cross-check app-ads.txt on ingress, not only in quarterly audits. Missing app-ads.txt is its own reason code in the same schema; unauthorized and delisted often overlap in the wild.
Validate shape before policy. A blocklist match on a malformed bundle string is useless. Paste production CTV requests into the bid request tester and gate app.bundle presence in CI per the OpenRTB validation guide .
Split reporting: app-level blocks versus impression IVT. If your dashboard merges them, a falling IVT rate can hide rising structural risk as fraud concentrates on unblocked apps.
## The honest limit
A blocklist is a vendor-maintained opinion with thresholds (5 percent GIVT, 15 percent SIVT, three-year abandonment) you may disagree with. It does not replace schain authorization or your own MFA policy. It closes a specific hole: inventory that should not exist in the market anymore but still speaks OpenRTB fluently.
## Sources
Field names are from OpenRTB as published by IAB Tech Lab. The analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Pixalate.
Pixalate: Programmatic CTV App Pre-Bid Blocklist expansion, August 14, 2026
IAB Tech Lab: ads.txt and app-ads.txt
RTBlint: OpenRTB supply chain trust stack
---
# OpenRTB has two JSON encodings, and ARTF's own sample corpus uses both · RTBlint
URL: https://rtblint.org/blog/openrtb-two-json-dialects/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Agentic
## OpenRTB has two JSON encodings, and ARTF's own sample corpus uses both
August 14, 2026 · RTBlint
Ask an OpenRTB engineer what imp.secure holds and you get 0 or 1 , because that is what the specification says. Ask someone who compiled the IAB's OpenRTB protobuf schema and you get true or false , because that is what the proto declares. Both are right about their own transport. The problem is that the payload carries no marker saying which one it is, and one of the two is unparseable to the other side.
## The divergence is 28 fields wide
The OpenRTB specification types a family of flag fields as integers with the value set {0, 1} . The protobuf schema in com.iabtechlab.openrtb.v2 , which is what every gRPC bidstream integration compiles against, declares them bool . Diffing the two mechanically, object by object and field by field, produces 28 disagreements:
Object Fields the proto declares bool and the spec types integer
Imp secure, instl, clickbrowser, rwdd
Banner topframe, vcm
Video skip, boxingallowed
Audio stitched
Pmp private_auction
Site mobile, privacypolicy
App paid, privacypolicy
Content livestream, sourcerelationship, embeddable
Device dnt, lmt, js, geofetch
UserAgent mobile
Regs coppa, gdpr
Source fd
SupplyChain complete
SupplyChainNode hp
SeatBid group
These are not obscure corners. regs.coppa and regs.gdpr are regulatory signals, imp.secure decides whether a creative can load, pmp.private_auction decides whether an auction is open or closed, and schain 's complete and hp are the fields the whole supply chain check rests on.
## Neither encoding is a bug, which is what makes it expensive
The protobuf JSON mapping has no integer-to-bool coercion. A bool field accepts the literals true and false and nothing else, so "coppa": 0 does not become false . It fails the unmarshal, and it fails it for the whole message rather than the one field. One stray flag drops the entire request.
Going the other way, a typed JSON consumer reading "secure": true against the specification's own types rejects the value or, worse, binds it to a default and carries on. The reported error in both directions is a plain type mismatch, which sends the reader to check a serializer that is working correctly. The mistake is never in the code that produced the payload. It is in the assumption about who is going to read it.
There is a quieter version of the same problem in the field names. Protobuf JSON emits lowerCamelCase unless the serializer asks for proto names, so private_auction serialises as privateAuction and us_privacy as usPrivacy . A protobuf reader accepts both spellings, so a protobuf-to-protobuf hop works and nothing complains. Hand that payload to a JSON consumer and the field is not wrong, it is absent: a private auction reads as an open one and a privacy string goes unread, with no error anywhere.
## ARTF is where the two encodings meet
The Agentic RTB Framework carries an OpenRTB payload inside a protobuf envelope and hands it to an agent, which proposes mutations back. We wrote in July about the gap that nothing in the framework checks whether the mutated auction is still valid OpenRTB. The dialect split is the layer underneath that: before anyone can check a mutation, both sides have to agree on what the payload even says.
The reference implementation ships five sample envelopes. Validated as protobuf JSON, which is what the framework transports, two of them cannot be parsed at all:
samples/multi-impression.json 4 errors
bid_request.device.js 1 protojson wants true
bid_request.regs.coppa 0 protojson wants false
bid_request.regs.gdpr 0 protojson wants false
bid_request.source.fd 1 protojson wants true
samples/native-ad.json 2 errors
bid_request.device.js 1
bid_request.regs.coppa 0
The other three samples are protobuf JSON and are correct as such. samples/video-deals.json writes "private_auction": true , "livestream": false , and "coppa": false , which is exactly right for the transport and exactly wrong if you read the same file as an OpenRTB bid request. Run it that way and four fields fail in the opposite direction.
So the corpus does not have a bug in it. It has both encodings in it, in different files, with nothing marking which is which. That is what an undeclared dialect looks like once a specification has more than one implementation. A patch fixing the sample encodings is open upstream as PR #13 .
Two smaller divergences sit alongside it, both between the ARTF v1.0 document and the .proto in the same repository. The document's worked examples write "intent": "activateSegments" , "op": "add" , and a "value": { "IDsPayload": [...] } wrapper; the proto defines ACTIVATE_SEGMENTS , OPERATION_ADD , and top-level oneof members. And the document's illustrative message block numbers tmax as field 6 and ext as field 3, where the proto uses 3 for tmax and 6 for originator . Anyone generating code from the document rather than the file produces something the reference server cannot read.
## What to do about it
Decide the dialect per hop, and write it down. The payload will not tell you. A JSON exchange boundary is spec JSON; a gRPC extension point is protobuf JSON. The conversion belongs at the boundary, once, not scattered through whichever field handler noticed first.
Set UseProtoNames when you serialise. ARTF's own Go server does. Camel-cased field names survive a protobuf hop silently and vanish at the first JSON one.
Validate the sample corpus in CI, whatever the specification. Both defects here are the kind a strict unmarshal catches on every commit and a code review catches never, because the payload looks right in both dialects to a reader who knows only one.
Do not let a type error stand in for a dialect error. "Expects integer but received boolean" sends an engineer to audit code that is correct. Naming the other encoding gets the fix right on the first try.
## Both dialects, in the validator
RTBlint 0.8.0 validates against a declared dialect rather than assuming one. openrtb.dialect.bool_for_integer fires when protobuf flags arrive in spec JSON, openrtb.dialect.integer_for_bool when spec flags arrive in protobuf JSON, and openrtb.dialect.camel_case_name on the silent one. Each names the other encoding and the value to send instead.
ARTF payloads need no flag: an envelope is protobuf JSON by construction, so --type artf-request validates the envelope and everything it carries in the right dialect, and --type artf-response checks a mutation set against the auction it targets.
rtblint validate --dialect proto-json bid-request.json
rtblint validate --type artf-request rtb-request.json
rtblint validate --type artf-response --apply --request rtb-request.json rtb-response.json
The same checks run in the browser tester , over MCP as tools an agent can call on its own output before it answers, and over gRPC, which is where an orchestrator wants them, since ARTF already has the connection open.
## Further reading
ARTF explained: the Agentic RTB Framework and where it sits in the auction
ARTF lets agents rewrite the bid request in flight. Nothing in it checks the result.
The diagnostic code reference, including every ARTF and dialect finding
IABTechLab/agentic-real-time-framework: specification, protobuf definitions, and sample payloads
---
# SupplyChain v1.1 adds nodes that never touch the money. Most schain checks assume those cannot exist. · RTBlint
URL: https://rtblint.org/blog/supplychain-1-1-hp-zero-nodes/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Supply chain
## SupplyChain v1.1 adds nodes that never touch the money. Most schain checks assume those cannot exist.
August 8, 2026 · RTBlint
The SupplyChain object has been frozen at version 1.0 since 2019, which is long enough that a lot of production code treats its rules as facts about the world rather than facts about one published document. SupplyChain v1.1 is in public comment until August 21, and the single change at its center invalidates the most common of those assumptions: that every node in the chain is in the payment flow. Under 1.1 a node can declare that it handled the request and was never paid for it.
## What 1.0 actually says about hp
The hp field on a SupplyChainNode is defined as an integer indicating whether this node will be involved in the flow of payment for the inventory: 1 for yes, 0 for no. It is required. And then the specification adds the sentence that has shaped every implementation since: for version 1.0 of SupplyChain, this property should always be 1.
So the field is a boolean whose only legal value is true. The original design reserved the flag for exactly the case now arriving, which was foresight rather than an oversight, but for six years it has carried no information. Builders hardcode it, validators assert it, and buy-side audit logic walking the chain against sellers.json treats every node as a seller account it can look up, because in a 1.0 chain every node is.
The result is a chain that describes the money and nothing else. A bid request that passed through a header bidding wrapper, a publisher ad server, an SSAI stitcher and two SDKs arrives with a two-node chain, and both nodes are payment nodes. Four systems took custody of the payload and none of them are named anywhere in it.
## What v1.1 proposes
IAB Tech Lab announced the proposal on June 23, 2026 and opened it for comment through August 21. The OpenRTB Working Group considered several shapes and recommended the one that changes the least structurally: custody-taking entities go into the same nodes array as everyone else, marked hp=0 . There is no parallel array, no new object, no extension field. The chain gets longer and one flag starts meaning something.
The systems the announcement names as custody takers are the plumbing everybody already runs and nobody currently discloses: Prebid, ad servers, server-side ad insertion platforms, SDKs and wrappers. Read against a 1.0 chain, the new version is meant to let a buyer separate three things that are collapsed today: where the request originated, which systems handled it in flight, and which companies get paid.
The accompanying changes are the interesting part for anyone parsing this. Per the public comment issue in the Supply-Chain-Validation repository, the proposal revises the SupplyChain object description in OpenRTB, adds new enumerations for complete so the flag can express a 1.1 chain's notion of completeness, moves implementation guidance out of the OpenRTB page and into the dedicated repository, deprecates the original Supply Chain Object page, and updates sellers.json wording around the INTERMEDIARY seller type and the is_passthrough parameter.
One clause matters more than the rest for anyone who runs authorization checks: hp=0 nodes are not expected to pass ads.txt validation. Referencing a sellers.json entry for a non-payment handler is described as strongly recommended, not required. A custody node is a disclosure, not an authorization claim, and treating it as one will reject good supply.
## The checks whose meaning changes
If you validate schain today, some of what you check is structural and survives, and some of it is a 1.0 assumption wearing a rule's clothing. The split:
Check Under 1.0 Under a 1.1 chain
hp present and equal to 1 Correct. The spec says it should always be 1. Wrong half the time. Presence is still required; the value is now real data.
ver equals "1.0" Correct. 1.0 was the only published version. A 1.1 chain fails a check that only accepts the old string, and the usual failure mode is a silent drop rather than a loud reject.
Hop count and path length policies Chain length approximates the number of intermediaries taking margin. Chain length now mixes payment hops and custody hops. Count hp=1 nodes if the policy is about money.
Every node resolves in sellers.json Reasonable, since every node is a seller account. Too strict. A sellers.json reference on a custody node is recommended, not guaranteed.
ads.txt authorization per node Applied chain-wide. Applies to the payment path. Running it on hp=0 nodes manufactures violations.
Adjacent duplicate detection Catches a forwarder that appended its node twice. Still valid, and more load-bearing: more appenders means more chances for two systems to write the same hop.
complete is 1 Binary. The chain covers the whole path back to the publisher or it does not. New enumerations are proposed, so the flag stops being a plain boolean. Read the final text before branching on it.
RTBlint reports openrtb.schain.node.hp_missing when a node omits the flag, and the current guidance text says outright that in SupplyChain 1.0 chains it should be 1. That sentence has a shelf life now. The check itself does not change: hp is required on every node in both versions, and a builder that leaves it optional is the bug either way. What changes is that setting it correctly starts requiring the builder to know what its own system does.
Same story for openrtb.schain.ver_unexpected , which today flags anything other than "1.0" on the grounds that 1.0 is the only version ever published. That is true until it is not, and the transition period is where it gets expensive: a receiver that drops chains with an unrecognised ver will silently stop auditing the supply paths of every partner who adopts the new version first.
## A chain before and after
A CTV request that moved through a publisher ad server, an SSAI platform and an exchange discloses two nodes today, because only two of those three get paid:
1.0
{ "ver": "1.0", "complete": 1, "nodes": [
{ "asi": "pubadserver.example", "sid": "8842", "hp": 1 },
{ "asi": "exchange.example", "sid": "pub-42", "hp": 1 }
]}
1.1 (proposed shape)
{ "ver": "1.1", "complete": 1, "nodes": [
{ "asi": "pubadserver.example", "sid": "8842", "hp": 1 },
{ "asi": "ssai.example", "sid": "net-19", "hp": 0 },
{ "asi": "exchange.example", "sid": "pub-42", "hp": 1 }
]}
Three consequences fall straight out of that diff. A supply path optimization model that scores paths by length now sees a longer path for the same inventory, and will penalise the more honest disclosure unless it filters on hp first. Duplicate bid detection gets better, because the same request arriving through two routes now carries evidence of which systems it crossed. And an authorization check that walks all three nodes against ads.txt finds one that was never supposed to be there.
The Trade Desk's Rob Hazan framed the tradeoff in the announcement: a longer chain that accurately discloses the parties involved is better for buyers than a short chain that hides information. That is the right principle, and it only holds if the buy-side logic reading the chain stops treating length as a proxy for extraction.
## The limits of reading a chain
Schain attracts more claims than it can support, so it is worth being exact about what a parser reading a bid request can decide. It can decide the structural questions: that ver is a recognised value, that complete carries a defined enumeration, that every node has a non-empty asi and sid , that hp is present and is 0 or 1, that no two adjacent nodes are identical, that the object sits at source.schain rather than the pre-2.6 source.ext.schain .
Whether the disclosure is true is a different question, and the payload has no way to answer it. Nothing proves that the SSAI platform in position two handled the request, or that a system handled it and appended nothing. That work happens in sellers.json crawls, ads.txt authorization and out-of-band audit, none of which v1.1 touches. What v1.1 gives you is the vocabulary for telling the truth, which is worth having and entirely separate from getting anyone to use it.
## What to do before August 21
Grep for the hardcoded 1. Every schain builder in your stack that writes hp: 1 as a literal is now writing a claim it has not evaluated. Decide per system whether it is in the payment flow, and make the answer a configuration value rather than a constant.
Find every place that compares ver to a string. Accept 1.1 and read it, or reject it loudly with a logged reason. The failure you cannot afford is the third option, where an unrecognised version routes the chain into an unhandled branch and the request goes on without it.
Split hop counting from money counting. Any policy expressed as "reject chains longer than N" needs to state which N it means before longer chains start arriving.
Scope ads.txt checks to hp=1 . Custody nodes are not authorization claims. Running the authorization path over them produces violations that are artifacts of your own reader.
Comment if you build this. The public comment issue in the Supply-Chain-Validation repository carries sub-issues for the open questions, which is a better place to raise a parser-level objection than a support ticket in six months.
The mechanical version of the first two is one call: paste a bid request into the tester , run the CLI over a corpus of what you actually emit, or give an agent the MCP server so it checks its own output. Field context for the surrounding machinery is in the supply chain reference and the supply chain trust stack .
## Sources
IAB Tech Lab: SupplyChain v1.1 transparency upgrade, announced June 23, 2026, public comment through August 21, 2026
InteractiveAdvertisingBureau/Supply-Chain-Validation issue #1: schain 1.1 public comment, the OpenRTB and sellers.json edits, and the sub-issues under discussion
OpenRTB SupplyChain object 1.0: field definitions for ver, complete, nodes, asi, sid, rid, name, domain and hp
MarTech: coverage of the custody disclosure model and its supply-path implications
---
# The agentic protocols shipped a version handshake. A bid request still has nowhere to say which OpenRTB it is. · RTBlint
URL: https://rtblint.org/blog/agentic-version-negotiation-openrtb-gap/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Agentic
## The agentic protocols shipped a version handshake. A bid request still has nowhere to say which OpenRTB it is.
August 8, 2026 · RTBlint
The agentic layer spent the last ten days doing something the bid stream has never done: arguing about versions in public, on the wire, at request time. AdCP 3.1 requires a version on every message and returns a typed error when the two sides disagree. AAMP 2.3 put trust verification on the paths that move price. Meanwhile OpenRTB is ten dated snapshots into 2.6 and still has no field anywhere in a bid request that says which of them the payload conforms to. That asymmetry stops being academic the moment an agent sits between the publisher and the bidder.
## What actually shipped
AAMP 2.3 went out July 30. The headline items are operational rather than protocol surface: the IAB Diligence Platform and SafeGuard Privacy embedded as approval gates inside the Buyer Agent, deterministic negotiation guardrails, server-side trust verification on price-moving paths, deployment targets on Amazon Bedrock AgentCore and Databricks, and Agentic Audiences v1.0 declared ready for transactions. The Agentic RTB Framework, the piece that actually touches the auction, continues under the Agentic Task Force rather than landing finished in this release.
AdCP has been shipping continuously through the same window. 3.1 is additive over 3.0 and the patch line has not stopped: v3.1.9 on August 3, v3.1.10 on August 4, v3.1.11 on August 7, v3.1.12 on August 8. The release notes describe 3.1 as production-hardening for real agent operations, which is a polite way of saying the gaps were found by running buys against real publishers.
And the sell side opened the auction itself. In the first week of August, Magnite described two routes for partner AI models to operate inside its SSP auction, PubMatic shipped guardrails that block agents from buying unapproved inventory, and Prebid.js landed a DevTools MCP module that lets an agent read live auction data. Three different answers to the same question, which is where a model gets to sit relative to the request.
## The handshake AdCP 3.1 built
Read the 3.1 wire rules next to OpenRTB and the contrast is hard to miss. Four mechanisms, none of which have an equivalent in the bid stream:
Mechanism What it does OpenRTB equivalent
adcp_version on every request and response Buyer states the release it wrote against; seller echoes the release it actually served, at release precision, so "3.1" is on the wire and "3.1.2" is not. None. A bid request carries no version field at all.
supported_versions on capabilities Discovery: a caller can ask what a counterparty speaks before speaking it. An onboarding PDF and a shared assumption.
Typed VERSION_UNSUPPORTED A mismatch produces a specific error with structured data naming the versions that would work. A field the receiver does not recognise, dropped without a signal. See what happens on a mismatch .
idempotency_key required on every task request Reads and writes alike, with staged enforcement: 3.1 sellers should reject reads that omit it, 3.2 will mandate rejection. BidRequest.id , which is a correlation id, not a replay guard.
There is a fifth item worth reading if you implement an AdCP surface, because it inverts a habit: 3.1 flattened the MCP envelope so envelope and body fields are siblings at the root, and it requires servers to tolerate envelope fields they do not know. Strict validation is explicitly non-conformant. The release notes name the offenders directly: FastMCP strict modes, Pydantic .strict() , OpenAPI codegen that emits additionalProperties: false . If you generated a client from a schema and turned strictness on because that is what careful people do, you built a non-conformant client.
## Why OpenRTB never needed one, and why that changed
The bid stream got away without version negotiation for a good reason: the population of counterparties was small, the integrations were bilateral, and both sides had a human relationship before they had traffic. You agreed on 2.5 in a kickoff call, you built to it, and a mismatch surfaced as a support thread. The protocol did not need to carry the answer because the answer lived in a contract.
Dated snapshots broke the last part of that. There are ten dated 2.6 releases now, and 2.6-202204, 2.6-202501, 2.6-202505 and 2.6-202606 are all correctly described as "OpenRTB 2.6" while carrying different field sets. Two systems can agree on the version in writing, both be telling the truth, and still disagree about whether a field exists. We wrote about the mechanics in how OpenRTB ships now and the June snapshot specifically in the 202606 field-by-field .
Now add an agent. ARTF has agents mutating a live payload in the auction path with a typed intent, an operation and a path, which we walked through in the mutations post . The mutation vocabulary is precise. The thing it is mutating is a document whose version was agreed somewhere the agent cannot read. An agent that adds a field introduced in the June snapshot to a request destined for a bidder pinned to the January one has produced a payload that is valid against a spec and unparseable by its recipient, and nothing in the exchange between them will say so.
The failure is quiet by design. Unknown fields are ignored, that is the extensibility contract, and it is the right contract for a protocol that has to evolve without flag days. It is a bad contract for a system where the writer is a model that will happily produce a plausible field name and receive no feedback that it invented one.
## What a pinned snapshot looks like in practice
You cannot add a version field to OpenRTB from your side of an integration, but you can stop treating the version as tribal knowledge. Three things, in order of how much they buy you:
Pin a snapshot per counterparty, in configuration. Not in a wiki, not in the head of the person who ran the integration. If your validator can be pointed at a version, the pin becomes an artifact you can diff when a partner upgrades.
Validate at every boundary that can rewrite the payload. Publisher emit, wrapper exit, agent mutation, exchange forward. Each of those is a place where a field can appear that the next hop does not know, and the cost of finding out later is a spend line nobody can explain.
Log what you dropped. A receiver that silently ignores unknown fields is conformant. A receiver that ignores them and counts them is conformant and debuggable, and the count is the closest thing to a version mismatch alarm that OpenRTB permits today.
For agents specifically, the useful move is to give the model the check rather than the documentation. An agent with a validator available as a tool can verify its own mutation against the snapshot the host actually runs, before the response goes back. That is one call to the MCP server , or the CLI in the same container, or the tester when a human is debugging what an agent produced.
## The part worth borrowing
None of this is an argument that AdCP is the better protocol or that OpenRTB should adopt its release cadence. They solve different problems and the bid stream's constraints, single-digit millisecond budgets and enormous fan-out, are exactly the constraints that make a negotiation round trip expensive.
But the design decision underneath the AdCP handshake transfers cleanly, and it costs nothing at runtime: make the version an explicit, machine-readable part of the exchange rather than an assumption held by both parties. Even one field on the envelope, stating the snapshot the sender built against, would convert a class of silent field-dropping into a loud error at integration time. Until something like that exists, the pin lives in your config and the check lives in your pipeline, and the only alternative is finding out from a revenue report. Field-level context on the standards around this is in IAB Tech Lab's agentic standards and the AdCP to OpenRTB mapping .
## Sources
AdCP release notes: 3.1.0 version negotiation, idempotency requirements, envelope flattening, and the 3.1.x patch line through August 2026
adcontextprotocol/adcp releases: v3.1.9 through v3.1.12, August 3 to August 8, 2026
IAB Tech Lab: AAMP 2.3, July 30, 2026, including privacy diligence gates and server-side trust verification on price-moving paths
PPC Land: the August 3 to 8, 2026 week in digital advertising, including the Magnite, PubMatic and Prebid.js agent integrations
OpenRTB 2.6: the BidRequest object, and the absence of a version field on it
---
# CTV runs at 65 percent of commercial capacity. Part of that gap is demand that could not read the request. · RTBlint
URL: https://rtblint.org/blog/ctv-capacity-gap-bid-request-quality/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## CTV runs at 65 percent of commercial capacity. Part of that gap is demand that could not read the request.
July 31, 2026 · RTBlint
Omdia published Video Advertising KPI Benchmarks: Monetization on July 29. Ad-supported CTV could average $0.21 per hour of viewing if every available slot were sold; services are running at roughly 65 percent of commercial capacity and 32 percent of the regulatory ad capacity broadcast linear is permitted. The prescription is to grow the advertiser base to maximise fill rates and to improve advertising context protocols. The second half of that sentence is a bidstream statement, and it is the half nobody is going to write a trade headline about.
## A fill rate cannot tell you why
Unfilled is one bucket in a seller's report and at least four different events in reality. Nobody wanted the impression at the floor. Somebody wanted it and ran out of time. Somebody wanted it and could not confirm who was selling it. Somebody wanted it and dropped the request before it ever reached a pricing model, because a field was missing, malformed, or carried a value their integration does not recognise.
Those are not the same problem and only one of them is solved by adding advertisers. OpenRTB has a mechanism for separating them: BidResponse.nbr , the no-bid reason code. It is optional, it is unevenly populated, and most exchanges do not pass it back to the seller in a form anyone reads. Where it is available, three values do most of the diagnostic work.
nbr 2 Invalid Request
The bid request failed the bidder's own validation. This is
demand that exists, refusing inventory it cannot parse.
nbr 6 Unsupported Device
Often a device the buyer would happily buy, described in a way
their device taxonomy does not resolve.
nbr 15 Insufficient Auction Time
Not enough of tmax left by the time the request arrived. A path
problem that reads as a demand problem in every report above it.
nbr 16 Incomplete SupplyChain
schain.complete != 1. The buyer cannot establish authorisation,
so the answer is no regardless of how much they want the spot.
None of those four are cured by onboarding another DSP. Three of them get worse as you add hops. If your unfilled bucket is not split by nbr , the 35 percentage points Omdia measured are unattributed in your own data too. Our low fill diagnostic order and the no-bid reason code guide cover the triage.
## The two percentages describe different problems
Worth separating before drawing conclusions from either. Sixty-five percent of commercial capacity is a fill number: the slots are on sale and they do not sell. Fixing that alone is about one and a half times, not the two to three the report projects.
Thirty-two percent of linear's regulatory ceiling is a load number: streaming simply runs fewer ad minutes per hour than a broadcaster is legally allowed to. The rest of the upside lives there, and it means more ad slots per viewing hour rather than better fill on the slots that already exist.
For a bidstream, more slots per hour means one specific thing: more pods, and deeper ones. Which is unfortunate, because pod requests are the most structurally complex requests OpenRTB has, and the slot most likely to go unsold is the one whose request is most likely to be wrong.
## Pod fields are where CTV requests break
Every field below arrived in OpenRTB 2.6. Each one exists on both imp.video and imp.audio , and each one is capable of producing a request that is internally inconsistent without being syntactically invalid.
podid Ties the imps of one break together. Every imp in the pod
must carry the same value. Different values across the
break means the buyer sees unrelated impressions and
competitive separation logic has nothing to work with.
podseq Position of the pod in the stream. -1 last, 0 any, 1 first.
slotinpod Position the seller can guarantee within the pod.
-1 last, 0 any, 1 first, 2 first or last.
Replaces the deprecated video.sequence. Sending both,
or sending sequence alone, is a live source of confusion.
poddur Total seconds to fill for a dynamic pod.
maxseq Maximum number of ads in that pod.
Dynamic pods need both. Sending poddur without maxseq
leaves the buyer unable to size a bid to the break.
rqddurs Array of exact durations the seller accepts.
MUTUALLY EXCLUSIVE with minduration and maxduration.
Sending all three is the single most common pod error,
and the resolution is bidder-specific, which means the
same request produces different behaviour per buyer.
mincpmpersec Duration-based floor. A floor expressed per second and a
floor expressed per impression are different numbers, and
a bidder that reads the wrong one either overbids or
filters the imp out before pricing.
The pattern across all of them is the same. None of these produce a parse failure. They produce a request a bidder can read and cannot act on with confidence, and the safe response to a request you cannot act on with confidence is to pass. Full field detail is in the CTV bid request reference , and the pod mechanics in CTV pod bidding .
## The new capacity lands on enums that moved two weeks ago
Here is the part that connects the two halves of this. The load headroom is not going to come from more mid-rolls. Ad-supported tiers compete with an ad-free tier of the same service, and tripling mid-roll minutes is a churn experiment nobody wants to run. It comes from the CTV Ad Portfolio formats: pause, screensaver, overlay, squeezeback, in-scene, plus QR codes on any of them. IAB Tech Lab finalised the signaling guidance for those on July 22.
Those formats are described in a bid request by integers that were added to AdCOM on July 16, in release 1.0-202607.
video.plcmt 5 Pause 6 Screensaver 7 Overlay
8 Squeezeback 9 In-scene
video.pos 8 through 17 (partial screen, corners, frame,
double box, L shape, reversed L shape)
video.playbackmethod 8, 9 initiated by user pausing content
10, 11 initiated by idling
imp.video.battr 19 contains advertiser QR code
21 static visual 22 limited motion
23 full-motion video
A buyer whose value sets predate that release rejects every one of these. Not with an error a seller sees. With a no-bid, or with an nbr of 2 if the seller is lucky enough to receive one.
So the sequence is: the industry identifies its growth in new formats, standardises the signals for them, and every integration that has not refreshed its enum tables since mid-July filters that inventory out on arrival. In the seller's report, that is unsold. In Omdia's framing, it is part of the 35 points. It is not a demand shortfall at all, it is a version skew, and it resolves on a schedule set by whoever updates their catalogue last.
We are not throwing stones from a distance here. Our own value sets predated 202607 and failed valid pause-ad requests until we shipped the update, which we wrote up in full including the four errors we were producing. That post also covers the Content object field names that are wrong in both current tagged AdCOM releases, which is worth reading before you regenerate anything from a tag.
## What actually gets a CTV request filtered before pricing
Ranked by how often we see it, and restricted to things a seller controls.
video.placement sent without video.plcmt . placement has been deprecated since 2.6-202303. Buyers who have completed the migration read plcmt and find nothing, which reads as unclassified inventory rather than as instream CTV. Send both while partners finish; never send only the old one. Background in placement vs plcmt .
A thin or absent content object. Content-level targeting is most of what a CTV buy is. Without content.genre , content.title , content.series , content.cat with a cattax , and content.livestream , a premium episode and an unlabelled loop are the same request. Note that content.livestream was redefined in 2.6-202606, covered in live event ad insertion .
Missing device.ifa with no lmt to explain it. No identifier means no frequency management, and frequency is the complaint every CTV buyer has. Absent-with-a-reason and absent-with-no-reason are treated very differently on the buy side.
Inconsistent app.bundle across exchanges. The same CTV app reaching a buyer under three different bundle identifiers through three paths is three separate blocklist and allowlist entries, and the two the buyer has not whitelisted look like unsold inventory.
schain.complete not equal to 1. An incomplete chain is nbr 16 at a growing number of buyers, and it is a hard filter rather than a discount.
tmax that does not survive the path. Every hop consumes budget. A request that arrives at the bidder with 40 milliseconds left is nbr 15, which is indistinguishable from disinterest in any report that does not carry the code. See tmax and timeouts .
## Another classification layer arrives in eight days
The IAB Redefining Media Types standard is in public comment until August 8, 2026. It is explicitly designed to be encoded into OpenRTB bid requests, and its impression-level attributes map onto fields that already exist: the sound-state attribute lands on playbackmethod , which is one of the lists whose definitions were reworded on July 16 while the comment window was open.
The premise of RMT is sound. Buyers and sellers describe video inventory in incompatible vocabularies and a shared classification would help. The risk is the ordinary one for this industry: a new layer of meaning landing on fields that are populated inconsistently underneath, adding a second thing that can be wrong rather than fixing the first. Detail in our RMT walkthrough .
## What to do this quarter
Split unfilled by nbr before you buy a demand-side solution to it. If your exchange does not return the code, ask. An unattributed 35 percent is a number you cannot act on.
Validate a real pod, not a single imp. Every pod field is a cross-impression consistency claim, and validating one impression in isolation tests almost none of it. Paste a full pod into the bid request tester .
Refresh AdCOM enums to 1.0-202607 on the receive side now. If you buy CTV and reject plcmt 5 through 9 or pos 8 through 17, you are declining the formats sellers are actively trafficking, and neither side can see that from their dashboard.
Pick one of rqddurs or the min/max duration pair, never both. This is the highest-frequency pod error we see and it has no consistent resolution across bidders.
Audit plcmt coverage across every path you sell through. Not just your direct integration. Curated and resold paths are where the field gets dropped.
Gate it in CI. Validation that runs once during an integration project does not survive the next SDK release. The CI guide covers the setup.
## The honest limit of this argument
Bid request quality does not explain 35 percentage points. Floors above the clearing price, genuinely thin demand in smaller markets, and buyers who have not built CTV capability at all are real and probably larger. Nobody has published a decomposition and we are not going to invent one.
What is defensible is narrower and more useful. Some non-trivial share of what a seller books as unsold is demand that arrived, could not classify the request, and passed. That share is measurable with nbr , it is fixable with field-level validation, and it costs nothing to close compared with acquiring an advertiser. Every other line in the 35 percent needs a sales team, a market, or a price change. This one needs a schema check.
The creative-side half of the same report, covering what happens to a CTV slot that fills and then fails to render, is on vastlint .
## Sources
OpenRTB and AdCOM are published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names and enumerated values are drawn from those documents; the analysis is our own. RTBlint is independent and not affiliated with IAB, IAB Tech Lab, or Omdia.
Omdia: $0.21 per viewing hour sets monetization benchmark for ad-supported CTV, July 29, 2026
Advanced Television: report coverage, including the two to three times revenue framing
AdCOM 1.0-202607, tagged July 16, 2026
IAB Tech Lab: CTV Ad Portfolio, signaling guidance finalized July 22, 2026
IAB: Redefining Media Types Standard, public comment through August 8, 2026
The delivery half: what happens to a CTV slot that fills and fails (vastlint)
---
# AdCOM 1.0-202607: new enums, five redefined playback methods, and two releases carrying the wrong field names · RTBlint
URL: https://rtblint.org/blog/adcom-1-0-202607-enums-and-content-rename/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Spec release
## AdCOM 1.0-202607: new enums, five redefined playback methods, and two releases carrying the wrong field names
July 30, 2026 · RTBlint
AdCOM is where OpenRTB 2.6 keeps its enumerated lists. When a bid request sends video.plcmt or video.pos or video.playbackmethod , the integers mean whatever the current AdCOM document says they mean, and OpenRTB itself only holds a link. AdCOM 1.0-202607 was tagged on July 16, 2026. It adds the enumerations behind the CTV Ad Portfolio formats, it rewords five playback methods that already existed, and it carries a Content object with seven field names that are not AdCOM's. The names were corrected on the main branch six days later. The tag was not re-cut, and neither was the one before it.
## What the release adds
The substantive change came in through a single commit from June 25 titled "Ad Format Signaling Enumeration Updates," and it extends four lists. These are the machine-readable half of the CTV Ad Portfolio work whose signaling guidance was finalized on July 22.
List: Creative Attributes
19 Contains advertiser QR Code
20 Support alpha channel transparency
21 Static Visual
22 Limited Motion (Cinemagraph)
23 Full-Motion Video
List: Plcmt Subtypes - Video
5 Pause 6 Screensaver 7 Overlay
8 Squeezeback 9 In-scene
List: Placement Positions (was 0 through 7)
8 Partial Screen 9 Top Left 10 Top Right
11 Frame the content 12 Double box 13 Double box with background
14 Bottom Left 15 Bottom Right 16 L shape
17 Reversed L shape
List: Playback Methods (was 1 through 7)
8 Initiated by user pausing content, Sound on
9 Initiated by user pausing content, Sound off
10 Initiated by idling (e.g. screensaver), Sound on
11 Initiated by idling (e.g. screensaver), Sound off
Nothing controversial there. A pause ad needs a way to say it is a pause ad, a squeezeback needs a way to describe an L shape, and a cinemagraph is genuinely neither a still nor a video. The creative-side view of these formats is covered in vastlint's piece on the VAST 4.4 draft schema .
## Five playback methods changed meaning without changing number
The additions are the easy part. In the same diff, five values that have been in use for years were reworded.
1 was: Initiates on Page Load with Sound On
now: Initiates without any specific user interaction with Sound On
2 was: Initiates on Page Load with Sound Off by Default
now: Initiates without any specific user interaction Sound Off by Default
4 was: Initiates on Mouse-Over with Sound On
now: Initiates on Mouse-Over or cursor over with Sound On
5 was: Initiates on Entering Viewport with Sound On
now: Initiates on Entering Viewport or scrolling into view with Sound On
6 was: Initiates on Entering Viewport with Sound Off by Default
now: Initiates on Entering Viewport or scrolling into view with Sound Off by Default
The direction is deliberate and reasonable. "Page load" is browser vocabulary that never described a television, so values 1 and 2 were generalized to cover any initiation without user interaction, and 4, 5 and 6 picked up the cursor and scroll phrasing that CTV remotes and feed surfaces actually need. Nobody was going to spend a new integer on that.
It still means a seller who implemented playbackmethod: 1 against the old text and a seller who implemented it against the new text are making different claims with the same byte, and a buyer cannot tell which. This is the same shape as the content.livestream redefinition in OpenRTB 2.6-202606 and the same shape as the plcmt migration : a good correction landing on an enforcement layer that has no way to reject a stale interpretation.
The timing is worth noting. The Redefining Media Types standard is in public comment until August 8, and its sound-state attribute maps onto exactly these five values. The definitions underneath that mapping moved on July 16, in a different repository, three weeks into a thirty-day comment window.
## The Content object in both current releases has the wrong field names
AdCOM has always used short field names on its own objects. OpenRTB 2.x uses longer ones for the same concepts. Content.rating in AdCOM is Content.contentrating in OpenRTB, live is livestream , lang is language , and so on. Two documents, two naming conventions, deliberately.
On March 20, 2026, a commit titled "Live Attributes to Object: Content" added the new live signals to AdCOM's Content object. It also converted that object's table from HTML to markdown, and in the rewrite seven existing field names were replaced with their OpenRTB spellings.
AdCOM name became reverted on main 2026-07-22
------------------------------------------------------
rating contentrating rating
urating userrating urating
mrating qagmediarating mrating
live livestream live
srcrel sourcerelationship srcrel
lang language lang
embed embeddable embed
The commits that fixed it are titled "revert inadvertent name changes" and "Revert Inadvertent Content Object Name Changes," so the working group is clear about what happened. A second commit the same day standardized the type column from int to integer , which is a smaller version of the same problem for anyone parsing that column.
Here is the part that matters. The rename shipped in AdCOM 1.0-202606 , tagged June 11, and in AdCOM 1.0-202607 , tagged July 16. The fix landed on main on July 22 and 23. Neither tag has been moved, so as of today both of the two most recent AdCOM releases describe a Content object with seven fields AdCOM does not have, and the corrected text exists only on an untagged branch.
If you generate anything from a tagged release, which is the normal and correct thing to do, you generated the wrong names. If you read the document in a browser this week, you read the right ones. Those two facts coexisting is the whole hazard.
## Why a pipeline notices this and a reader does not
Seven renamed rows inside a two-hundred-row object, in a document nobody reads end to end, introduced as a side effect of a table format conversion, is close to invisible to review. It stayed in for four months and two releases.
It is not invisible to anything that parses the document into a catalog and diffs the catalogs release over release. That is what our AdCOM handling and the generated JSON Schemas exist to do. Table format conversions are a recurring source of this: an object rewritten from HTML into markdown can come out with an empty field list, which is loud and gets caught immediately, or with seven fields under different names, which is silent unless something is comparing the before and the after.
The general lesson for anyone maintaining bidder code against these documents: pin the release you generate from, diff every new release against the last one at the field level rather than reading the changelog, and treat a rename as a breaking change even when the changelog does not mention it. The changelog for 202607 does not mention this one, because nobody intended it.
## What our own validator does with the new values today
Worth being straight about this, because it is the flip side of the same problem. Our AdCOM value sets predated 202607, so until we published this post a perfectly valid pause-ad bid request failed validation against the newest snapshot. Four errors, all of them ours:
openrtb.value.invalid error imp[0].video.plcmt
has unsupported value 5. Allowed values from List: Plcmt Subtypes - Video
are 1, 2, 3 or 4.
openrtb.value.invalid error imp[0].video.pos
has unsupported value 14. Allowed values from List: Placement Positions
are 0, 1, 2, 3, 4, 5, 6 or 7.
openrtb.value.invalid error imp[0].video.playbackmethod[0]
has unsupported value 9. Allowed values from List: Playback Methods
are 1, 2, 3, 4, 5, 6 or 7.
openrtb.value.invalid error imp[0].video.battr[0]
has unsupported value 19. Allowed values from List: Creative Attributes
are 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 or >=500.
That is fixed as of today. The four value sets now carry the 202607 ranges, the tester and the MCP endpoint are running the rebuilt validator, and the enum reference lists the new values and flags the five reworded playback methods. Values outside the new ranges still fail, so plcmt: 10 and pos: 18 are still errors.
Saying so is cheaper than the alternative. A validator that is quietly out of date on an enum tells you your good traffic is broken, which is worse than telling you nothing. If you pin a version of the CLI or the library rather than using the hosted tools, check that you are on a build dated after this post.
## What to do about it
Do not generate from AdCOM 1.0-202607 or 1.0-202606 without checking the Content object. Both tags carry the seven renamed fields. Compare against main, or against 1.0-202409, which has the correct names.
Accept the new enum values on the receive side now. A buyer rejecting plcmt 5 through 9 or pos 8 through 17 is rejecting the CTV formats sellers are actively trafficking, and the rejection looks like a no-bid rather than an error.
Re-read your playbackmethod mapping against the current text. If your documentation still says "initiates on page load," your implementation and the spec have diverged in wording even where they agree in intent.
Diff catalogs, not changelogs. The changes that hurt are the ones nobody wrote down, because nobody meant to make them.
Check a request against a pinned snapshot in the bid request tester , or gate it per the CI guide . Version pinning is the part of this that is entirely in your control.
## Sources
AdCOM and OpenRTB are published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names, enumerated values and quoted definitions are drawn from those documents and from the public commit history of their repositories; the analysis is our own. Diagnostic output shown here was produced by RTBlint. RTBlint is independent and not affiliated with IAB or IAB Tech Lab.
AdCOM 1.0-202607 release, tagged July 16, 2026
Commit history for AdCOM v1.0 FINAL.md, including "Live Attributes to Object: Content" (March 20, 2026) and "revert inadvertent name changes" (July 22, 2026)
IAB Tech Lab: CTV Ad Portfolio, signaling guidance finalized July 22, 2026
IAB: Redefining Media Types Standard, public comment through August 8, 2026
Where these integers end up in a creative: the CTV Ad Portfolio VAST 2.0 extensions (vastlint)
---
# ARTF lets agents rewrite the bid request in flight. Nothing in it checks the result. · RTBlint
URL: https://rtblint.org/blog/artf-mutations-bid-request-validation/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Agentic
## ARTF lets agents rewrite the bid request in flight. Nothing in it checks the result.
July 29, 2026 · RTBlint
Most agentic advertising happens at planning time, which is why most of the debate about it is a debate about workflow. The Agentic RTB Framework is the exception. It puts agents inside the auction path, running as containers next to the exchange, and it gives them a typed vocabulary for changing a bid request or bid response while the auction is happening. Read the protobuf and the implication is immediate: the payload that reaches a bidder is not necessarily the payload the publisher emitted, and nothing in the framework says the rewritten version is still valid OpenRTB.
## What ARTF actually specifies
ARTF v1.0 went out for public comment in November 2025 and sits under the AAMP umbrella alongside the buyer and seller agent SDKs that reached 2.0 in June 2026. The transport is gRPC with Protocol Buffers, and the execution model is containerized: a host, an exchange or a DSP, runs third-party agent services co-located in its own infrastructure rather than calling them over the public internet. The pitch is latency, with claims of large reductions in round-trip time compared with server-to-server enrichment hops.
The data model is worth reading literally, because it is small. A host sends an RTBRequest carrying a lifecycle stage, an id , a tmax that bounds the mutation round trip including latency, the OpenRTB bid_request or bid_response itself, an originator (publisher, SSP, exchange, or DSP), and the list of applicable_intents the agent is allowed to answer with. The agent returns an RTBResponse containing zero or more Mutation messages plus metadata naming its API version and model version.
A mutation is four things: an intent , an op (add, remove, or replace), a path , and a typed payload chosen by intent. The payload types import OpenRTB directly: the metrics payload is a list of OpenRTB Metric objects, the content data payload is a list of OpenRTB Data objects. This is not a parallel object model. It is a patch protocol for the bid stream you already run.
## The eight intents, and what each one touches
ARTF v1.0 defines eight intents. Mapping them onto the OpenRTB fields they land on makes the validation surface obvious:
Intent Lands on What breaks if it lands wrong
ACTIVATE_SEGMENTS user.data[] / content.data[] segments Malformed Data or Segment objects; provider identity lost
ACTIVATE_DEALS imp.pmp.deals[] A deal id the exchange does not know, or a deal added without a floor or auction type
SUPPRESS_DEALS imp.pmp.deals[] (removal) A bidder that already read the request bids into a deal that no longer exists: openrtb.bid.dealid_unknown
ADJUST_DEAL_FLOOR deals[].bidfloor Negative or implausible floors, currency mismatch against bidfloorcur
ADJUST_DEAL_MARGIN Commercial layer, expressed as CPM or percent No OpenRTB field carries margin, so this is the one intent whose effect is not visible in the payload at all
BID_SHADE bid.price on the response A price altered after the bidder set it, in a currency the request may not allow: openrtb.response.cur_not_allowed
ADD_METRICS imp.metric[] Metric objects missing type or value, or vendor-less third-party metrics
ADD_CIDS content.data[].cids / user.data[].cids cids arrived in OpenRTB 2.6-202505; adding it to a request pinned to an earlier snapshot produces a field that does not exist in that version
That last row is the cleanest example of the whole problem. ADD_CIDS is a perfectly legal ARTF intent. Whether the result is a legal bid request depends entirely on which OpenRTB snapshot the exchange and its bidders are running, which is information the mutating agent does not necessarily have. RTBlint already reports this class as openrtb.field.not_yet_available , and the history of dated snapshots is in how OpenRTB ships now .
## Three structural gaps
None of these are criticisms of the design so much as consequences of it, and they are the reason a conformance step belongs in the loop.
path is a string. The framework describes it as the semantic business domain where the operation applies. A free-form path plus add, remove, and replace is a general-purpose patch API. Two agents can disagree about what a path means, and a path can point somewhere that does not exist in this version of the spec. Only validating the mutated document catches that.
Composition is undefined territory. A host may run several agents. Two mutations can be individually reasonable and jointly contradictory: one activates a deal, another suppresses it; one adds segments the other removes. The result is a single payload that has to satisfy the spec after every patch has landed.
Provenance stops at metadata. Metadata carries an API version and a model version, which is genuinely useful for attribution, but the mutation itself is not signed and the pre-mutation payload is not retained anywhere in the protocol. If a bidder later asks why a request claimed a segment, the answer has to come from the host's own logging discipline.
## Validation stops being an edge check
The traditional place to validate a bid request is once, at the boundary where you emit it. ARTF breaks that assumption, because the payload changes after your boundary. If a mutation stage sits in your path, the useful model is a checkpoint after each stage that can rewrite the document:
Publisher or SSP emit. Validate as normal, against the snapshot you target. This is the baseline every downstream comparison depends on.
After each mutating stage. Re-validate the document, not the patch. A patch that looks correct can produce a document that is not, and the whole point of the framework is that the agent is not the party accountable for the payload.
On the response side. BID_SHADE operates at LIFECYCLE_DSP_BID_RESPONSE , so cross-validate the mutated response against the request that produced it: id, impid, seat, currency, deal, media type.
In CI, per intent. Fixture per intent your agents can emit, asserted against the exact snapshot each partner runs, gated on rule ids rather than on exit codes.
The economics of skipping this are the same as for any silent bidstream defect: unknown fields are ignored by design, so a bad mutation does not error, it just quietly removes bidders. That mechanism is the subject of bid request quality as a revenue line and of what happens on a version mismatch .
## What we would like to see in 2.0
ARTF is post-comment with a 2.0 already discussed, so the boundaries are still being drawn. Three additions would make the framework materially safer without changing its shape:
A declared OpenRTB version on the envelope. An agent that knows the target snapshot can refuse to emit a field that does not exist in it.
A normative path grammar. If the path is going to address OpenRTB structures, saying so precisely turns a class of integration bugs into a schema error.
A conformance profile per intent. Which fields an intent is permitted to touch, so hosts can enforce scope rather than trusting it. This is the same principle the framework already applies with applicable_intents , taken one level deeper.
The reference implementation is Rust with the protobuf definitions in the repository, and it is worth reading if you are integrating: the demo evaluator is where the intent semantics become concrete rather than prose.
## Practical takeaway
If you host agents in the auction path, validate the document after every stage that can change it, and keep the pre-mutation payload long enough to answer questions about it. If you build agents, validate what your mutation produces against the snapshot your host actually runs, not against the newest spec you read. Both are one call: paste a payload into the ARTF simulator or the tester , run it from the CLI in CI, or give the agent the MCP server as a tool so it can check itself before it answers. Field-level context for the standards around this is in IAB Tech Lab's agentic standards and the AdCP to OpenRTB mapping .
## Sources
IABTechLab/agentic-real-time-framework: ARTF v1.0 specification, protobuf definitions, and Rust reference implementation
IAB Tech Lab: ARTF standard page
IAB Tech Lab: AAMP, the umbrella program and agent SDKs
OpenRTB 2.6: Imp.metric (3.2.5), Data (3.2.21), Pmp and Deal (3.2.11, 3.2.12), Bid (4.2.3)
---
# Live event ad insertion: a burst, not a stream, and the OpenRTB fields that carry it · RTBlint
URL: https://rtblint.org/blog/live-event-ad-insertion-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## Live event ad insertion: a burst, not a stream, and the OpenRTB fields that carry it
July 29, 2026 · RTBlint
On-demand video produces a stream of impression opportunities. Each viewer starts when they start, hits their break when they hit it, and the request volume smooths out. A live event does not work that way. A cue message goes out in the transport stream, every viewer on the feed reaches the same break inside the same few seconds, and the auction has to clear before the splice point arrives. The shape of the demand is a burst, and the deadline is set by broadcast equipment rather than by an exchange. OpenRTB has acquired real vocabulary for this over the last four years. Most live inventory still ships without it.
## What is different about a live break, in protocol terms
Three things, and each one lands on different fields.
The break opens on a cue, not a timestamp. In a live stream the ad opportunity is announced by an SCTE-35 message inserted into the transport stream by the broadcaster, usually with a short pre-roll interval before the splice point. The ad server does not know the break exists until that message arrives, and the entire decisioning path (request, auction, response, creative selection, manifest manipulation) has to complete before the splice. Nothing in OpenRTB models the cue. What OpenRTB controls is the slice of that interval the auction is allowed to consume, which is tmax .
The break has a fixed length and it must be filled exactly. A linear break is a hole of a known number of seconds in a stream that is going to continue regardless. Underfill is dead air or slate. Overfill is a truncated ad or a missed return to content. On demand, a 28-second creative in a 30-second slot is a rounding error. Live, it is two seconds of black.
Insertion is almost always server-side. Client-side ad insertion at live scale means every device independently fetching and buffering a creative at the same instant. The practical answer is server-side stitching, which changes what the buyer can see about the device and what can be measured. There is a field for declaring that, and it is the most under-populated field in this entire post.
## Three integers describe live, and one of them changed meaning
The Content object carries the live signals. As of the 2.6-202606 snapshot there are three, and they are deliberately orthogonal.
content.livestream 0 = broadcast not scheduled (VOD, user initiated)
1 = broadcast is scheduled (linear viewing)
content.realtime 0 = not happening in real time (a replay)
1 = happening in real time (a live game)
content.firstbroadcast 0 = not the first time this content is broadcast
1 = first time being broadcast
The combinations are the point. A live semi-final is 1, 1, 1 . A scheduled rebroadcast of that same match the next morning is 1, 0, 0 : still linear, still a scheduled slot, but nothing is happening in real time and the outcome is already known. A FAST channel airing a library episode is 1, 0, 0 as well. A viewer pulling up the match highlights on demand is 0, 0, 0 . Those are four genuinely different products and until June 2026 the protocol collapsed them into one boolean.
That is the part worth flagging. In 2.6-202505 and earlier, livestream was defined as "0 = not live, 1 = content is live (e.g., stream, live blog)." In 2.6-202606 the same field, same name, same type, means "is the broadcast scheduled." The live-ness moved to realtime . A sender implemented against the old text and a sender implemented against the new text both emit livestream: 1 and mean different things, and no receiver can distinguish them from the payload alone. This is the failure mode we wrote about in the version mismatch post , arriving on a field that buyers are about to start pricing against.
The corollary is that sending the new fields to a partner still on an older snapshot is not a soft degradation. Validating the same payload against 2.6-202505 produces:
openrtb.field.undefined error app.content.realtime
Content.realtime is not defined in the canonical OpenRTB 2.6-202505 catalog.
openrtb.field.undefined error app.content.firstbroadcast
Content.firstbroadcast is not defined in the canonical OpenRTB 2.6-202505 catalog.
In production nobody raises that error, because unknown fields are ignored by design. The fields are simply dropped, and the buyer prices real-time live inventory as if it were a replay. Knowing which snapshot each partner parses is the whole game, and it is covered field by field in the 202606 review .
## imp.ssai: the field live inventory most needs and least sends
imp.ssai has been in the spec since 2.6 and is a four-value enum, not a boolean, and the distinction it draws is exactly the one a live buyer cares about:
0 status unknown (the default, and what most requests effectively say)
1 all client-side
2 assets stitched server-side, tracking pixels fired client-side
3 all server-side
The difference between 2 and 3 decides whether client-side measurement is possible at all. Under 3, impression and quartile beacons originate from a data center, so the IP and user agent on the tracker belong to the stitcher rather than the viewer, and anything that depends on executing code in the player (OMID viewability, interactive creative) is not going to run. Under 2, the assets are stitched but the beacons still fire from the device, which preserves most measurement.
A default of 0 means "unknown," and a buyer reading 0 has no basis to discount, no basis to expect measurement, and no basis to complain when it does not arrive. If your live supply is stitched, say so. It costs one integer, and the downstream consequences are covered from the creative side in vastlint's write-up on stitch-time failures .
## The clock: tmax, imp.exp, bid.exp
tmax is the maximum time in milliseconds the exchange allows for bids, including internet latency. In live, that number is not a tuning preference. It is whatever is left of the cue pre-roll interval after transcode, manifest manipulation and CDN propagation have taken their share, and it is usually the tightest tmax a bidder will see from that seller. RTBlint flags openrtb.request.tmax_non_positive and openrtb.request.tmax_implausible because a zero or absurd value here is a config error that silently converts to "no bids arrived in time." The tmax reference covers the budget arithmetic.
The two expiry fields are the ones that get skipped. imp.exp is advisory as to the number of seconds that may elapse between the auction and the actual impression. bid.exp is the bidder's side of the same statement: how long it is willing to wait between winning and rendering. Live stacks frequently decision a break ahead of the splice point, and sometimes decision several breaks ahead during a predictable window. Every second of that gap is a second in which a frequency cap goes stale, a budget is spent elsewhere, or a creative is pulled. A request that prefetches and sends no imp.exp is telling the bidder the impression happens immediately, and it does not.
## What a live pod request actually looks like
Pod bidding shipped in 2.6 in 2022 and the live case is why several of the fields exist. This is a single impression representing a dynamic pod: a two-minute break, up to four ads, only 15 and 30 second creatives accepted, with a per-duration floor. It validates clean against 2.6-202606.
{
"id": "live-break-8842",
"tmax": 220,
"at": 1,
"cur": ["USD"],
"imp": [{
"id": "1",
"ssai": 3,
"exp": 45,
"video": {
"mimes": ["video/mp4"],
"protocols": [7, 8],
"w": 1920, "h": 1080,
"plcmt": 1,
"linearity": 1,
"podid": "q3-break-2",
"podseq": 2,
"poddur": 120,
"maxseq": 4,
"rqddurs": [15, 30],
"slotinpod": 0,
"mincpmpersec": 0.45,
"durfloors": [
{ "mindur": 15, "maxdur": 15, "bidfloor": 22.0 },
{ "mindur": 30, "maxdur": 30, "bidfloor": 40.0 }
]
}
}],
"app": {
"id": "app-1",
"bundle": "com.example.sports",
"content": {
"id": "match-5521",
"livestream": 1,
"realtime": 1,
"firstbroadcast": 1,
"cattax": 7,
"network": { "id": "net-9", "name": "Example Sports Network" },
"channel": { "id": "ch-2", "name": "Example Sports 2" }
}
},
"device": {
"devicetype": 3,
"ifa": "38400000-8cf0-11bd-b23e-10b96e40000d",
"lmt": 0
},
"source": { "fd": 1, "tid": "0a1b2c3d-4e5f-6071-8293-a4b5c6d7e8f9" }
}
podid groups impression opportunities that belong to the same break. podseq is which break this is within the stream, which for a sporting event maps to the quarter or the innings break and is the single most useful targeting signal in the payload. poddur is the length of the whole break; rqddurs constrains the individual slots. slotinpod at 0 means any position. The full mechanics are in the pod bidding post and the CTV reference .
## rqddurs exists because of dead air
Of all the pod fields, rqddurs is the one written specifically for this use case, and the spec says so in the field definition: it "specifically targets the Live TV use case where non-exact ad durations would result in undesirable dead air." It is an array of exact acceptable durations. Not a range. A 22-second creative is not a near miss against [15, 30] , it is a rejection.
It is also mutually exclusive with minduration and maxduration , and the most common way to break a live pod request is to leave the old duration fields in place while adding the new one. That is a real check, not a style preference:
openrtb.fields.mutually_exclusive error imp[0].video.minduration
imp[0].video.minduration and imp[0].video.rqddurs are mutually exclusive
and must not both be present.
openrtb.fields.mutually_exclusive error imp[0].video.maxduration
imp[0].video.maxduration and imp[0].video.rqddurs are mutually exclusive
and must not both be present.
A bidder that reads maxduration and ignores rqddurs will cheerfully return a 22-second ad for a slot that cannot hold it. Two warnings catch the other common shapes: openrtb.video.pod.rqddurs_empty when the array is present but empty, which is the classic template-with-no-values bug, and openrtb.video.pod.mincpmpersec_without_pod_context when a per-second floor appears without poddur or maxseq , which usually means a dynamic-pod snippet was copied onto a single-slot request.
## Burst traffic is the cheapest thing you will ever validate
The reason to care about all of this before an event rather than during one is that live failures are not distributed the way on-demand failures are.
On demand, a malformed field is a slow leak. It affects whatever share of traffic comes from the broken path, it shows up as a slightly depressed fill rate, and there is always more traffic tomorrow to investigate with. In live, the same malformed field affects one hundred percent of a break, the break lasts two minutes, and there is no tomorrow for that inventory. The audience for a final does not come back on Tuesday.
The flip side is that this makes the failures easy to find, because they are systematic rather than random. Every request in a break comes from the same template, the same ad server build, the same integration. If rqddurs and maxduration are both present in one request, they are both present in all of them. One sample payload from a rehearsal stream tells you what the entire event will do. Paste it into the bid request tester , or gate it in CI following the validation in CI guide .
## The pre-event checklist
Confirm which snapshot each demand partner parses. If they are on 2.6-202505 or earlier, realtime and firstbroadcast are being dropped on the floor and your live premium is invisible. Send livestream knowing they read the old definition.
Populate imp.ssai honestly. 3 if beacons fire server-side, 2 if only the assets are stitched. Leaving it at 0 asks the buyer to guess, and buyers guess conservatively.
Check tmax against the actual cue pre-roll interval, not against your on-demand default. If the auction budget exceeds what the splice point allows, every bid is late and the break fills with house ads.
Send imp.exp if you decision ahead of the splice. Any non-trivial gap between auction and playout is information the bidder needs to price and cap correctly.
Validate one rehearsal payload end to end. Duration field exclusivity, enum ranges, pod coherence. These are template bugs, and a template bug found once is fixed for the whole event. The rule catalog lists what gets checked.
Validate the creative side too. A clean bid request that wins a slot and then returns a VAST tag the stitcher cannot use is the same lost break. The handoff is covered in VAST and OpenRTB .
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names, enumerated values and quoted field definitions are drawn from it; the analysis is our own. Diagnostic output shown here was produced by RTBlint against the 2.6-202606 and 2.6-202505 catalogs. RTBlint is independent and not affiliated with IAB or IAB Tech Lab.
OpenRTB 2.6 specification: Object Imp (ssai, exp), Object Video (podid, podseq, poddur, maxseq, rqddurs, slotinpod, mincpmpersec, durfloors), Object Content (livestream, realtime, firstbroadcast), Object Bid (exp, dur, slotinpod)
OpenRTB 2.6 implementation notes, section 7.6: Pod Bidding for Video and Audio
SCTE 35: Digital Program Insertion Cueing Message, the signal that opens a live break
The creative side of the same break: live ad insertion in VAST and VMAP (vastlint)
---
# Redefining Media Types: eight new claims, and the bidstream fields they land on · RTBlint
URL: https://rtblint.org/blog/redefining-media-types-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Standards
## Redefining Media Types: eight new claims, and the bidstream fields they land on
July 26, 2026 · RTBlint
IAB released the Redefining Media Types Standard for public comment on July 9, 2026, with IAB Tech Lab setting the technical standards for adoption. Comment closes August 8. Most of the coverage read it as a planning-and-reporting document, which the first half of it is. The second half is not. It defines eight binary attributes that apply to an individual impression, and the stated plan is to encode them directly into OpenRTB bid requests. Seven of the eight already have somewhere to live in the spec, and that is the problem worth two weeks of your attention.
## What the standard is
RMT classifies video advertising environments on two layers. The first sorts inventory into macro buckets grounded in how a person is actually watching: Lean Back Viewing, Personal Screen Viewing, and Passive and Communal Viewing. The second applies impression-level attributes that let a single impression be described precisely across platforms and devices. The scope covers connected TV, online video, social video, FAST, video podcasting, and retail video.
The motivation is stated plainly in the release: legacy classification terms were built to describe distribution technology and business models rather than the viewing experience a consumer actually has. "CTV" describes a delivery path. "Online video" describes a browser. Neither tells a buyer whether the ad played full screen with sound on in a living room, or muted in a feed on a phone, and those two impressions are not the same product at the same price.
RMT follows Campaign Data Standards 1.0 from May 14, 2026. Where that work addressed reconciliation between planning tools and finance systems, this one addresses what a given video impression actually is, independent of which platform reports it. The framework is designed to feed the Project Eidos taxonomy and to inform the OpenRTB and AdCOM specifications rather than sit beside them as a standalone document.
## The eight attributes, and where each one already lives
The second layer is the operational half: sound state, skip-enabled versus completion-required, full-screen presentation, addressability, availability of signals, measurability, device, and ad format. Read that list as a protocol engineer and it is not new vocabulary. It is a list of assertions the bid request is already supposed to be making. Here is the mapping as the spec stands today.
RMT attribute OpenRTB 2.6 field(s) State today
--------------------------------------------------------------------------------
Sound state video.playbackmethod (1,2,5,6) Field exists
Skip vs completion video.skip, skipmin, skipafter Field exists
Full-screen video.pos = 7, w/h vs device.w/h Weak proxy
Addressability device.ifa, device.lmt, user.eids Field exists
Signal availability regs.gpp, source.schain, user.ext Inferred only
Measurability video.api = 7 (OMID), imp.metric Capability, not proof
Device device.devicetype, app/site/dooh Field exists
Ad format video.plcmt, video.linearity, mtype Field exists
Four of those are clean. playbackmethod encodes sound state directly: 1 and 5 start with sound on, 2 and 6 start with sound off by default. devicetype separates a connected TV (3) from a set top box (7) from a phone (4). skip with skipmin and skipafter encodes the skip contract. plcmt carries format, and the CTV Ad Portfolio signaling finalized on July 22 just extended its range past the original four subtypes.
The other four are where RMT is asking for something the protocol does not currently give it.
## The four that do not have a real field
Full-screen presentation. There is pos , whose value 7 means full screen, but pos is a display-era placement-position field that most video sellers leave unset, and the CTV portfolio work has just loaded another ten values onto it for overlay and squeezeback geometry. Deriving "this played full screen" from video.w and video.h against device.w and device.h works when all four are populated honestly, which on CTV is not the common case.
Addressability and signal availability are today inferred from absence. A buyer decides an impression is addressable because device.ifa is present and device.lmt is not 1, or because user.eids has an entry. That is inference over a field that may be missing for a dozen unrelated reasons: a stripped bidstream, a consent state, a truncating adapter, a seller that never populated it. Turning inference into a declared boolean moves the failure from "I could not tell" to "you told me wrong."
Measurability is the one to watch. Today the closest signal is video.api containing 7, which declares OMID 1.0 support. That is a statement about what the player can do, not about whether the delivered impression was measured. A declared measurability bit invites the same conflation, and measurability claims are exactly the kind that get repeated downstream into reporting without anyone re-deriving them.
## We have already run this experiment. It was called plcmt.
In 2022 the IAB deprecated video.placement and introduced video.plcmt with tighter definitions, precisely because the old field had drifted into meaning whatever each seller wanted it to mean. It was a good taxonomy, correctly motivated, published with a migration path and a deadline.
Three years later, as we covered in the plcmt migration retrospective , plenty of traffic still carries both fields with values that contradict each other, and plenty carries neither. Nothing rejected the bad data. Unknown fields are ignored by design, a wrong enum value inside a valid range is indistinguishable from a right one, and there is no error code for a version or semantic mismatch . The taxonomy was fine. The enforcement layer did not exist.
RMT is a better-designed taxonomy than plcmt, and it will land on the same enforcement layer. If playbackmethod is unpopulated on 30 percent of your video inventory today, then a sound-state classification built on it is unpopulated on 30 percent of your inventory the day it ships, and the classification will be reported as though it were known.
## What to do before August 8
The comment window is the leverage. Two useful things to do with it, and one to do regardless of whether you comment.
Measure your own fill rate on the seven mapped fields. Take a day of real bid requests and count how many populate video.playbackmethod , video.skip , video.plcmt , device.devicetype , video.api , video.pos , and device.ifa . That percentage is the ceiling on how accurately RMT can classify your inventory, and it is a concrete number to submit as feedback rather than an opinion.
Comment on the attributes your data cannot answer as a binary. Measurability and signal availability are the two most likely to be filled in optimistically by whichever system has the least information. A definition that says how the bit is derived, and from which field, is worth more than the bit.
Fix the enum drift now, not after the taxonomy ships. RTBlint flags out-of-range enum values as openrtb.value.invalid , fields that do not exist in your declared version as openrtb.field.not_yet_available , and skip pairings that contradict themselves as openrtb.field.requires_skippable_video . Those are the failures that a classification layer will silently inherit. The CI guide covers gating on them.
To check a single request against the current snapshot, paste it into the bid request tester . For the field-by-field background on the taxonomy this one sits next to, see placement versus plcmt and the rule catalog .
## The part worth saying plainly
RMT is good work and it addresses a real problem: the industry classifies video by delivery pipe and then argues about what the numbers mean. Grounding the definitions in the viewing experience is the right correction, and doing it in a way that feeds OpenRTB and AdCOM rather than sitting in a PDF is the right implementation choice.
The risk is not in the standard. It is that a classification layer is only ever as good as the fields underneath it, and those fields have no runtime that rejects a wrong answer. A new taxonomy on unvalidated inputs produces confident, precise, wrong reports, which is worse than the ambiguity it replaced, because ambiguity at least announces itself. The fix is unglamorous and available today: validate the seven fields you already have before the eighth arrives.
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names and enumerated values referenced here are drawn from it; the analysis is our own. RTBlint is independent and not affiliated with IAB or IAB Tech Lab.
IAB: Redefining Media Types Standard, draft and definitions spreadsheet (public comment through August 8, 2026)
IAB Releases Redefining Media Types Standard for Public Comment (July 9, 2026)
PPC Land: IAB gives advertisers 30 days to weigh in on new video classification rules
OpenRTB 2.6 specification text: Object: Video, Playback Methods, Plcmt Subtypes (Video), Device Types, and API Frameworks
IAB Tech Lab: CTV Ad Portfolio, signaling guidance finalized July 22, 2026
---
# Bid request quality is a revenue line: the auction economics of broken fields · RTBlint
URL: https://rtblint.org/blog/bid-request-quality-auction-economics/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Revenue
## Bid request quality is a revenue line: the auction economics of broken fields
July 16, 2026 · RTBlint
We wrote the engineering version of this story: OpenRTB version mismatches fail silently , because the protocol ignores what it does not recognize. This is the version for people who own a revenue number. The bid request is the only sales document your inventory ever gets. Every field a partner cannot parse is a claim your inventory no longer makes, and in an auction, claims you fail to make are discounts you did not agree to.
## Clearing price is a function of who showed up
The economics of an auction are brutally simple: price comes from competition, and competition comes from qualified bidders. Remove one bidder from a thin auction and the clearing price drops toward the next bid down. In first-price auctions with bid shading, the effect is faster, because every buyer's algorithm is explicitly trying to pay the least it can get away with, and less competition means it can get away with more. The first-price mechanics guide covers how shading works; the summary is that your clearing price is being computed from your auction density on every single impression.
Field-level breakage attacks the density directly, and it does it silently. A DSP that cannot find a consent string does not call you. It stops bidding on that traffic. A buyer whose parser misses your supply chain does not negotiate. Its supply-path filter drops you. Each of these is a bidder subtracted from every auction on the affected traffic, and none of them generates an error.
## What each broken field costs
The mapping from field to money is concrete. These are the big five, with the economic mechanism attached:
plcmt misread or missing: your inventory changes price category. Instream video trades at roughly 10 to 30 dollars CPM on the open web while outstream clears under 10. A buyer that cannot classify your video placement, because plcmt and placement disagree or the field is at a path it does not read, prices defensively. Misclassification is not a haircut, it is a tier change: the same impression sells at the wrong table.
Consent at the wrong path: EU demand exits. A buyer that reads user.ext.consent while you write user.consent sees EU traffic with no legal basis and, if it is well-run, declines to bid. You lose not that buyer's wins but its presence, which was propping up the clearing price of every auction it entered.
schain incomplete or in the wrong home: supply-path filters remove you. Buyers running supply path optimization treat an unverifiable chain as a reason to skip the path entirely, and the polite ones tell you with nbr 16 or 17 . The impolite ones just disappear from your demand.
rwdd dropped: the rewarded premium evaporates. Rewarded placements carry guaranteed attention and price accordingly. A parser that never sees the flag buys them as interruptive video.
Pod fields ignored: live sports prices like run-of-network. The CTV pod toolkit ( podid , rqddurs , mincpmpersec ) exists to enforce duration economics on the most expensive inventory there is. When those fields do not survive the trip, duration floors are unenforced and premium pod structure is invisible to the buyer pricing it.
## A worked example, in round numbers
Take a publisher clearing 100 million EU video impressions a month at a 10 dollar average CPM: one million dollars of monthly revenue. Now break one thing: a consent string written only at the 2.6 path, sent to a major buyer that still reads the 2.5 path. That buyer exits the affected auctions entirely.
Assume conservatively that it was the price-setting bidder on 20 percent of those auctions and its absence lowers the clearing price by 10 percent there, while adding nothing anywhere else. That is 100M × 20% × $10 CPM × 10% ÷ 1000 = 20,000 dollars a month, 240,000 a year, from one field at one path for one partner. Nothing in any dashboard says "consent path mismatch." The symptom is that EU CPMs softened, which has a dozen innocent explanations, and repricing arrived without a meeting.
The numbers are illustrative; the structure is not. Field breakage multiplies (affected traffic share) × (bidder's price influence) × (your volume), and at programmatic volume the product is rarely small.
## The second-order cost: you get shaped out of the stream
The auction you lose today is the visible half. The invisible half is what your broken requests teach the machines that decide whether you get auctions tomorrow.
Bid request volume has grown far faster than real inventory, and DSPs defend themselves with QPS caps and traffic shaping: models that score each supply path by how often its requests turn into bids and wins, then throttle the paths that do not. Every request a partner cannot parse, every bid that dies to a mechanical loss code in the 1-to-10 range , is a training example telling that model your path is noise. The model responds the only way it can: it listens to you less. Your auctions stop being lost and start not happening, which is cheaper for everyone except you.
This is why request quality compounds. Clean requests win auctions, wins feed the shaping models, and the models allocate you more QPS, which is more auctions to win. Broken requests run the same loop in reverse, and climbing back up a shaping model's rankings takes months of clean traffic.
## The third-order cost: revenue you cannot audit
The ISBA and PwC supply chain studies are the reference point here. The first one, in 2020, famously found that only 51 percent of advertiser spend reached publishers and 15 percent could not be attributed at all, the "unknown delta." The second study, published in 2023, got the delta down to 3 percent, and the stated reason was better, more matchable data across the chain: consistent IDs, reconcilable logs, fields that meant the same thing on both ends.
That is a protocol-hygiene result wearing an accounting costume. Spend becomes attributable when the records on both sides of every hop can be joined, and it stops being attributable when IDs drift, fields move homes, and two parties log different truths about the same transaction. Unauditable revenue settles toward whoever controls the reconciliation, and that is rarely the publisher. Clean protocol data is not just how you win auctions. It is how you prove, later, what you were owed.
## What to put on the revenue dashboard
Bid rate and win rate per partner, watched across deploys. A step change in one partner's participation after a release is a parser gap, not a demand fluctuation.
nbr 2 and loss codes 1 through 10 as build failures. These are partners telling you, in machine-readable form, that your payloads are broken. They belong in engineering alerting, not in a monthly deck.
Field-completeness cohorts. Compare CPMs on requests that carry full plcmt, schain, consent, and pod data against requests that do not. The gap is the price of your own missing fields, measured on your own traffic.
EU CPM trend against consent-string presence and path. Softening EU prices with healthy volume is the classic consent-plumbing symptom.
Validation as a release gate. RTBlint in CI turns a moved field or a version drift into a failing pull request check, which costs minutes. The alternative is finding it in the win-rate data next quarter.
The unit economics of prevention are lopsided. A validator run costs milliseconds and catches the exact class of defect this post prices: fields that vanished, moved, or stopped meaning what your partner thinks they mean. Paste a production request into the tester and read it the way a buyer's parser does. If something is missing there, it is missing from your revenue too.
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names referenced here are drawn from it; the analysis and arithmetic are our own. RTBlint is independent and not affiliated with IAB Tech Lab.
ISBA / PwC Programmatic Supply Chain Transparency Study (2020): the 51 percent and the 15 percent unknown delta
ISBA second Programmatic Supply Chain Transparency Study (2023): the delta reduced to 3 percent with matchable data
AdTech Explained: Traffic Shaping Explained, on QPS caps and supply-path scoring
MGID: Instream vs Outstream Ads, the CPM tiering behind the plcmt example
vastlint: The Revenue Math of Broken VAST, the same translation one layer down the stack
---
# What happens when your stack doesn't support an OpenRTB version? Nothing. That's the problem. · RTBlint
URL: https://rtblint.org/blog/openrtb-version-mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## What happens when your stack doesn't support an OpenRTB version? Nothing. That's the problem.
July 15, 2026 · RTBlint
On the creative side of the pipe, a version mismatch has a name: VAST error 102 , fired when a player rejects a document version it cannot read. OpenRTB has no equivalent. The spec instructs receivers to ignore fields they do not recognize, and the version itself travels in an optional HTTP header that plenty of integrations never set. So when one side of an integration runs 2.5 and the other sends 2.6, nothing errors, nothing logs, and nothing bids differently on day one. The failure arrives later, as mispriced inventory, missing consent signals, and win rates that drift for no visible reason.
## There is no version handshake in the JSON
An OpenRTB 2.x bid request does not carry its version in the body. The spec puts it in an HTTP header, x-openrtb-version: 2.6 , and the header is best practice rather than enforced. When it is absent, the receiver guesses. Some exchanges document the guess: Xandr, for example, defaults supply integrations to 2.4/2.5 semantics unless the header says otherwise. Others just parse and hope.
Compare that with the layer below: a VAST document declares its version on the root element, and a player that refuses it fires a trackable error. And the layer above it has nothing at all. Two JSON documents that differ only in which fields their authors knew about are, on the wire, just two JSON documents. OpenRTB 3.0 fixed this with an in-body openrtb.ver field, but 3.0 is a different protocol , and most of the bid stream still speaks 2.x.
## The tolerance rule cuts both ways
The missing handshake is not an oversight. The 2.x versioning policy says bidders and exchanges must tolerate new or unexpected fields gracefully, treating unknown attributes and enum values as if they were not there. That rule is why the protocol could evolve from 2.0 to 2.6 without flag days, and why dated snapshots can add fields without version bumps.
The cost is the feedback loop. Ignoring unknown fields means there is no such thing as a rejected field, which means a sender has no way to learn that a receiver dropped half its signal on the floor. A 2.6 request sent to a 2.5 parser is a valid 2.5 request. It just says less than the sender thinks it says.
## What actually disappears
OpenRTB 2.6 did two kinds of things to the request: it added fields, and it moved fields . The two fail differently when they meet a 2.5 reader.
Added fields vanish quietly. A 2.5 reader ignores what it never knew:
imp.video.plcmt is skipped, so the buyer classifies your video inventory from the deprecated placement field, or from nothing. The enums do not map 1:1 , so instream can price as something else entirely.
imp.rwdd is skipped, so rewarded inventory trades as standard interruptive video.
The pod fields ( podid , slotinpod , rqddurs , mincpmpersec ) are skipped, so a structured CTV pod flattens into unrelated impressions with no duration economics.
Moved fields are worse, because both paths exist. 2.6 promoted several signals from extensions to first-class attributes: source.ext.schain became source.schain , regs.ext.gdpr became regs.gdpr , user.ext.consent became user.consent , user.ext.eids became user.eids . A sender that writes only the new path, talking to a reader that checks only the old one, produces concrete failures:
The supply chain looks absent or incomplete, and buyers running supply path checks respond with nbr 16 or 17 , or just filter you.
EU traffic arrives at the buyer with, as far as its parser can tell, no GDPR flag and no consent string. Depending on the buyer's defaults, that either kills the bid or processes personal data on traffic that carried a perfectly good TCF string at a path nobody read. One of those outcomes costs money; the other is a compliance incident.
## Dual-sending is the coping mechanism, and it drifts
The ecosystem's answer is to write both paths: placement and plcmt , regs.ext.gdpr and regs.gdpr , schain in both homes. It works, which is why three years into the plcmt migration dual-sending is still the norm rather than a transition state.
But dual-sending has its own failure mode: the two copies drift. A pipeline that sets plcmt from new logic and placement from a legacy default is making two different claims about the same impression, and different buyers will price different truths. If you dual-send, the copies need to be generated from one source of truth and checked for agreement, not maintained by two code paths that happened to both survive a refactor.
## Which 2.6 do you mean?
Since 2022, "we support 2.6" has been an ambiguous claim. The version number only moves on breaking changes; everything else lands in dated snapshots , and the snapshots are not interchangeable. A stack current to 2.6-202204 has never heard of regs.gpp . One current to 2.6-202505 does not know content.realtime exists.
The June 2026 snapshot sharpened the point by redefining an existing field: content.livestream changed meaning from "live now" to "scheduled or linear." Two parties can both truthfully support 2.6, exchange that field, and disagree about what it says. No unknown-field rule protects you there, because the field is known to both sides. The only fix is naming the snapshot in your integration docs and your validation config.
## The only loud failure
There is one place a version gap makes noise: a receiver with strict request validation that rejects the payload outright, answering nbr 2, Invalid Request , or silently 204ing everything you send. That at least shows up as a bidder whose bid rate is zero, which someone eventually investigates. The irony of OpenRTB versioning is that the strict integration that rejects your request is easier to fix than the tolerant one that quietly accepts it, because the strict one tells you.
## How to catch a mismatch that refuses to announce itself
Send the header, always. x-openrtb-version on every request, with the version your body actually conforms to. It costs nothing and it is the only in-band claim you get.
Pin the snapshot in writing. Integration docs and partner onboarding should name a dated snapshot (2.6-202505, 2.6-202606), not a bare 2.6. The versions page lists what each snapshot added.
Audit moved fields in both homes. If you send first-class schain , gdpr , consent , or eids , check which partners still read only the ext paths, and dual-send from a single source of truth until they migrate.
Watch per-partner metrics across version changes. A parser gap shows up as a step change in one partner's bid rate, win rate, or clearing price while everyone else stays flat. Nothing in the protocol will flag it for you.
Validate against the version you claim. RTBlint is version-aware across 2.0 through 3.0 including the dated 2.6 snapshots, so a field that does not exist in the version you pinned gets flagged before a partner's parser ignores it. Paste a request into the tester or gate it in CI with the CLI .
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names and versioning policy referenced here are drawn from it; the analysis is our own. RTBlint is independent and not affiliated with IAB Tech Lab.
OpenRTB 2.6 specification, including the versioning header convention and the unknown-field tolerance policy
Microsoft (Xandr): Integration with OpenRTB 2.6, documenting the x-openrtb-version header and default version behavior
OpenRTB 2.x release history: the dated snapshots from 2.6-202204 through 2.6-202606
---
# What is bidstream data? Everything a bid request broadcasts, field by field · RTBlint
URL: https://rtblint.org/blog/what-is-bidstream-data/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## What is bidstream data? Everything a bid request broadcasts, field by field
July 14, 2026 · RTBlint
"Bidstream data" used to be industry shorthand. Now it appears in federal enforcement orders. The term means something precise: the data carried inside OpenRTB bid requests, broadcast to every party invited to an auction, whether they bid or not. Nothing about it involves a breach or a hack. It is the protocol doing exactly what the protocol says. This post maps the term to the actual fields, because the privacy conversation and the engineering conversation are about the same JSON.
## Where the term comes from
On January 14, 2025, the FTC finalized orders against two data brokers, Mobilewalla and Gravy Analytics, over the collection and sale of sensitive location data. The Mobilewalla case was the FTC's first action aimed squarely at bidstream collection: the complaint described a company that participated in RTB auctions, received bid requests containing mobile advertising IDs and precise geolocation, and retained that data even when it did not win the auction. The final order prohibits collecting or retaining consumer data from RTB exchanges for any purpose other than participating in the auction itself.
That is the mechanism to understand: losing an auction still means receiving the request. A bidder invited to a hundred billion auctions a day receives a hundred billion payloads a day, and until recently nothing but contract language governed what it kept.
## What a bid request actually carries
The bid request exists to let bidders value an impression, and value comes from context. The spec therefore defines fields for exactly the data the privacy debate is about:
Location. device.geo carries lat and lon , with a type field distinguishing GPS-derived coordinates (type 1) from IP-derived ones (type 2), plus accuracy in meters. device.ip and ipv6 locate the device even when the geo object is absent.
Identity. device.ifa is the mobile advertising identifier the Mobilewalla order is about. user.id , user.buyeruid , and the user.eids array carry exchange, buyer, and third-party identifiers.
Device fingerprint surface. device.ua or the structured device.sua , plus make , model , os , osv , screen dimensions, carrier, and connection type.
Context that classifies the person. site.page is the URL being read. app.bundle names the app in use, and the app itself is a signal: a bid request from a health tracker, a dating app, or a prayer app says something about its user before any other field is read. The content object can add title, genre, and language.
A stripped-down but realistic mobile request:
{
"id": "b7c1...",
"imp": [{ "id": "1", "video": { "mimes": ["video/mp4"] } }],
"app": { "bundle": "com.example.periodtracker" },
"device": {
"ifa": "8a6f3b2e-...",
"ip": "203.0.113.44",
"geo": { "lat": 52.2297, "lon": 21.0122, "type": 1, "accuracy": 10 },
"make": "Apple", "model": "iPhone15,3", "os": "iOS"
},
"user": { "id": "u-91f..." }
}
Every recipient of this request learns that a specific device, at specific GPS coordinates, is using a specific reproductive health app right now. That inference requires no data science. It is the payload, read once.
## The fan-out is the point
A single impression does not generate one bid request. The exchange fans it out to every connected bidder eligible for the auction, and resellers can fan it out again. Dozens to hundreds of companies can receive the payload for one ad slot, and exactly one of them wins. The rest received the data as the cost of asking them to bid.
The protocol has no mechanism to audit what recipients retain. HTTP requests do not come with a delete button. This is why the policy fight landed where it did: the FTC order does not change the protocol, it changes what a specific recipient is allowed to do with what the protocol delivered.
## What the protocol can say, and what it cannot do
OpenRTB carries the legal context alongside the data. The privacy signals : regs.gdpr flags GDPR scope, user.consent carries the TCF consent string, regs.gpp and gpp_sid carry the Global Privacy Platform string, regs.coppa flags children's services, and device.lmt says the user limited ad tracking, which should zero out ifa .
These fields describe obligations. They do not enforce them. A consent string is an instruction to the recipient, and the recipient's compliance happens in the recipient's infrastructure, invisible to the sender. The protocol's honest contribution to privacy is different: it gives the sender precise control over what goes into the request in the first place. Senders can truncate IPs, coarsen geo to city level, omit eids for unconsented traffic, and drop ifa when lmt is set. Every one of those is a field-level decision in code you own.
## If you send bid requests, you are publishing data
The practical takeaway for a seller or exchange is to treat the bid request as a publication, because that is what fan-out makes it. That means knowing exactly what your requests contain, per partner, per traffic type:
Inventory your emitted fields. Not what your docs say you send; what production actually sends. Paste a live request into the tester and read it as a stranger would.
Audit your ext blobs. SDKs and intermediaries attach custom ext objects that ride along unreviewed. Unknown fields are where surprising data hides.
Check the lmt and coppa logic. lmt=1 with a populated ifa is a contradiction your pipeline should catch, not your partner's compliance team.
Send privacy signals at the paths your partners read. A consent string at a path the recipient does not parse protects no one. Version mismatches turn correct signals into absent ones.
Minimize by default. Precision is a choice. If a buyer does not need GPS-grade coordinates to price your inventory, city-level geo bids nearly the same and publishes much less.
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field definitions referenced here are drawn from it; the analysis is our own. RTBlint is independent and not affiliated with IAB Tech Lab.
EPIC: FTC Takes Action Against Data Brokers for Selling Sensitive Location Data
Hunton: FTC Finalizes Orders Against Data Brokers Over Sensitive Location Data (January 2025)
Federal Register: Mobilewalla Inc., Analysis of Proposed Consent Order
EFF: Online Behavioral Ads Fuel the Surveillance Industry
OpenRTB 2.6 specification: Device, Geo, User, and Regs object definitions
---
# Will AI agents replace OpenRTB? Why the bid stream is the stable layer · RTBlint
URL: https://rtblint.org/blog/will-agents-replace-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## Will AI agents replace OpenRTB? Why the bid stream is the stable layer
July 11, 2026 · RTBlint
Every few weeks a new headline suggests AI agents are about to make real-time bidding obsolete. Agents negotiate deals in natural language, the argument goes, so who needs a microsecond auction protocol? The short answer is that the two things solve different problems, and both agentic stacks are being built directly on top of OpenRTB, not in place of it. Here is why the bid stream is the stable layer underneath the agent news.
## The claim, stated fairly
The strong version of the argument is real, not a strawman. If a buyer's agent can describe an outcome to a seller's agent, negotiate terms, and settle a deal in conversation, then a lot of the manual campaign setup that DSP interfaces exist for goes away. The Ad Context Protocol and IAB Tech Lab's AAMP are both racing to standardize exactly that conversation. So it is fair to ask whether the auction protocol underneath survives the shift.
It does, for four concrete reasons.
## 1. Negotiation and execution are different clocks
Agents negotiate at planning time: minutes or seconds, a conversation between two services. An impression still has to be auctioned while a person waits for a page to load, in the low tens of milliseconds. Those are different problems on different clocks. An agreement reached by agents still has to be executed, per impression, in real time, and the mechanism for that is an auction over a compact wire format. Agents decide the terms; OpenRTB executes them. Replacing the negotiation UI does not replace the auction.
## 2. Both stacks are built on OpenRTB, by design
This is the part the headlines miss. IAB Tech Lab's explicit strategy is to extend OpenRTB, AdCOM, VAST, and GPP rather than introduce competing standards; its CEO has argued the industry should build on "an existing shared foundation, not introduce multiple new standards that create fragmentation." AdCP takes the other governance path but the same technical one: a negotiated AdCP buy executes as a deal ID in imp.pmp.deals , a programmatic guaranteed line, or a direct tag. Neither stack emits a new auction protocol. One extends the bid request; the other hands its output to the bid request. OpenRTB is the substrate they both assume.
## 3. Even the most aggressive design rewrites, not replaces
IAB's Agentic RTB Framework is the boldest bet in the space: it puts agent services inside the auction path, letting them enrich and modify a bid request mid-flight. And even there, the output is still an OpenRTB bid request. ARTF changes who may touch the request and adds a provenance question about which fields an agent rewrote. It does not change what the request is. The most auction-native agentic proposal on the table is a transformer of bid requests, not a successor to them.
## 4. The installed base does not blink
OpenRTB has been the interoperability layer between thousands of exchanges and bidders since 2010, and it ships ordinary improvements on a roughly monthly cadence; the 2.6-202606 snapshot added live-content fields and pricing macros while the agent news ran. A format that much infrastructure speaks, and that is still actively maintained, does not get displaced by a negotiation layer sitting above it. It gets a new client.
## What actually changes
None of this means nothing changes. Three things genuinely shift, and they are worth preparing for:
Who decides. More of the buying decision moves from a human in a UI to an agent reasoning over signals. The output is still a bid request, but it is now a generated bid request.
Provenance. With ARTF-style agents in the path, you need to know which stage produced or altered which fields, and validate after the ones that can rewrite a request.
Trust artifacts. adagents.json joins ads.txt, sellers.json, and schain as something buyers reconcile before honoring an agent-sourced deal.
## Why validation matters more, not less
When a human built a campaign, an error in the request traced back to a config screen. When an agent assembles or rewrites the request, the OpenRTB is generated, and generated JSON drifts the way all generated JSON does: a plausible field in the wrong path, a consent string left in ext , an enum value that used to be valid. None of it throws. It just costs bids or breaks compliance. An agent that can build a bid request should be able to check it against the spec before it ships one, the same way a developer runs a linter before a commit.
That is the durable role for a validator. RTBlint runs client-side in the tester , as a CLI for pipelines, and as an MCP server an agent can call as a tool. Whichever agentic stack wins, the transaction still resolves to OpenRTB on the wire, and the wire still has to be right. The bid stream is not the thing getting replaced. It is the thing everything else is being built to talk to.
## Sources
RTBlint: AAMP, AdCP, and the bid stream (news analysis)
IAB Tech Lab: Agentic Advertising and AI initiatives
Ad Context Protocol specification repository
---
# OpenRTB 2.6-202606, field by field: live content and discount macros · RTBlint
URL: https://rtblint.org/blog/openrtb-2-6-202606-field-by-field/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Spec release
## OpenRTB 2.6-202606, field by field: live content and discount macros
July 8, 2026 · RTBlint
OpenRTB 2.6-202606 shipped on June 11, 2026, the first dated snapshot in just over a year. Our agentic roundup flagged it in passing; this is the field-by-field version we promised. Two things shipped, both aimed at live and linear content, and one of them is a semantic change to an existing field rather than a new attribute. If you sell CTV inventory, the migration matters more than the additions.
## What shipped
The snapshot was proposed for public comment on April 28, 2026 and released on June 11. It touches two areas of the spec, plus mirrored additions in AdCOM:
Three fields on the Content object (Section 3.2.16): two new attributes, realtime and firstbroadcast , and a redefinition of the existing livestream field.
Two substitution macros (Section 4.4): ${AUCTION_DISCOUNT_PCT} and ${AUCTION_DISCOUNT_CPM} , with the description of ${AUCTION_PRICE} updated to match.
Nothing here is a breaking change. The version number stays 2.6 because, since 2.6-202211 , the number only moves on breaking changes; everything else lands as a dated snapshot. But a redefinition is not an addition, and that is where the work is.
## The three live-content fields
The motivation is the same live-sports CTV surge behind the pod bidding toolkit . Live inventory prices differently from a replay, and a replay prices differently from a premiere, so sellers needed three independent axes to describe what a viewer is actually watching. Here is exactly what each field now says.
content.livestream (integer) kept its name and type but changed what it means, and that is the change to watch. Before 202606 the field flagged whether content was live at all: 0 was "not live" and 1 was "content is live." From 202606 it flags whether the broadcast is scheduled : 0 is on-demand or user-initiated (VOD), and 1 is scheduled, linear viewing. Same field, different question. The "is it live right now" idea left this field entirely and became its own attribute.
content.realtime (integer), new, is where "live right now" landed. It is set to 1 when the event is happening in real time as it is watched, a live sports game being the canonical case, and 0 when it is not, such as a replay.
content.firstbroadcast (integer), new, is a premiere flag independent of the other two: 1 the first time the content reaches an audience, and 0 for every showing after that.
Because the three axes are independent, a single piece of content can sit at any corner of the cube. That is the point: a live final and its rerun are the same content with different value, and buyers can now tell them apart.
Content livestream realtime firstbroadcast
-------------------------------------------------------------------------
Live cup final, airing now 1 1 1
Rerun of that final on a linear feed 1 0 0
Same final, on demand after the fact 0 0 0
On-demand premiere of a new series 0 0 1
## Why the redefinition is the risky part
Additions are safe. A parser that has never heard of realtime ignores it and loses nothing it had before. The redefinition is different, because the field name did not change and the type did not change. Only the meaning did.
If your exchange or SSP populates livestream=1 today to mean "a live event is in progress," that request is now making a different claim under the new snapshot: it says the content is scheduled or linear, which may be true for a live game but is false for a live blog or a user-initiated stream that used to qualify. A buyer reading the field under 202606 semantics, and pricing on it, will read your old data wrong. Nothing errors. The bid math just drifts.
The two failure directions worth checking:
Over-claiming linear. Content you marked livestream=1 for "live blog" or an unscheduled stream is not scheduled linear viewing. Under the new definition it should be livestream=0 with realtime=1 .
Losing the "live now" signal. Anything genuinely live needs realtime=1 going forward. If you only ever set livestream , buyers lose the real-time signal the moment they adopt the new reading.
## The two discount macros
The second half of 202606 is about money. Two new substitution macros let a seller communicate a net price to a DSP through win and billing notices instead of a side channel:
${AUCTION_DISCOUNT_PCT} : the discount percentage applied by the seller, expressed as a percentage of the bid price.
${AUCTION_DISCOUNT_CPM} : the same discount, expressed as a CPM.
To keep the accounting coherent, the definition of ${AUCTION_PRICE} was updated so the clearing price a seller reports is understood as the post-discount figure, with the two new macros exposing how that figure was derived. Like every macro, these expand in the win, billing, and loss notice URLs and in markup; they are optional, and a seller populates them only if it has a discount to communicate.
## What to do this week
Audit livestream before your fixtures drift. Find every path that sets content.livestream and confirm it means "scheduled or linear," not "live in progress." Move the live-now cases to realtime .
Plan realtime and firstbroadcast for CTV. Any seller of live or premiere inventory now has a standard way to say so. The CTV reference covers where these sit alongside the pod bidding fields.
Decide on the discount macros if you emit win notices. Choose whether to populate ${AUCTION_DISCOUNT_PCT} or ${AUCTION_DISCOUNT_CPM} before a buyer asks for net pricing.
Pin your validation. RTBlint's rule catalog currently runs through the 2.6-202505 snapshot; catalog support for the 202606 attributes is in progress. If you gate builds on validity, stay pinned to 202505 until your livestream semantics are migrated, then re-pin, as described in the CLI docs .
To sanity-check a content-heavy request against the current snapshot, paste it into the bid request tester , and to gate it automatically, see OpenRTB validation in CI .
## Sources
The OpenRTB specification is published by IAB Technology Laboratory under a Creative Commons Attribution 3.0 License . Field names and definitions referenced here are drawn from it; the analysis is our own. RTBlint is independent and not affiliated with IAB Tech Lab.
OpenRTB 2.6-202606 release notes, GitHub (InteractiveAdvertisingBureau/openrtb2.x)
IAB Tech Lab: new OpenRTB attributes including live content, for public comment (April 28, 2026)
OpenRTB 2.6 specification text, Section 3.2.16 (Object: Content) and Section 4.4 (Substitution Macros)
---
# AAMP, AdCP, and the bid stream: where agentic advertising actually touches OpenRTB · RTBlint
URL: https://rtblint.org/blog/aamp-adcp-openrtb-2026/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Agentic
## AAMP, AdCP, and the bid stream: where agentic advertising actually touches OpenRTB
July 5, 2026 · RTBlint
Six months into 2026, agentic advertising has two standards bodies, two protocol stacks, and a public disagreement about which one the industry needs. For the people who maintain bid streams, the useful question is narrower than the headlines: what, if anything, changes in the JSON? The honest answer is almost nothing yet, with two exceptions worth understanding now. One agentic framework wants to run inside your auction path, and while the agent news cycle ran, OpenRTB shipped its first dated snapshot in over a year.
## Two stacks, two theories of where agents belong
The Ad Context Protocol (AdCP) launched on October 15, 2025 with six founding members: Yahoo, Optable, PubMatic, Scope3, Swivel, and Triton Digital, plus a longer list of launch partners including Magnite, Raptive, and The Weather Company. It is governed by AgenticAdvertising.org (AAO), a trade organization formed in 2025 specifically to steward it. AdCP is built on Anthropic's Model Context Protocol, with Agent2Agent (A2A) as a second transport, and defines tasks for media buying, creative, signals, and audience activation. The spec now sits on a 3.0 release line under an Apache 2.0 license, split into a negotiation layer (agents discovering inventory and agreeing on terms at planning time) and a serve-time layer called Trusted Match for impression-level decisions. In January 2026, the reference sell-side implementation moved to Prebid.org as the Prebid Sales Agent: Prebid maintains the software, AAO keeps the protocol.
IAB Tech Lab spent the same months building a parallel stack. Its 2026 roadmap put agentic advertising at the center, and the concrete pieces followed: Agentic Audiences v1.0 in November 2025, the Agentic RTB Framework (ARTF) through public comment ending January 15, 2026, and the umbrella Agentic Advertising Management Protocols (AAMP) v1.0 on January 28, 2026, organized into three pillars (foundations, protocols, trust) with buyer and seller agent SDKs on GitHub. The positioning is explicit: extend OpenRTB, AdCOM, VAST, and GPP rather than introduce new standards. CEO Anthony Katsur has said the fastest way forward is "to build on an existing shared foundation, not introduce multiple new standards that create fragmentation," and, more pointedly about AdCP, that the industry did not need another trade group. AAO, for its part, keeps shipping. Nobody has blinked.
## Where each one touches the bid stream
AdCP mostly lives above the bid stream. An AdCP media buy is negotiated between agents over MCP or A2A, and what comes out the other end executes through the pipes that already exist: a deal ID in imp.pmp.deals , a programmatic guaranteed line, a direct tag. If your job is parsing OpenRTB, agentic demand arrives looking like any other deal. The part worth watching is the trust plumbing: adagents.json , served at /.well-known/adagents.json , is a publisher's declaration of which sales agents may represent its inventory, with scoped authorization (placement IDs, country restrictions, date windows, signing keys) that goes well beyond what ads.txt can express. It sits naturally beside ads.txt, sellers.json, and schain in the verification stack, and buyers will eventually want to reconcile all four.
ARTF is the opposite bet: agents inside the auction path. It specifies a containerized execution model where a host (an exchange or DSP) runs third-party agent services co-located in its own infrastructure, talking gRPC with Protocol Buffers, enriching and modifying bid requests mid-auction. Proponents claim large latency wins over server-to-server hops. For anyone who validates bid streams, the implication is provenance: under ARTF, the request that reaches a bidder may have been rewritten by a third-party container between the publisher and the auction. Which fields an agent may touch, and how that is audited, will matter as much as the transport. Version 2.0 is already underway, so the answer is still being written.
## Meanwhile, OpenRTB shipped a snapshot
While the agentic announcements stacked up, the Programmatic Supply Chain Commit Group did ordinary spec work. Proposed for public comment on April 28, 2026 and shipped on June 11 as OpenRTB 2.6-202606, it is the first dated snapshot since 2.6-202505, closing at just over a year the gap our January roadmap post flagged. It contains two things, neither of them agentic.
First, programming liveness. Two attributes were added to Object: Content in both OpenRTB and AdCOM: realtime (is the event happening in real time while it is being watched: 1 for a live sports game, 0 for a replay) and firstbroadcast (is this the first time the content is available to an audience). Alongside them, the existing content.livestream field was redefined. The old text read "0 = not live, 1 = content is live (e.g., stream, live blog)"; it now reads "0 = the broadcast is not scheduled (e.g. it is VOD or otherwise user initiated), 1 = the broadcast is scheduled (also referred to as linear viewing)." That is a semantic shift, not a clarification: livestream now means scheduled-versus-on-demand, and "live right now" moved to realtime . A replayed football match on a linear channel is livestream=1, realtime=0 . If your pipeline populates livestream to mean "live event in progress," it is now saying something else. The motivation is the same live-sports CTV surge behind the pod bidding toolkit : live inventory prices differently, and sellers needed three separate axes to describe it.
Second, money. Two substitution macros were added: ${AUCTION_DISCOUNT_PCT} (a seller discount as a percentage of the bid price) and ${AUCTION_DISCOUNT_CPM} (the same discount as a CPM), with an updated description of ${AUCTION_PRICE} to match. These let a seller communicate net pricing to a DSP through win and billing notices instead of side channels.
RTBlint's rule catalog currently runs through the 2.6-202505 snapshot; a field-by-field 202606 review, and catalog support for the new attributes, is next on our list. If you gate builds on bid request validity, this is exactly the situation snapshot pinning exists for: stay pinned to 202505 until you have migrated your livestream semantics, then re-pin, as described in the CLI docs .
## What to do now
Nothing in AAMP v1.0 or AdCP 3.0 changes a bid request today. The 202606 snapshot does. If you sell or represent live inventory, audit how livestream is populated before the new definition and your fixtures drift apart, and plan realtime and firstbroadcast for anything genuinely live. If you emit win notices, decide whether you will populate the discount macros before a partner asks. If you already parse ads.txt and sellers.json, start watching adagents.json : it is where agentic authorization is accumulating. And keep running requests through the bid request tester ; whichever agentic stack wins, the transactions still have to come out as valid OpenRTB on the other side.
## Sources
IAB Tech Lab: Agentic Advertising and AI initiatives (AAMP v1.0)
IAB Tech Lab: ARTF (Agentic Real Time Framework)
VideoWeek: Industry coalition launches Ad Context Protocol (October 15, 2025)
Ad Context Protocol specification repository
Prebid announces Prebid Sales Agent in collaboration with AgenticAdvertising.org
AgenticAdvertising.org: adagents.json
The Current: IAB Tech Lab, not a fan of AdCP, releases an agentic advertising framework
IAB Tech Lab: new OpenRTB attributes including live content for public comment
OpenRTB 2.6-202606 release notes
---
# CTV pod bidding grows up: duration floors, guaranteed deals, and live sports · RTBlint
URL: https://rtblint.org/blog/ctv-pod-bidding-2026/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · CTV
## CTV pod bidding grows up: duration floors, guaranteed deals, and live sports
June 24, 2026 · RTBlint
Pod bidding has been in OpenRTB 2.6 since 2022, but 2026 is the year it stops being optional. The Trade Desk has told publishers it wants long-form video ad breaks delivered as pods across its entire supply path by August 31, 2026, and IAB Tech Lab spent the spring adding live-content signals to the spec because a live sports break cannot be treated like an on-demand one.
## Why now: live sports breaks the slot-by-slot model
Selling a commercial break one slot at a time works fine for on-demand video, where a viewer's ad break is assembled once, at their own pace. Live sports removes that slack. Millions of concurrent viewers hit the same break at once, and if every slot in every break is its own bid request, the request volume multiplies with the audience. FreeWheel has described the shift to pod-level bidding as a way to cut that multiplication down to something an exchange can actually clear in the seconds available during a live event, rather than a slot-by-slot auction for every viewer.
That is the forcing function behind the fields OpenRTB 2.6 added for pods: imp.video.podid (and imp.audio.podid ) group impressions that belong to the same break, podseq marks whether a pod is the first, last, or any pod in the content stream, and slotinpod (replacing the deprecated video.sequence ) marks position within the pod. The field that matters most for live TV specifically is rqddurs : an array of the exact durations a creative may run. It exists because live breaks cannot absorb padding or trimming the way a stored asset can, dead air or a truncated end card is visible to the whole audience at once. rqddurs is mutually exclusive with minduration / maxduration ; a request sets one pair or the other, never both.
## Structured pods, dynamic pods, and where the money is
OpenRTB 2.6 supports two pod shapes. A structured pod is one imp per slot, all sharing a podid , for breaks with a fixed, known geometry. A dynamic pod is a single imp carrying poddur (total seconds available in the break) and maxseq (maximum number of ads that may fill it), letting bidders return creatives of different lengths and letting the ad server assemble the break from whatever wins. Trade press on 2026 rollouts describes the industry as being in a bridge period: dynamic pods are what is actually shipping now, with structured pods, where a buyer can reserve a specific position in the break, described as the next step once dynamic podding is running end to end.
Pricing follows the same split, and it shipped in two stages. A structured slot prices like any other impression, with an ordinary bidfloor . A dynamic pod cannot: a 15-second spot and a 60-second spot filling the same poddur are not the same product. The 2022 base release (2.6-202204) already covered the open-auction side of that with mincpmpersec on imp.video and imp.audio , a floor priced per second of duration rather than per impression. The 2.6-202309 dated snapshot then extended duration-aware pricing two ways. First, durfloors : an array of DurFloors objects, each with mindur , maxdur , and a bidfloor , at imp.video.durfloors , imp.audio.durfloors , and Deal.durfloors , letting a floor vary across several duration bands instead of one flat per-second rate. Second, two deal-level fields: Deal.guaranteed , a boolean marking a deal as a guaranteed buy rather than a floor to bid against (the field is spelled out in full, not abbreviated to guar ), and Deal.mincpmpersec , the deal-scoped counterpart to the imp-level field, which floors per-second pricing for the guaranteed or negotiated slice of a pod rather than its open-auction slice. Full field paths and defaults are on the bid floors page .
## What shipped this spring: live-content signals
In April 2026, IAB Tech Lab's Programmatic Supply Chain Commit Group opened public comment (through May 28) on a further OpenRTB and AdCOM change aimed squarely at live sports: two new Content object attributes, content.realtime and content.firstbroadcast , plus an updated description for the existing content.livestream field. The goal is to let a seller distinguish content that is happening at this exact moment from content that is merely streamed live but pre-recorded, and from a program in its first broadcast window versus a rerun, since buyers price all three differently. The same proposal updates the $ { AUCTION_PRICE } macro description and introduces two new ones, $ { AUCTION_DISCOUNT_PCT } and $ { AUCTION_DISCOUNT_CPM } , for communicating discounting on win notices. As of this writing the comment window has closed; whether these attributes land in the next dated snapshot is worth tracking if you sell live sports inventory.
## What is actually verifiable about adoption
It is easy to overstate how far pod bidding has spread, so here is what is publicly on record rather than an estimate. The Trade Desk has stated a target of transitioning its full publisher supply path to pod bidding by the end of August 2026, and FreeWheel and Index Exchange have both described 2026 as the year demand partners roll out podded requests at scale. There is at least one named, quantified result: Index Exchange reported that DSP StackAdapt, after adopting its ad podding for streaming TV in mid-2025, saw a 71% average reduction in queries per second, a 25% increase in win rate at peak times, and a 39% drop in creative duplication errors, consolidating what had been separate bid requests for each 15- or 30-second slot in a 90-second break into single podded transactions.
That is one SSP-DSP pairing's case study, not an industry-wide adoption rate, and no source found for this article publishes a measured percentage of total CTV volume running through pod fields today. Treat pod bidding in mid-2026 as a large, named-partner rollout in progress with at least one public efficiency result behind it, not a completed industry transition, and verify against your own partners' documentation before assuming a given DSP or SSP sends or expects pod fields on a given deal.
## What to check this week
If you run CTV inventory, the failure mode to watch for is a pod field landing in the wrong place, an ext block, or an old field like video.sequence still in use instead of slotinpod . Paste a sample request into the bid request tester to check pod and duration-floor fields against the current 2.6 snapshot, or run the same checks in CI with the CLI . The full field-by-field rundown, including rwdd and ssai , is on the CTV protocol page ; floor mechanics and the Deal.guaranteed / Deal.mincpmpersec paths are on the bid floors page .
## Sources
Digiday, "Future of TV Briefing: Ad tech's pod bidding push moves CTV toward advancing the live sports ad model in 2026"
IAB Tech Lab, "IAB Tech Lab Announces New OpenRTB Attributes, Including Live Content, For Public Comment"
InteractiveAdvertisingBureau/openrtb2.x, Issue #172: live content signaling proposal
OpenRTB 2.6 specification
ppc.land, "StackAdapt achieves 71% QPS reduction with Index Exchange podding"
---
# OpenRTB 2.6-202505: what changed and what to do about it · RTBlint
URL: https://rtblint.org/blog/openrtb-2-6-202505-what-changed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Spec release
## OpenRTB 2.6-202505: what changed and what to do about it
June 10, 2026 · RTBlint
IAB Tech Lab published the 2.6-202505 dated snapshot of OpenRTB on May 20, 2025. The headline change is a new cids attribute on the Data object, which gives video and audio content a standard way to carry Extended Content Identifiers. Two smaller corrections shipped alongside it: a reworded content.id description and a type fix on genres .
## What actually shipped
The GitHub release notes for tag 2.6-202505 list four items. Read against the current 2.6.md spec text, they break down like this:
Addition of cids to the Data object (Section 3.2.21). A new attribute, type string array, on the same Data object used for segment and data-provider entries attached to user.data or content.data .
Implementation guidance for Extended Content Identifiers , added as a new Section 7.14 in the companion implementation guide.
Deprecation of the Extended Content Identifiers community extension that bidders previously used as a stopgap before this became a first-class field.
An updated content.id description in the Content object (Section 3.2.16), plus an errata fix changing genres from an integer array to a string array so genre IDs can include letters.
## The new field: data.cids
The spec defines cids as: "An array of Extended Content IDs, representing one or more identifiers for the video or audio content from the ID source specified in the name field of the data object." It lives on the Data object, not on Content directly, so the full path in a bid request is content.data[].cids (or user.data[].cids if a data provider is attaching content IDs to user-level data instead).
The implementation guide explains the problem this solves. A content data platform aggregates video or audio metadata from publishers and assigns each piece of content an ID unique within that platform, an "Extended Content ID." A publisher passes that ID and its source through the bid request; a contextual data vendor on the buy side uses it to look up classifications for the same content without the exchange needing to broker that metadata directly. Before 2.6-202505, exchanges did this through a community extension. The new field standardizes it.
Two rules from the spec text are worth calling out directly, since they are easy to get wrong:
cids should only ever carry the external system's content ID. The guide is explicit that passing anything else is discouraged.
cids is not for genre or category classification. That is still content.genres and content.cat . Extended Content IDs identify one piece of content; they are not taxonomy values.
The provider or source of a given Extended Content ID is expected to pick a root domain it owns and consistently identify itself that way in the name field, similar to how bidder namespaces work elsewhere in the spec. The implementation guide's JSON example shows the shape:
{
"app": {
"content": {
"id": "video_123",
"data": [
{
"name": "vendorA.com",
"cids": ["vendorA_c73g5jq96mwso4d8"],
"segment": [
{ "id": "context_5784065" },
{ "id": "context_5711828" }
]
}
]
}
}
}
Multiple vendors can appear as separate entries in the data array, each with its own namespaced cids values pointing at the same underlying content.
## The two smaller corrections
content.id now reads simply: "Publisher-provided ID uniquely identifying the content." The clarifying note added alongside the cids work is that content.id is for the seller's own content ID, while IDs from external content classification services belong in content.data[].cids , namespaced by vendor. Mixing the two, for example putting a third-party content-platform ID into content.id , defeats the point of having a separate field.
content.genres changed type from integer array to string array. This is an errata correction, not a new field: the taxonomy IDs it points to already contain letters, so an integer-only type was wrong. Any strict schema validation that assumed genres was numeric will need updating regardless of whether an organization touches Extended Content Identifiers at all.
## What this means for exchanges and bidders
None of this changes required fields or breaks existing requests: cids is additive, and the other two changes are documentation and type corrections rather than behavior changes. The integration work is mostly on the reading and validating side:
Exchanges that already pass content IDs through a proprietary or community-extension field should plan a move to content.data[].cids , since the community extension it replaces is now marked deprecated in the spec.
Bidders with contextual data vendors should check whether their JSON schema or request parser recognizes cids as a valid attribute on the Data object. A schema that rejects unknown fields will drop it silently rather than error, which is the failure mode worth testing for.
Anyone validating content.genres against a numeric type needs to widen that check to strings, or validation will reject legitimate alphanumeric genre IDs.
RTBlint's own catalog tracks the data.cids addition as of this writing (rule openrtb.2.6-202505.data.cids ), which flags the field as a documented 2.6-202505 addition when it appears in a request. It does not yet carry separate rules for the content.id wording change or the genres type correction, since neither introduces a new field to check for.
## What to check this week
Run a sample content-heavy bid request, ideally one with content.data entries from a contextual vendor, through the browser tester to see whether cids parses and whether your existing fixtures still validate under the current dated snapshot. If you run validation in CI, the Rust CLI checks the same rules against a request file:
rtblint validate request.json
For the full list of what each dated snapshot changed since 2.6-202211, see the dated snapshots explainer , and for every rule RTBlint currently checks, browse the rule catalog .
## Sources
OpenRTB 2.6-202505 release notes, GitHub (InteractiveAdvertisingBureau/openrtb2.x)
OpenRTB 2.6 specification text, Section 3.2.21 (Object: Data) and Section 3.2.16 (Object: Content)
OpenRTB implementation guide, Section 7.14, Using Extended Content Identifiers
---
# The User-Agent string is going away: sua, client hints, and what to send now · RTBlint
URL: https://rtblint.org/blog/ua-client-hints-sua/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Signals
## The User-Agent string is going away: sua, client hints, and what to send now
May 20, 2026 · RTBlint
Chrome finished reducing its default User-Agent string back in Chrome 113, in April 2023. Three years on, most of the industry has stopped thinking about it, but a lot of device-detection code still leans on device.ua as if it carried the detail it used to. OpenRTB 2.6 shipped the fix at launch: a structured device.sua object built on User-Agent Client Hints. It is worth re-checking who in your stack is actually populating and parsing it.
## What UA reduction broke
Google rolled out User-Agent reduction in Chrome across seven phases through early 2023, freezing or removing the parts of the UA string that used to identify a device: minor and build version numbers collapsed to 0.0.0 , desktop OS versions were unified to static placeholder values, and on Android the device model was replaced with the literal character K and the OS version frozen to 10 regardless of the real one. A UA string that used to tell a bidder "Pixel 8, Android 14" now says nothing more specific than "some Android phone." Any pipeline that inferred device model, exact OS version, or precise browser build from device.ua lost that signal, not gradually, but at a fixed cutover per phase.
## The replacement: device.sua
The UserAgent object (OpenRTB 2.6, Section 3.2.29) carries structured data sourced from User-Agent Client Hints and hangs off device.sua . It has been part of the base 2.6 spec since release, not a later dated-snapshot addition. Each brand/version pair uses a nested BrandVersion object (Section 3.2.30): a required brand string plus a version array of components in descending order (major, minor, micro, ...).
Field Type Note
browsers array of BrandVersion Derived from Sec-CH-UA-Full-Version-List
platform BrandVersion Derived from Sec-CH-UA-Platform / -Platform-Version
mobile integer 1 = prefers mobile content, 0 = prefers desktop content
architecture string e.g. "x86", "arm", from Sec-CH-UA-Arch
bitness string e.g. "64", from Sec-CH-UA-Bitness
model string Device model, from Sec-CH-UA-Model
source integer, default 0 AdCOM User-Agent Source list: 0 unknown, 1 low entropy UA, 2 client hints
A minimal example on an Android request:
"device": {
"ua": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 ...",
"sua": {
"browsers": [
{ "brand": "Chromium", "version": ["124"] },
{ "brand": "Not.A.Brand", "version": ["24"] }
],
"platform": { "brand": "Android", "version": ["14"] },
"mobile": 1,
"architecture": "arm",
"model": "Pixel 8",
"source": 2
}
}
## device.sua takes precedence over device.ua
The spec is explicit about ordering: "If both ua and sua are present in the bid request, sua should be considered the more accurate representation of the device attributes. This is because the ua may contain a frozen or reduced user agent string." That is a directive to bidders, not just a note about which field is newer: when both are present, device-detection logic should read device.sua first and fall back to device.ua only when sua is absent. Full object anatomy, including where device.sua sits relative to the rest of Device , is on the bid request doc .
## What sellers should populate, what buyers should parse
On the sell side, the spec still recommends always populating ua with whatever User-Agent string the device provides, even a reduced one, for backward compatibility, and populating sua whenever the client supports Client Hints (in practice, Chromium-based browsers and their mobile equivalents; Client Hints are not universal across all browser engines). That means exchanges need a real pipeline for reading the Sec-CH-UA-* request headers, or the equivalent NavigatorUAData accessor client-side, and mapping them onto the UserAgent object rather than leaving sua empty by default.
On the buy side, device-detection logic that still keys exclusively off device.ua is working from a degraded signal on any traffic where sua is available and unused. Model, platform version, and architecture are the fields most worth wiring up first, since those are exactly what UA reduction removed from the string.
## Validation angle: sua type mistakes
The most common structural bug is treating browsers or platform as a single object instead of following the spec: browsers is an array of BrandVersion objects (a device can report multiple brands, including deliberately fake "greased" ones like Not.A.Brand used to prevent UA sniffing), while platform is a single BrandVersion object, not an array. The second common bug is sending version as a string ( "14.0.1" ) instead of the required array of components ( ["14", "0", "1"] ). Both are exactly the kind of type mismatch that fails silently in loosely typed pipelines and shows up later as garbage device-detection output rather than a rejected request.
## What to check this week
Run a sample request with both device.ua and device.sua through the bid request tester to confirm sua.browsers and sua.platform are structured correctly and sua.version arrays are not flattened into strings. The same checks run in the Rust CLI for CI. If your device-detection vendor or in-house logic has not been updated to prefer sua over ua when both are present, that is worth raising this week rather than after the next round of Chromium changes narrows the UA string further.
## Sources
OpenRTB 2.6 specification, Objects: UserAgent and BrandVersion
Chromium: User-Agent Reduction
Privacy Sandbox: User-Agent reduction
User-Agent Client Hints (WICG draft)
---
# DSA transparency in OpenRTB: where enforcement stands in 2026 · RTBlint
URL: https://rtblint.org/blog/dsa-transparency-2026/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## DSA transparency in OpenRTB: where enforcement stands in 2026
May 6, 2026 · RTBlint
Two years after the EU Digital Services Act became fully applicable in February 2024, the harmonized transparency reporting rules for online platforms took effect in mid-2025, and the first reports under that framework were published in February 2026. The ad-tech side of DSA compliance runs through a single OpenRTB community extension: regs.ext.dsa on the request and bid.ext.dsa on the response. Here is what the extension actually asks for, and what is and is not verifiable about who enforces it.
## What the DSA requires, in ad-tech terms
Article 26 of the Digital Services Act requires online platforms to disclose, for every ad shown to a user in the EU, who the ad was for, who paid for it, and (for very large platforms) meaningful information about the targeting parameters used to select it. That disclosure has to be populated at serve time, which means the data has to travel through the bid stream, not get attached after the fact. IAB Tech Lab published a community extension for this in January 2024, stewarded by its Global Privacy Working Group in partnership with IAB Europe, which provides policy-level implementation guidance while Tech Lab maintains the technical spec.
## The request shape: regs.ext.dsa
The extension sits under regs.ext.dsa in a 2.6 request. It has not been promoted to a first-class Regs field, so unlike gpp or gdpr it stays inside ext and is versioned separately from OpenRTB itself.
dsarequired (integer): whether the publisher expects a DSA transparency object on the bid response, detailed in the table below.
pubrender (integer): the publisher's capability and intent to render the transparency notice to the user. 0 means the publisher cannot render it, 1 means the publisher could render it depending on the buyer's adrender value, and 2 means the publisher will render it regardless.
datatopub (integer): controls whether transparency data should be sent back to the publisher independent of who renders it, from 0 (do not send) to 2 (send transparency data).
transparency (array): one object per entity applying targeting parameters, each with a domain string and a dsaparams integer array (for example, 1 for profiling, 2 for basic advertising, 3 for precise geolocation).
dsarequired Meaning
0 Not required. No DSA object expected on the bid response.
1 Supported. Bid responses with or without a DSA object will both be accepted.
2 Required. Bid responses without a DSA object will not be accepted.
3 Required, and the publisher is itself an Online Platform under the DSA. Bid responses without a DSA object will not be accepted.
Full field paths for this and every other regulatory signal in a 2.6 request are on privacy signals in OpenRTB .
## The response shape: bid.ext.dsa
A compliant bid answers back with its own bid.ext.dsa object: behalf (up to 100 characters naming who the ad is displayed on behalf of), paid (up to 100 characters naming who paid for it, required even when it matches behalf ), its own transparency array describing which parameters the buy side applied, and adrender (0 or 1) indicating whether the buyer will render the notice itself. When dsarequired is 2 or 3, a bid response missing this object is non-compliant and, per the spec's own language, should not be accepted.
## What dsarequired means operationally
In practice dsarequired is the field that turns a legal obligation into a bidding decision. A value of 2 or 3 means a bidder that cannot populate bid.ext.dsa should not bid at all on that impression, since the response will be rejected regardless of price. A value of 0 or 1 means the extension is informational for that request. The dsarequired: 3 case, where the publisher itself is an Online Platform under the DSA, is the strictest: it applies to large publisher-side platforms with their own direct Article 26 obligations, distinct from an SSP or ad network passing traffic through on their behalf.
## Who requires it now
What is verifiable publicly: the DSA has applied in full since February 17, 2024, an EU Implementing Regulation standardizing transparency reporting templates took effect July 1, 2025, and the first reports under that harmonized format were published in February 2026. IAB Europe has run an ongoing call for industry adoption of the OpenRTB DSA extension and published implementation guidance for it. What is not independently verifiable from public sources is a complete list of which specific European exchanges or SSPs currently reject bid responses lacking bid.ext.dsa at the transaction level; that behavior is a per-platform bidding policy, not something the DSA regulatory text or the OpenRTB extension itself mandates as universal. If you operate in EU traffic, the reliable way to find out is to check what your specific demand or supply partners send and require, not to assume industry-wide enforcement uniformity.
## What to check in your own requests
Confirm regs.ext.dsa.dsarequired is present and correctly typed as an integer 0-3 on EU traffic, that pubrender and datatopub are set to values your rendering pipeline actually matches, and that every transparency entry carries a real domain rather than a placeholder. On the bid side, verify behalf and paid are populated whenever dsarequired is 2 or 3, since an empty or missing value there is the most common way a compliant-looking bid gets rejected downstream. Run a sample request and response pair through the bid request tester or the CLI to catch type mismatches and unknown keys under ext.dsa before they show up as silent bid loss.
## Sources
DSA Transparency community extension spec (openrtb repository)
IAB Tech Lab: Digital Services Act (DSA) Transparency
IAB Europe: industry adoption of the DSA Transparency OpenRTB extension
European Commission: harmonized DSA transparency reporting rules now in effect
---
# Three years of plcmt: the state of the placement migration · RTBlint
URL: https://rtblint.org/blog/plcmt-migration-three-years/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Video
## Three years of plcmt: the state of the placement migration
April 15, 2026 · RTBlint
OpenRTB 2.6-202303 deprecated video.placement in favor of video.plcmt back in April 2023. Three years later, the two fields are still riding together in most video bid requests we see. That is not a failure to migrate so much as the migration's actual shape: a slow, partner-by-partner reclassification of inventory that, for a meaningful share of supply, does not reprice favorably.
## What changed, briefly
video.placement used a five-value list (1 In-Stream, 2 In-Banner, 3 In-Article, 4 In-Feed, 5 Interstitial/Slider/Floating) that described where a player sat on the page and nothing about whether the user asked for the video or whether the sound was on. video.plcmt , added in the same 2.6-202303 dated snapshot, uses a different four-value list (1 Instream, 2 Accompanying Content, 3 Interstitial, 4 No Content/Standalone) built around the MRC's tightened definition of instream: sound-on by default at player start, or explicit user intent to watch, with the video as the focus of the visit. The two enums do not map one to one, which is the entire reason this migration has taken three years instead of one release cycle. We cover the full value tables and the field-by-field mapping in placement vs plcmt in OpenRTB video ; this piece is about where the industry actually stands on adopting it.
## Why it was contentious: reclassifying means repricing
The old list let muted, autoplay video players embedded next to editorial content claim placement=1 In-Stream, the same code used for genuine pre-roll on requested content. Trade press coverage of the rollout put accompanying-content supply, video that plays alongside text rather than being the reason for the visit, at roughly 30% of online video volume that had been sold under the old In-Stream label. Under plcmt , that inventory reclassifies as plcmt=2 Accompanying Content, not plcmt=1 Instream, because it fails the sound-on and user-intent test.
That reclassification has a price attached. When Google began requiring video.plcmt on AdX bid requests in April 2024, publishers testing the new classification against buyer demand reported video revenue drops ranging from 20% to 63% depending on how much of their inventory was autoplay-heavy, with roughly 15% average declines reported across several SSPs. That is the real reason plcmt adoption has been slow and uneven: it is not a technical migration, it is an honest, partner-by-partner disclosure that some previously premium-priced inventory is not what it was sold as.
## Why dual-sending is still the norm
The IAB's own implementation guide never asked publishers to cut over. Section 7.10 of the OpenRTB 2.6 implementation guide ("Updated Video Signals"), subsection 7.10.2, spells out the transition pattern directly: a publisher that wants to support both should send the legacy value for In-Stream on the legacy placement attribute and the updated Instream value on plcmt , in the same video object. Three years in, that is still what most of the supply side does, because the demand side has not finished migrating off the old field.
Trade coverage from August 2024 put six of the top ten DSPs as not yet reading plcmt at all, with Google, The Trade Desk, and Basis Technologies among the adopters at that point. Prebid.js only made gathering plcmt a requirement alongside placement in its version 9 release, and stopped letting its ORTB converter infer placement from ad unit context rather than an explicit value. Individual adapter issues from that release cycle show the lag in the wild: publishers reported ad servers and adapters that still only read video.placement and had no plcmt support yet, meaning dropping the legacy field on those integrations would have gone straight to a silent classification failure. There is no forcing function here besides confirming, demand partner by demand partner, that the new field is actually being read before you stop sending the old one.
## What buyers key on now
The demand-side posture has hardened since the early skepticism. DV360 has required video.plcmt on AdX bid requests since April 2024, and Prebid.js adapter documentation and issue trackers describe plcmt as a value adapters are expected to gather and pass through, not an optional extra alongside placement . SSPs that adopted the new field early describe it as necessary for buyers to price instream, accompanying, and standalone video differently rather than lumping it all into one instream rate card. The practical upshot for a supply-side integration in mid-2026: assume any buyer running current DV360 or Trade Desk video strategies is reading plcmt and pricing off it, and assume any buyer still integrated against an older adapter or a legacy ad server connection is reading placement and nothing else.
## What is not publicly documented
We could not find a published, industry-wide figure for what share of current video bid requests carry plcmt alone, placement alone, or both. Vendor blog posts and trade coverage describe adoption in terms of named DSPs and SSPs, not volume percentages, and the one hard number available (six of the top ten DSPs not reading plcmt as of August 2024) is almost two years stale by the time of this writing. Treat any specific dual-sending percentage you see quoted elsewhere as an estimate, not a measured industry figure, unless the source names how it counted.
## What to check this week
RTBlint flags the legacy field at its exact path: imp.video.placement trips openrtb.field.deprecated against the 2.6-202303 and later dated snapshots, so you can see at a glance whether a given request is still placement-only, plcmt-only, or sending both. Paste a sample video request into the bid request tester , or run rtblint validate request.json with the CLI in CI to catch requests missing plcmt entirely before a buyer's classification logic does it for you. If you have not re-audited your own inventory against the sound-on and user-intent test since the 2.6-202303 release, that is the actual outstanding work three years later, not picking a cutover date for placement .
## Sources
OpenRTB 2.6 specification, Object: Video field definitions
OpenRTB 2.6 implementation guide, Section 7.10, Updated Video Signals
AdExchanger, "IAB Tech Lab Has A Fix For Mislabeled Instream Video, But Ad Tech Isn't Ready To Change"
AdExchanger, "DV360 Accepts The IAB Tech Lab's New Video Guidelines. How Will That Impact Buyer Demand For Video Ads?"
Prebid.js, Issue #11608: Prebid 9 breaking changes (plcmt adoption across adapters)
---
# OpenRTB 3.0 and ads.cert in 2026: still waiting, still worth watching · RTBlint
URL: https://rtblint.org/blog/openrtb-3-ads-cert-2026/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Protocol
## OpenRTB 3.0 and ads.cert in 2026: still waiting, still worth watching
March 31, 2026 · RTBlint
OpenRTB 3.0 went final in November 2018. Seven and a half years later, the layered Openrtb envelope and its built-in request signing, ads.cert, still have no meaningful footprint in production bidstreams. We checked what IAB Tech Lab is actually shipping in 2026 against what 3.0 promised, and the gap has not closed. It has moved.
## What 3.0 was supposed to fix
OpenRTB 2.x is one document: the BidRequest object carries auction fields and domain fields (site, app, device, user, video) together. 3.0 split that into layers: transport, format, a thin transaction layer (the Openrtb envelope with an item array), and a domain layer delegated to AdCOM 1.0. Alongside it, ads.cert added cryptographic request signing directly into the protocol: the Source object grew ds (digital signature), dsmap (the fields it covers), cert (signer certificate reference), and digest , so a buyer could verify a request actually came from the publisher it claimed to. We cover the full field-by-field mapping in OpenRTB 2.6 vs 3.0 . This piece is about where things stand now, not how the spec reads.
## ads.cert: the standard changed shape, and adoption still didn't follow
ads.cert 1.0, from 2018, was scoped to signing OpenRTB bid requests specifically, the fields listed above. IAB Tech Lab announced ads.cert 2.0 in September 2021, and it is a different thing: Call Signs (DNS-published public keys that identify a business) and Authenticated Connections (cryptographic signing for any server-to-server HTTP request, not just bid requests). The scope broadened from "sign the OpenRTB Source object" to "sign any programmatic HTTP call," with CTV supply-path fraud named as the driving use case.
The current ads.cert page states Authenticated Connections has been "ready for adoption" since a February 2024 update. The reference implementation tells a different story: the README for IABTechLab's adscert repository says outright that it is "a proof of concept and not meant for use in its current form." A standard can be declared ready and still ship only a reference library that its own maintainers say not to run in production. That is where ads.cert sits in 2026: published, not withdrawn, not obviously dead, and not something we found running at scale.
The more telling signal is what is missing. IAB Tech Lab's 2025 technical standards roadmap lists roughly 31 planned specifications and updates for the year: CTV ad formats, Global Privacy Platform work, live-stream RTB signaling, AI crawler access controls, a conversion API. Neither OpenRTB 3.0 nor ads.cert appears in it. That is not proof the programs are dead, but a standards body does not usually omit something it considers a current priority from its own annual roadmap.
## Why 2.x absorbed the pressure to move
The mechanism is a versioning policy change, not industry inertia alone. Since the 2.6-202211 update (November 2022), IAB Tech Lab ships the 2.x line on a monthly, dated-snapshot cadence and only bumps the version number on a breaking change. Everything else, new fields, new objects, new enumerated values, lands as a same-version dated release: 2.6-202303 , 2.6-202402 , 2.6-202501 , and on. See OpenRTB versions for the tracked list.
That policy removed the main argument for jumping to 3.0. GPP consent signaling, DOOH context objects, CTV pod bidding, and structured user-agent fields (replacing the freeform UA string) all shipped as 2.6 dated updates rather than waiting on a major version. If your integration only needs new capability, not a new architecture, 2.6 keeps giving you the capability without asking you to run a second parser. 3.0's case was partly architectural cleanliness and partly ads.cert; neither outweighed the cost of a non-backward-compatible dual stack for most buy- and sell-side teams.
## What 3.0 already gives you, even if you never touch it
Two pieces of the 3.0-era work made it into 2.6 without anyone adopting the 3.0 envelope. First, AdCOM 1.0, the domain object model built for 3.0, is where 2.6's enumerated lists actually live now: device types, placement subtypes, API frameworks, creative attributes. The AdCOM repository is still actively maintained on the same dated-snapshot pattern as OpenRTB itself, because 2.6 depends on it. Second, no-bid and loss reason codes used across 2.6 responses are maintained in the OpenRTB 3.0 document itself. If you have ever looked up a loss reason code, you were reading a 3.0 artifact while running a 2.6 integration.
## What would actually have to change
Architectural elegance did not move the industry in 2018 and will not move it in 2026. Two things plausibly could. One: fraud or compliance pressure serious enough that cryptographic request signing stops being optional, a regulator or a major buyer mandating verifiable request provenance rather than trusting ads.txt and SupplyChain declarations. Two: a closed or high-value vertical, a walled CTV ecosystem or a DOOH network with a small, motivated set of counterparties, deciding the dual-stack migration cost is worth it because everyone in that vertical can move together. Absent one of those, the cost-benefit math that has held since 2018 still holds.
## What to check this week
If you integrate programmatic bid requests, do not build speculative OpenRTB 3.0 or ads.cert support. Build it when a specific partner requires it, not before. What is worth doing now: confirm which 2.6 dated snapshot your exchange or DSP actually targets, since fields move between snapshots, and validate against that exact one in the bid request tester or the RTBlint CLI in CI. RTBlint validates OpenRTB 2.6 bid requests, with the richest rule coverage on tracked 2.6 snapshots through 2.6-202505 . It carries object catalogs for 2.0 through 3.0 for field-level checks, but full 3.0 rule depth and bid response validation are not there yet, and RTBlint is not an IAB Tech Lab product. If a partner hands you a native 3.0 Openrtb envelope, that is the trigger to build for it, not a roadmap item to get ahead of.
## Sources
IAB Tech Lab, ads.cert overview and status
IABTechLab/adscert reference implementation (README: proof of concept)
IAB Tech Lab, ads.cert 2.0 announcement (September 30, 2021)
PPC Land, IAB Tech Lab 2025 technical standards roadmap
InteractiveAdvertisingBureau/openrtb2.x (dated-snapshot release policy)
---
# GPP in OpenRTB: regs.gpp, gpp_sid, and the 2026 state sections · RTBlint
URL: https://rtblint.org/blog/gpp-new-sections-2026/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Privacy
## GPP in OpenRTB: regs.gpp, gpp_sid, and the 2026 state sections
March 11, 2026 · RTBlint
The Global Privacy Platform closed out 2025 by finalizing sections for Maryland, Indiana, Kentucky, and Rhode Island, with Indiana, Kentucky, and Rhode Island taking effect January 1, 2026. IAB Tech Lab has also said it will move to a biannual GPP release cycle starting this year. For anyone parsing regs.gpp , that means the set of section IDs a bidder needs to recognize is not fixed. It grows on a schedule now.
## What regs.gpp and regs.gpp_sid actually carry
OpenRTB added GPP support in the 2.6-202211 update, promoting it to the Regs object alongside coppa , gdpr , and us_privacy . Two fields do the work:
regs.gpp (string): the encoded GPP consent string, which can bundle multiple regional sections into one value.
regs.gpp_sid (integer array): the section ID or IDs of that string which apply to this transaction. Per the spec it will generally contain one and only one value, and sections 3 (Header) and 4 (Signal Integrity) do not need to be listed since they carry no consent state of their own.
The two fields only mean something together. regs.gpp without regs.gpp_sid is a string a bidder cannot interpret: there is no way to know which section governs the transaction, or whether a US state string sits next to an EU TCF string in the same value. Full field-level detail is on the privacy signals in OpenRTB doc.
## The section list keeps getting longer
GPP assigns each privacy framework a numeric section ID, published in the Section Information file of the Global Privacy Platform repository. IDs 1 and 2 cover EU TCF, 5 covers the Canadian TCF, and 6 is the legacy US Privacy string. Everything from 7 upward is US state and national MSPA-based sections, and that range has been extending continuously since the first state sections (California, Virginia, Colorado, Utah, Connecticut) landed in 2023:
Section ID Section(s) Note
6 US Privacy (uspv1) Legacy CCPA string; deprecated by IAB Tech Lab
7 US National (usnat) MSPA-based national baseline
8-16 California, Virginia, Colorado, Utah, Connecticut, Florida, Montana, Oregon, Texas First wave of state sections, 2023-2024
17-22 Delaware, Iowa, Nebraska, New Hampshire, New Jersey, Tennessee Added through 2024 into 2025
23 Minnesota (usmn) Finalized after public comment, mid-2025
24 Maryland (usmd) Effective October 1, 2025
25-27 Indiana, Kentucky, Rhode Island Effective January 1, 2026
IAB Tech Lab has also announced a rearchitecture initiative for the US sections aimed at improving how supported and applicable sections are signaled, alongside the move to a biannual release cadence beginning in 2026. Treat the section list as a moving target, not a fixed enum: new state privacy laws keep arriving, and each one gets its own GPP section rather than being folded into an existing one.
## The operational problem: parsing sections you have never seen
A bidder that hardcodes a switch statement over known gpp_sid values will eventually receive one it does not recognize, most likely from a state whose section went live after the code was last updated. That is not a hypothetical: it happened with Minnesota in mid-2025 and is happening again with Indiana, Kentucky, and Rhode Island in January 2026. The correct behavior is to treat an unrecognized section ID as "there is a privacy obligation here I do not understand" and default to the most conservative handling (no targeted advertising, no sale/share of data) rather than silently ignoring the signal or, worse, silently bidding as if no regulation applied.
The same logic applies upstream. Exchanges assembling the GPP string need to include the section IDs for every jurisdiction that actually applies to the request, not just the ones their consent management platform shipped support for last quarter.
## Common mistakes in live traffic
regs.gpp without regs.gpp_sid , or the reverse. Either half without the other is unusable, and RTBlint flags a present gpp string with an empty or missing gpp_sid array.
Stale regs.us_privacy contradicting the GPP string. IAB Tech Lab deprecated the US Privacy signal on January 31, 2024, but plenty of pipelines still emit it out of inertia. When it disagrees with what the GPP string says for the same user, downstream systems have to pick a source of truth, and most will not pick the legacy one.
Sending us_privacy alone with no GPP string at all for traffic that originates in a state with its own section (Colorado, Connecticut, and the rest). The legacy string was never designed to represent state-specific opt-out mechanics beyond California, so it cannot stand in for GPP no matter how current it is.
Typing gpp_sid as a single integer instead of an array , or as a comma-separated string. The field is an integer array even when exactly one section applies.
## What to check this week
Paste a sample bid request into the bid request tester to confirm regs.gpp and regs.gpp_sid are both present, correctly typed, and not contradicted by a stale regs.us_privacy value. The same checks run in CI through the Rust CLI . If your consent management platform added Maryland, Indiana, Kentucky, or Rhode Island support this cycle, confirm the corresponding section ID actually shows up in gpp_sid for traffic from those states rather than only in the encoded string. Field-level reference for every privacy path in a 2.6 request is on privacy signals in OpenRTB .
## Sources
Global Privacy Platform repository (InteractiveAdvertisingBureau)
GPP Section Information (current section ID list)
OpenRTB 2.6 specification, Object: Regs
IAB Tech Lab: GPP updates and DDRF V2 release announcement
IAB Tech Lab: US Privacy signal deprecation deadline
---
# No more 2.7: how OpenRTB ships now, and why your parser should care · RTBlint
URL: https://rtblint.org/blog/dated-snapshots-era/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Spec release
## No more 2.7: how OpenRTB ships now, and why your parser should care
February 25, 2026 · RTBlint
There is no OpenRTB 2.7, and under the current release process there may never be one in the form the version numbers of 2.x once implied. Since November 2022, IAB Tech Lab has shipped every non-breaking change to the spec as a dated snapshot of 2.6. Nine of them exist as of this writing, and each one adds, deprecates, or moves fields that a request built against an earlier snapshot will not have.
## The policy, in the spec's own words
The openrtb2.x repository's release process documentation states it plainly: "As of OpenRTB 2.6-202211, OpenRTB's version number is only incremented on breaking changes." Non-breaking additions, such as a new field, object, or enumerated value, ship instead as a dated snapshot of the same 2.6 line, cut roughly once a month when approved changes exist in the working branch. The same document calls this out as a deliberate break from earlier practice: "In versions of OpenRTB prior to 2.6, major version numbers represent breaking changes and minor version numbers represent non-breaking changes." Under the old scheme, a non-breaking addition might have produced a 2.6 or 2.7. Under the current one, it produces a new date code on 2.6, and the major.minor number stays put until something actually breaks compatibility.
That is why there is no 2.7 to wait for. The version number most integrations quote, 2.6, has been stable since the spec went final in April 2022. What has moved underneath it is nine snapshots of additions, deprecations, and field relocations, documented one release at a time rather than bundled into a version bump.
## The full timeline: nine snapshots since 2.6 shipped
2.6-202210 is the GitHub repository's own baseline tag, carrying no changes beyond the April 2022 final spec; the working policy quote above is attached to the following snapshot, 2.6-202211 , which is also the first release to ship new fields under the current rules.
Snapshot What it added
2.6-202204 The 2.6 Final spec (April 2022). Added bid.apis, bid.mtype, cattax taxonomy selection, imp.rwdd, imp.ssai, the pod-bidding fields (maxseq, poddur, podid, podseq, mincpmpersec, slotinpod), rqddurs, BCP-47 language tags, the AUCTION_MIN_TO_WIN macro, the schain and eids object families, and device.sua. Deprecated the legacy sequence, device-hash, demographic, and single-api fields. Moved regs.ext.gdpr and user.ext.consent into core objects.
2.6-202210 The first tag cut in the openrtb2.x GitHub repo. Its own release notes describe it as the same 2.6 spec published in April 2022, with no new changes yet proposed or included.
2.6-202211 Added the Qty and DOOH objects (imp.qty, bidrequest.dooh) for digital-out-of-home, moved inventorypartnerdomain from ext into Site and App, and added GPP consent signaling (regs.gpp, regs.gpp_sid). The release notes also introduced the versioning policy covered below.
2.6-202303 Added imp.refresh and refresh.refsettings, deprecated imp.video.placement in favor of the new imp.video.plcmt, and added the AUCTION_IMP_TS macro.
2.6-202309 Added bidrequest.acat, deal.guaranteed and deal.mincpmpersec, and duration-aware floor objects on imp.video, imp.audio, and deal (durfloors).
2.6-202402 Added imp.video.poddedupe for pod deduplication signaling.
2.6-202409 Added cookie-sync guidance in an appendix and the EID fields eid.inserter, eid.matcher, and eid.mm.
2.6-202501 Added content.gtax and content.genres for genre taxonomy on the Content object.
2.6-202505 Added data.cids, extended content identifiers on Data objects.
## Why "we support 2.6" stopped being precise
A vendor claiming OpenRTB 2.6 support today could mean anything from the April 2022 baseline to the May 2025 snapshot, and the gap between those two is not cosmetic. video.placement is deprecated as of 2.6-202303 in favor of video.plcmt , a field with a different enum, not a renamed copy of the old one. regs.gpp and regs.gpp_sid did not exist before 2.6-202211 . A parser or fixture set built against the 2022 baseline has no way to represent digital-out-of-home requests, duration-aware price floors, or genre taxonomy on Content, because none of those existed yet at that snapshot. None of this shows up as an error in a schema-less pipeline; it shows up as silently dropped fields, or as a validator flagging a field as unknown when the actual problem is that the validator is checking against the wrong date.
The practical consequence is that "OpenRTB 2.6" is no longer specific enough to be a compatibility claim on its own. Two exchanges can both be correct and still disagree on a bid request, because they are each correct against a different month.
## What this means for parsers, fixtures, and validation
Three practices follow directly from a spec that ships this way:
Name the snapshot, not just the minor version , in integration docs, partner contracts, and internal wikis. "2.6-202309" tells a counterpart exactly which fields to expect; "2.6" does not.
Re-run fixtures against new snapshots on a cadence , not only when something breaks. A field can move from deprecated to removed, or a new field can become the one your buyers expect, without your traffic changing at all.
Treat deprecation notices as a clock, not a suggestion. imp.video.placement has been deprecated since 2.6-202303 ; it still works, but a parser that only understands the old field will eventually be reading a signal that fewer buyers are updating on the other end.
The site's own dated snapshots explainer covers the mechanics of how RTBlint tracks this; the point here is that the practice of pinning to a snapshot is now a spec-mandated one, not a validator-specific convenience.
## Pin your validation to a snapshot
The browser tester lets you pick a specific dated snapshot before validating a bid request, so a deprecated or moved field is reported against the version you actually target rather than the newest one. The Rust CLI takes the same snapshot argument for CI:
rtblint validate request.json --version 2.6-202309
Every diagnostic id RTBlint can emit, including the ones that fire for a deprecated, moved, or not-yet-available field at a given snapshot, is listed in the rule reference , and the underlying rule catalog for each tracked version is browsable in the rules index .
## Sources
OpenRTB 2.x release process and versioning policy, openrtb2.x README (InteractiveAdvertisingBureau/openrtb2.x)
OpenRTB 2.x release tags and notes, GitHub
OpenRTB v2.6-202211 release notes
OpenRTB v2.6-202210 release notes (repository baseline tag)
OpenRTB 2.6 specification text
---
# OpenRTB 2.6-202501 in review: the January update, field by field · RTBlint
URL: https://rtblint.org/blog/openrtb-2-6-202501-review/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · Spec release
## OpenRTB 2.6-202501 in review: the January update, field by field
February 4, 2026 · RTBlint
IAB Tech Lab published OpenRTB 2.6-202501 on January 27, 2025. The functional change is narrow: two new attributes, gtax and genres , added to the Content object at Section 3.2.16 of the OpenRTB 2.6 spec. If you run CTV or long-form video supply, this is the release where content genre stopped being free text.
## What actually shipped
Per the release notes on the openrtb2.x GitHub repository , 2.6-202501 contains four items:
Addition of gtax and genres attributes on Object: Content , Section 3.2.16.
A new Section 7.13 in the Implementation Guidance document, "Using genres and gtax attributes," covering sell-side and buy-side guidance.
An update to AdCOM's List: Category Taxonomies documenting the enum value for Content Taxonomy 3.1.
Editorial cleanup: removed lingering descriptions of already-deprecated attributes, adding the version each was deprecated in and, where one exists, a pointer to its replacement.
Only the first item changes what a validator checks. The Implementation Guidance section and the taxonomy documentation update are context for that one field addition; the editorial cleanup touches spec prose, not the object model. RTBlint's rule catalog tracks exactly one delta for this release, openrtb.2.6-202501.content.gtax_genres , and nothing else from this list. If you were expecting a broader changeset, this is it.
## The two new fields
Both attributes live on the Content object, alongside the existing cat and cattax pair they are modeled after:
Field Type Description
content.gtax int, default 9 The taxonomy in use for genres . Values come from AdCOM's List: Category Taxonomies. Value 9 is IAB Tech Lab Content Taxonomy 3.1; values 500+ are reserved for vendor-specific taxonomies, the same convention cattax uses for cat .
content.genres int array (as shipped in 202501) Unique ID(s) for the genre of the content, in the taxonomy named by gtax . If gtax is omitted, the spec assumes the CTV Genre Mapping subset of Content Taxonomy 3.1. A later errata in 2.6-202505 changed this type to string array; see the note below.
The pattern is deliberate: gtax selects a taxonomy the way cattax selects one for cat / acat / bcat , and genres carries values from it the same way those fields carry category codes. If your validation logic already understands the taxonomy-selector pattern, extending it to content genre is mechanical.
## A type to get right: genres started as an int array
At the time of this release, genres was typed as an integer array in Section 3.2.16's object table, matching Section 7.13.5 of the Implementation Guidance, which describes it as "an integer array" containing accepted genre IDs from Content Taxonomy 3.1. The two documents agreed at 202501. They stopped agreeing a few months later: the 2.6-202505 release changed the object table's type for genres from integer array to string array (an errata fix, to support alphanumeric IDs), but the Implementation Guidance section was not updated to match. As of this writing, Section 3.2.16 says string array and Section 7.13.5 still says integer array, so anyone reading the current spec cold should check both sections and confirm which type their counterparty actually sends, rather than assume the two documents agree.
## Why this, and why now
The Content object already had a genre field (singular, free text) since OpenRTB 2.5. Free text meant every seller invented its own naming, from single words to long comma-separated strings, which made genre unusable for programmatic targeting, reporting, or brand suitability decisions. Content Taxonomy 3.1 existed already but is large; the 2.6-202501 release paired it with a smaller, purpose-built CTV Genre Mapping subset so implementers are not required to consume the full taxonomy just to tag a program as a sitcom or a newscast. The same release also added a row for "Thriller" to Content Taxonomy 3.1 itself.
The legacy genre field was not removed or deprecated in this release. Implementation Guidance treats genres / gtax as the field pair sellers should migrate to, but the spec text does not mark genre as deprecated as part of 2.6-202501.
One release later, 2.6-202505 shipped the genres type errata above and added the Data object's cids attribute for extended content identifiers, a separate field not covered here. If you are tracking dated snapshots, see the OpenRTB versions page for the full sequence RTBlint catalogs.
## What to check this week
If you send or receive Content objects in CTV or long-form video requests:
Decide whether you are sending or reading content.gtax / content.genres yet. If not, and a partner is, requests validated against an earlier snapshot will flag the fields as undefined.
If you do send genres , confirm with your partner which JSON type they expect (string array or integer array) given the spec-versus-guidance mismatch above.
If you use a non-default gtax , in particular a 500+ vendor code, confirm the receiving side can actually resolve that taxonomy before you rely on it for targeting or brand suitability.
To check a specific payload, paste it into the bid request tester and select the 2.6-202501 snapshot or later, or run it through the CLI :
rtblint validate request.json --version 2.6-202501
The specific rule is documented on its own page in the rule reference , and the full list of diagnostic ids RTBlint can emit is in the rule reference index .
## Sources
OpenRTB 2.6-202501 release notes, openrtb2.x GitHub repository
OpenRTB 2.6 spec, Section 3.2.16, Object: Content
Implementation Guidance, Section 7.13, Using genres and gtax attributes
AdCOM 1.0, List: Category Taxonomies
---
# What the IAB Tech Lab 2026 roadmap means for OpenRTB · RTBlint
URL: https://rtblint.org/blog/iab-tech-lab-2026-roadmap-openrtb/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Blog · IAB
## What the IAB Tech Lab 2026 roadmap means for OpenRTB
January 21, 2026 · RTBlint
IAB Tech Lab published two 2026-planning posts in January: a broad roadmap built around agentic advertising, and a narrower one titled "Essential OpenRTB Updates You Can't Ignore for your 2026 Roadmap." Only the second one names OpenRTB fields, and half of what it covers is not an OpenRTB field at all. Here is what is actually verifiable, field by field.
## The roadmap post is not about OpenRTB
"Navigating the Agentic Frontier: The IAB Tech Lab 2026 Roadmap" is the company's public statement of priorities for the year, and it is dominated by Agentic Advertising Management Protocols (AAMP), an Agentic Real-Time Framework, and buyer and seller agent SDKs published to Tech Lab's GitHub. It also lists a bi-annual cadence for GPP, a Privacy Lab for testing privacy-enhancing technologies, and continued work on the Live Event Ad Playbook (LEAP) for CTV. What it does not contain is a line-item OpenRTB spec roadmap: no field names, no object diffs, no version targets. That is normal for this kind of post. It is a priorities memo for an industry audience, not a change log for a protocol.
The company published a second, narrower post the same month: "Essential OpenRTB Updates You Can't Ignore for your 2026 Roadmap." That is the one worth reading if you write or validate bid requests.
## What actually landed in the Content object
Two attributes were added to Object: Content in OpenRTB 2.6x during the 2.6-202501 release cycle: gtax and genres . gtax names the taxonomy in use, drawn from the List: Category Taxonomies in AdCOM 1.0, and defaults to IAB Tech Lab Content Taxonomy 3.1 if omitted. genres is an array of unique IDs from whichever taxonomy gtax points to, and it is meant to replace the older singular genre string field. Content Taxonomy 3.1 itself carries roughly three times the category count of the deprecated Content Taxonomy 1.0, with a subset of rows specifically for CTV genres, which is the inventory type these fields are aimed at: full-episode and long-form video where genre classification affects both targeting and brand safety.
The practical path is site.content.genres or app.content.genres depending on inventory type, paired with content.gtax when you are not using the default taxonomy. If your fixtures still carry the old singular genre field and nothing in genres , that is the exact migration gap this update created: two fields, one deprecated and one additive, doing overlapping jobs during the transition, the same shape as the placement to plcmt migration from 2.6-202303.
The same post also describes Extended Content Identifiers (ECIDs), a framework for attaching more specific content identity to a request. The company's own description is that ECIDs "work within the existing Content object," which is a lower bar than adding a new object: it is additional identifier fields on something that already exists in every 2.6x bid request that carries content metadata.
## The Curation object is not in OpenRTB
The same post spends real space on a new Curation object providing "transparency on how curated deals are described." That object belongs to a separate Deal Sync API specification, not to OpenRTB request or response schemas. The Deal Sync API repository states this directly: it is "a separate API that is NOT included in OpenRTB Request/Response," a one-directional push (SSP to DSP) of static deal metadata such as terms, inventory scope, and curation fee disclosure, meant to run alongside the bidstream rather than inside it. Its public comment period closed January 31, 2026.
For anyone building against this expecting new fields under imp.pmp.deals , that expectation is wrong by design. The Deal Sync API is explicit that deal criteria sent through it are not guaranteed to match what shows up in the live bid request, and that buyers must keep validating deal IDs against actual OpenRTB targeting rather than trusting the sidecar feed. It is a business-terms channel, not a bid request extension, and it will not show up in anything that parses OpenRTB JSON.
## What is actually in flight, verified against the source repos
Four tracks are independently checkable in public repositories and press material, and together they tell a more useful story than either January post does alone.
GPP keeps adding US state sections on a real cadence. IAB Tech Lab's October 2025 privacy update confirmed a bi-annual GPP release cycle starting in 2026 and added Maryland (effective October 1, 2025), plus Indiana, Kentucky, and Rhode Island (effective January 1, 2026). All four sections are merged into the Global Privacy Platform repository. See GPP keeps growing for what regs.gpp and gpp_sid need to carry as a result.
The DSA extension has not changed in substance. The regs.ext.dsa and bid.ext.dsa community extension still runs on the same dsarequired values and pubrender flag defined after the Digital Services Act's February 2024 applicability date. IAB Tech Lab's DSA Ads Transparency Taskforce says it continues engaging regulators and promoting adoption, but nothing we found names a new 2026 enforcement milestone or a spec revision. See DSA transparency in OpenRTB .
ads.cert has no new 2026 milestone. ads.cert 2.0 has carried "ready for adoption" messaging since 2024, and we found no update to that status for 2025 or 2026. That absence is itself the update: see OpenRTB 3.0 and ads.cert in 2026 .
The dated-snapshot cadence has slowed. OpenRTB 2.6 shipped 2.6-202409 in September 2024, 2.6-202501 in January 2025, and 2.6-202505 in May 2025, roughly a four-month rhythm. As of this writing, no successor to 2.6-202505 has shipped, an eight-month gap against that rhythm. See how dated snapshots work if that naming is unfamiliar.
None of this touches OpenRTB 3.0. Nothing found in Tech Lab's 2026 communications or the openrtb repository suggests a change to 3.0's adoption status, which remains minimal years after it went final. The concrete 2026 spec work landed in 2.6x, not 3.0, continuing a run of years where 2.x absorbs whatever 3.0 was meant to solve.
## What to check this year
If you have already added gtax and genres to content objects, confirm the array type on genres and that you are not still populating only the deprecated singular genre . Run requests through the bid request tester to catch type and path mistakes before they reach a partner. RTBlint's OpenRTB 2.6 catalog runs through the 2.6-202505 snapshot; it does not validate the Deal Sync API, since that traffic never appears inside an OpenRTB bid request or response for RTBlint, or any bid request validator, to see. For CI, pin your spec snapshot and gate on rule IDs as described in the CLI docs , and re-pin when the next 2.6 dated snapshot lands, whenever that turns out to be.
## Sources
Navigating the Agentic Frontier: The IAB Tech Lab 2026 Roadmap
Essential OpenRTB Updates You Can't Ignore for your 2026 Roadmap
IAB Tech Lab Expands Global Privacy Frameworks With GPP Updates and DDRF V2 Release
openrtb2.x releases (dated snapshot history)
Deal Sync API specification, including Object: Curation
---
# openrtb.2.0.device.geo · OpenRTB 2.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-0-device-geo/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.0.device.geo
Added behavior OpenRTB 2.0 Released 2012-01
## What it means
OpenRTB 2.0 introduced device.geo, which openRTB 2.0 improved geographic data handling across mobile and desktop transactions..
Path device.geo
## Why it matters
device.geo is only defined from 2.0 onward. Used against an earlier version it is not valid, and a consumer below 2.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.0 or later when you send device.geo, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.0 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.0.device.ifa · OpenRTB 2.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-0-device-ifa/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.0.device.ifa
Added field OpenRTB 2.0 Released 2012-01
## What it means
OpenRTB 2.0 introduced device.ifa, which openRTB 2.0 added mobile device ID support for attribution and audience handling..
Path device.ifa
## Why it matters
device.ifa is only defined from 2.0 onward. Used against an earlier version it is not valid, and a consumer below 2.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.0 or later when you send device.ifa, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.0 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.0.imp.video · OpenRTB 2.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-0-imp-video/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.0.imp.video
Added object OpenRTB 2.0 Released 2012-01
## What it means
OpenRTB 2.0 introduced imp.video, which openRTB 2.0 unified display, mobile, and video bidding around the shared Video object and VAST ad-unit support..
Path imp.video
## Why it matters
imp.video is only defined from 2.0 onward. Used against an earlier version it is not valid, and a consumer below 2.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.0 or later when you send imp.video, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.0 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.0.user.data · OpenRTB 2.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-0-user-data/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.0.user.data
Added field OpenRTB 2.0 Released 2012-01
## What it means
OpenRTB 2.0 introduced user.data, which openRTB 2.0 expanded support for third-party audience data segments..
Path user.data
## Why it matters
user.data is only defined from 2.0 onward. Used against an earlier version it is not valid, and a consumer below 2.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.0 or later when you send user.data, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.0 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.1.enum.content_category.tier2 · OpenRTB 2.1 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-1-enum-content_category-tier2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.1.enum.content_category.tier2
Added list OpenRTB 2.1 Released 2012-10
## What it means
OpenRTB 2.1 introduced enum.content_category.tier2, which openRTB 2.1 added support for IAB Tier-2 content categories..
Path enum.content_category.tier2
## Why it matters
enum.content_category.tier2 is only defined from 2.1 onward. Used against an earlier version it is not valid, and a consumer below 2.1 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.1 or later when you send enum.content_category.tier2, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.1 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.1.geo.type · OpenRTB 2.1 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-1-geo-type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.1.geo.type
Added field OpenRTB 2.1 Released 2012-10
## What it means
OpenRTB 2.1 introduced geo.type, which openRTB 2.1 differentiated location-source provenance, such as GPS versus ZIP-derived targeting..
Path geo.type
## Why it matters
geo.type is only defined from 2.1 onward. Used against an earlier version it is not valid, and a consumer below 2.1 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.1 or later when you send geo.type, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.1 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.1.imp.video.behavior · OpenRTB 2.1 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-1-imp-video-behavior/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.1.imp.video.behavior
Added behavior OpenRTB 2.1 Released 2012-10
## What it means
OpenRTB 2.1 introduced imp.video, which openRTB 2.1 clarified VAST video support in RTB transactions, including mixed banner-or-video impressions..
Path imp.video
## Why it matters
imp.video is only defined from 2.1 onward. Used against an earlier version it is not valid, and a consumer below 2.1 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.1 or later when you send imp.video, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.1 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.2.imp.secure · OpenRTB 2.2 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-2-imp-secure/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.2.imp.secure
Added field OpenRTB 2.2 Released 2014-04
## What it means
OpenRTB 2.2 introduced imp.secure, which openRTB 2.2 added secure versus non-secure inventory signaling..
Path imp.secure
## Why it matters
imp.secure is only defined from 2.2 onward. Used against an earlier version it is not valid, and a consumer below 2.2 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.2 or later when you send imp.secure, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.2 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.2.pmp.deals · OpenRTB 2.2 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-2-pmp-deals/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.2.pmp.deals
Added behavior OpenRTB 2.2 Released 2014-04
## What it means
OpenRTB 2.2 introduced imp.pmp.deals, which openRTB 2.2 expanded private-marketplace deal handling..
Path imp.pmp.deals
## Why it matters
imp.pmp.deals is only defined from 2.2 onward. Used against an earlier version it is not valid, and a consumer below 2.2 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.2 or later when you send imp.pmp.deals, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.2 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.2.regs.coppa · OpenRTB 2.2 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-2-regs-coppa/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.2.regs.coppa
Added field OpenRTB 2.2 Released 2014-04
## What it means
OpenRTB 2.2 introduced regs.coppa, which openRTB 2.2 added COPPA regulation signaling..
Path regs.coppa
## Why it matters
regs.coppa is only defined from 2.2 onward. Used against an earlier version it is not valid, and a consumer below 2.2 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.2 or later when you send regs.coppa, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.2 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.2.traffic.feedback.bot · OpenRTB 2.2 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-2-traffic-feedback-bot/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.2.traffic.feedback.bot
Added guidance OpenRTB 2.2 Released 2014-04
## What it means
OpenRTB 2.2 introduced traffic.feedback.bot, which openRTB 2.2 introduced a path for real-time feedback on suspected bot traffic between buyers and sellers..
Path traffic.feedback.bot
## Why it matters
traffic.feedback.bot is only defined from 2.2 onward. Used against an earlier version it is not valid, and a consumer below 2.2 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.2 or later when you send traffic.feedback.bot, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.2 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.3.1.macro.auction_bid_id · OpenRTB 2.3.1 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-3-1-macro-auction_bid_id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.3.1.macro.auction_bid_id
Added behavior OpenRTB 2.3.1 Released 2015-06
## What it means
OpenRTB 2.3.1 introduced macro.${AUCTION_BID_ID}, which openRTB 2.3.1 corrected the ${AUCTION_BID_ID} substitution target to BidResponse.bidid..
Path macro.${AUCTION_BID_ID}
## Why it matters
macro.${AUCTION_BID_ID} is only defined from 2.3.1 onward. Used against an earlier version it is not valid, and a consumer below 2.3.1 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.3.1 or later when you send macro.${AUCTION_BID_ID}, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.3.1 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.4 typo fix
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.3.1.user.buyeruid · OpenRTB 2.3.1 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-3-1-user-buyeruid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.3.1.user.buyeruid
Corrected field OpenRTB 2.3.1 Released 2015-06
## What it means
user.buyuid was corrected in OpenRTB 2.3.1.
OpenRTB 2.3.1 corrected the buyer-specific user ID attribute spelling to buyeruid.
Path user.buyuid
Use instead user.buyeruid
## Why it matters
Earlier spellings or targets of this field do not match what 2.3.1 consumers expect, so the value is not read correctly.
## How to fix it
Use the corrected path user.buyeruid.
Paste your bid request into the tester and select OpenRTB 2.3.1 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.13 typo fix
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.3.imp.native · OpenRTB 2.3 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-3-imp-native/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.3.imp.native
Added object OpenRTB 2.3 Released 2015-01
## What it means
OpenRTB 2.3 introduced imp.native, which openRTB 2.3 introduced native ad placements directly on the impression object..
Path imp.native
## Why it matters
imp.native is only defined from 2.3 onward. Used against an earlier version it is not valid, and a consumer below 2.3 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.3 or later when you send imp.native, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.3 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.3.imp.native.request · OpenRTB 2.3 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-3-imp-native-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.3.imp.native.request
Added field OpenRTB 2.3 Released 2015-01
## What it means
OpenRTB 2.3 introduced imp.native.request, which openRTB 2.3 added the native request payload for declaring required assets and fields..
Path imp.native.request
## Why it matters
imp.native.request is only defined from 2.3 onward. Used against an earlier version it is not valid, and a consumer below 2.3 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.3 or later when you send imp.native.request, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.3 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.3.native.assets · OpenRTB 2.3 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-3-native-assets/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.3.native.assets
Added behavior OpenRTB 2.3 Released 2015-01
## What it means
OpenRTB 2.3 introduced native.assets, which openRTB 2.3 allowed supply and demand to negotiate native asset availability and requirements in the bidstream..
Path native.assets
## Why it matters
native.assets is only defined from 2.3 onward. Used against an earlier version it is not valid, and a consumer below 2.3 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.3 or later when you send native.assets, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.3 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.4.geo.location · OpenRTB 2.4 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-4-geo-location/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.4.geo.location
Added behavior OpenRTB 2.4 Released 2016-03
## What it means
OpenRTB 2.4 introduced geo, which openRTB 2.4 increased location support and geographic detail..
Path geo
## Why it matters
geo is only defined from 2.4 onward. Used against an earlier version it is not valid, and a consumer below 2.4 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.4 or later when you send geo, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.4 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.4.imp.audio · OpenRTB 2.4 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-4-imp-audio/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.4.imp.audio
Added object OpenRTB 2.4 Released 2016-03
## What it means
OpenRTB 2.4 introduced imp.audio, which openRTB 2.4 introduced the Audio object for audio inventory..
Path imp.audio
## Why it matters
imp.audio is only defined from 2.4 onward. Used against an earlier version it is not valid, and a consumer below 2.4 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.4 or later when you send imp.audio, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.4 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.4.imp.secure.ssl · OpenRTB 2.4 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-4-imp-secure-ssl/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.4.imp.secure.ssl
Added behavior OpenRTB 2.4 Released 2016-03
## What it means
OpenRTB 2.4 introduced imp.secure, which openRTB 2.4 broadened SSL and secure-asset expectations for creatives..
Path imp.secure
## Why it matters
imp.secure is only defined from 2.4 onward. Used against an earlier version it is not valid, and a consumer below 2.4 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.4 or later when you send imp.secure, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.4 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.4.imp.video.skip · OpenRTB 2.4 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-4-imp-video-skip/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.4.imp.video.skip
Added field OpenRTB 2.4 Released 2016-03
## What it means
OpenRTB 2.4 introduced imp.video.skip, which openRTB 2.4 added video skippability support..
Path imp.video.skip
## Why it matters
imp.video.skip is only defined from 2.4 onward. Used against an earlier version it is not valid, and a consumer below 2.4 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.4 or later when you send imp.video.skip, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.4 to see whether this rule fires against your payload.
## Reference
Specification section: Release highlights
Source: IAB Tech Lab OpenRTB standards page
Back to the full rule catalog .
---
# openrtb.2.5.bid.response_urls · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-bid-response_urls/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.bid.response_urls
Added field OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced bid.burl, bid.lurl, bid.tactic, bid.language, bid.wratio, bid.hratio, which openRTB 2.5 expanded bid response notice URLs and creative metadata fields..
Path bid.burl bid.lurl bid.tactic bid.language bid.wratio bid.hratio
## Why it matters
bid.burl is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send bid.burl, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.5.bidrequest.bseat_wlang · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-bidrequest-bseat_wlang/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.bidrequest.bseat_wlang
Added field OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced bidrequest.bseat, bidrequest.wlang, which openRTB 2.5 added buyer seat blocking and creative language allow-listing on the bid request..
Path bidrequest.bseat bidrequest.wlang
## Why it matters
bidrequest.bseat is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send bidrequest.bseat, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.1
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.5.bidrequest.source · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-bidrequest-source/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.bidrequest.source
Added field OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced bidrequest.source, which openRTB 2.5 added the Source object to model upstream decisioning and header bidding context..
Path bidrequest.source
## Why it matters
bidrequest.source is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send bidrequest.source, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.1 / 3.2.2
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.5.imp.metric · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-imp-metric/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.imp.metric
Added field OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced imp.metric, metric, which openRTB 2.5 introduced the Metric object for historical viewability, CTR, and similar signals..
Path imp.metric metric
## Why it matters
imp.metric is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send imp.metric, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.4 / 3.2.5
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.5.imp.video.placement · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-imp-video-placement/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.imp.video.placement
Added field OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced imp.video.placement, imp.video.playbackend, which openRTB 2.5 added video placement-type and playback-cessation signaling..
Path imp.video.placement imp.video.playbackend
## Why it matters
imp.video.placement is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send imp.video.placement, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.7
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.5.macro.loss · OpenRTB 2.5 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-5-macro-loss/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.5.macro.loss
Added macro OpenRTB 2.5 Released 2016-12
## What it means
OpenRTB 2.5 introduced macro.${AUCTION_MBR}, macro.${AUCTION_LOSS}, which openRTB 2.5 added auction minimum-bid and loss-notice macros..
Path macro.${AUCTION_MBR} macro.${AUCTION_LOSS}
## Why it matters
macro.${AUCTION_MBR} is only defined from 2.5 onward. Used against an earlier version it is not valid, and a consumer below 2.5 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.5 or later when you send macro.${AUCTION_MBR}, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.5 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.4
Source: OpenRTB 2.6 Appendix B: Version 2.4 to 2.5
Back to the full rule catalog .
---
# openrtb.2.6-202211.imp_qty_bidrequest_dooh · OpenRTB 2.6-202211 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202211-imp_qty_bidrequest_dooh/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202211.imp_qty_bidrequest_dooh
Added object OpenRTB 2.6-202211 Released 2022-11
## What it means
OpenRTB 2.6-202211 introduced imp.qty, bidrequest.dooh, which openRTB 2.6-202211 added Qty and DOOH support for digital out-of-home inventory..
Path imp.qty bidrequest.dooh
## Why it matters
imp.qty is only defined from 2.6-202211 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202211 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202211 or later when you send imp.qty, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202211 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.31, 3.2.32
Source: OpenRTB 2.6 Appendix B: Version 2.6-202210 to 2.6-202211
Back to the full rule catalog .
---
# openrtb.2.6-202211.inventorypartnerdomain · OpenRTB 2.6-202211 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202211-inventorypartnerdomain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202211.inventorypartnerdomain
Moved field OpenRTB 2.6-202211 Released 2022-11
## What it means
In OpenRTB 2.6-202211, site.ext.inventorypartnerdomain, app.ext.inventorypartnerdomain moved to site.inventorypartnerdomain.
OpenRTB 2.6-202211 moved inventorypartnerdomain from ext into the Site and App objects.
Path site.ext.inventorypartnerdomain app.ext.inventorypartnerdomain
Use instead site.inventorypartnerdomain app.inventorypartnerdomain
## Why it matters
A consumer on 2.6-202211 reads this value from site.inventorypartnerdomain. Send it at the old location and it is silently ignored, so whatever it governs (consent, restrictions, targeting) never takes effect.
## How to fix it
Write the value at site.inventorypartnerdomain instead of site.ext.inventorypartnerdomain. While you still serve older partners, you may need to populate both during the transition.
Paste your bid request into the tester and select OpenRTB 2.6-202211 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.13, 3.2.14
Source: OpenRTB 2.6 Appendix B: Version 2.6-202210 to 2.6-202211
Back to the full rule catalog .
---
# openrtb.2.6-202211.regs.gpp · OpenRTB 2.6-202211 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202211-regs-gpp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202211.regs.gpp
Added field OpenRTB 2.6-202211 Released 2022-11
## What it means
OpenRTB 2.6-202211 introduced regs.gpp, regs.gpp_sid, which openRTB 2.6-202211 added GPP consent signaling to the regs object..
Path regs.gpp regs.gpp_sid
## Why it matters
regs.gpp is only defined from 2.6-202211 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202211 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202211 or later when you send regs.gpp, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202211 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.6-202210 to 2.6-202211
Back to the full rule catalog .
---
# openrtb.2.6-202303.imp.refresh · OpenRTB 2.6-202303 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202303-imp-refresh/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202303.imp.refresh
Added object OpenRTB 2.6-202303 Released 2023-04
## What it means
OpenRTB 2.6-202303 introduced imp.refresh, refresh.refsettings, which openRTB 2.6-202303 added refresh signaling and refsettings guidance..
Path imp.refresh refresh.refsettings
## Why it matters
imp.refresh is only defined from 2.6-202303 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202303 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202303 or later when you send imp.refresh, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202303 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.33, 3.2.34
Source: GitHub release notes: 2.6-202303
Back to the full rule catalog .
---
# openrtb.2.6-202303.imp.video.placement · OpenRTB 2.6-202303 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202303-imp-video-placement/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202303.imp.video.placement
Deprecated field OpenRTB 2.6-202303 Released 2023-04
## What it means
imp.video.placement is deprecated as of OpenRTB 2.6-202303.
OpenRTB 2.6-202303 deprecated the legacy placement field in favor of plcmt.
Path imp.video.placement
## Why it matters
Deprecated fields can be ignored or dropped by up-to-date consumers and are eventually removed. Building on one leaves you exposed when a partner stops reading it.
## How to fix it
Stop depending on imp.video.placement and check the specification for its replacement.
Paste your bid request into the tester and select OpenRTB 2.6-202303 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.7
Source: GitHub release notes: 2.6-202303
Back to the full rule catalog .
---
# openrtb.2.6-202303.imp.video.plcmt · OpenRTB 2.6-202303 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202303-imp-video-plcmt/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202303.imp.video.plcmt
Added field OpenRTB 2.6-202303 Released 2023-04
## What it means
OpenRTB 2.6-202303 introduced imp.video.plcmt, which openRTB 2.6-202303 added plcmt for modern video placement semantics..
Path imp.video.plcmt
## Why it matters
imp.video.plcmt is only defined from 2.6-202303 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202303 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202303 or later when you send imp.video.plcmt, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202303 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.7
Source: GitHub release notes: 2.6-202303
Back to the full rule catalog .
---
# openrtb.2.6-202303.macro.auction_imp_ts · OpenRTB 2.6-202303 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202303-macro-auction_imp_ts/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202303.macro.auction_imp_ts
Added macro OpenRTB 2.6-202303 Released 2023-04
## What it means
OpenRTB 2.6-202303 introduced macro.${AUCTION_IMP_TS}, which openRTB 2.6-202303 added an impression-fulfillment timestamp substitution macro..
Path macro.${AUCTION_IMP_TS}
## Why it matters
macro.${AUCTION_IMP_TS} is only defined from 2.6-202303 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202303 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202303 or later when you send macro.${AUCTION_IMP_TS}, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202303 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.4
Source: GitHub release notes: 2.6-202303
Back to the full rule catalog .
---
# openrtb.2.6-202309.bidrequest.acat · OpenRTB 2.6-202309 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202309-bidrequest-acat/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202309.bidrequest.acat
Added field OpenRTB 2.6-202309 Released 2023-09
## What it means
OpenRTB 2.6-202309 introduced bidrequest.acat, which openRTB 2.6-202309 added allowed advertiser categories on the bid request..
Path bidrequest.acat
## Why it matters
bidrequest.acat is only defined from 2.6-202309 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202309 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202309 or later when you send bidrequest.acat, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202309 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.1
Source: GitHub release notes: 2.6-202309
Back to the full rule catalog .
---
# openrtb.2.6-202309.deal.floor_fields · OpenRTB 2.6-202309 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202309-deal-floor_fields/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202309.deal.floor_fields
Added field OpenRTB 2.6-202309 Released 2023-09
## What it means
OpenRTB 2.6-202309 introduced deal.guaranteed, deal.mincpmpersec, which openRTB 2.6-202309 added guaranteed and CPM-per-second deal fields..
Path deal.guaranteed deal.mincpmpersec
## Why it matters
deal.guaranteed is only defined from 2.6-202309 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202309 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202309 or later when you send deal.guaranteed, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202309 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.12
Source: GitHub release notes: 2.6-202309
Back to the full rule catalog .
---
# openrtb.2.6-202309.durfloors · OpenRTB 2.6-202309 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202309-durfloors/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202309.durfloors
Added object OpenRTB 2.6-202309 Released 2023-09
## What it means
OpenRTB 2.6-202309 introduced imp.video.durfloors, imp.audio.durfloors, deal.durfloors, which openRTB 2.6-202309 added duration-aware floor objects for video, audio, and deals..
Path imp.video.durfloors imp.audio.durfloors deal.durfloors
## Why it matters
imp.video.durfloors is only defined from 2.6-202309 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202309 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202309 or later when you send imp.video.durfloors, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202309 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.7, 3.2.8, 3.2.12
Source: GitHub release notes: 2.6-202309
Back to the full rule catalog .
---
# openrtb.2.6-202402.imp.video.poddedupe · OpenRTB 2.6-202402 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202402-imp-video-poddedupe/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202402.imp.video.poddedupe
Added field OpenRTB 2.6-202402 Released 2024-02
## What it means
OpenRTB 2.6-202402 introduced imp.video.poddedupe, which openRTB 2.6-202402 added pod deduplication signaling for video pods..
Path imp.video.poddedupe
## Why it matters
imp.video.poddedupe is only defined from 2.6-202402 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202402 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202402 or later when you send imp.video.poddedupe, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202402 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.7
Source: GitHub release notes: 2.6-202402
Back to the full rule catalog .
---
# openrtb.2.6-202409.cookie_sync_guidance · OpenRTB 2.6-202409 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202409-cookie_sync_guidance/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202409.cookie_sync_guidance
Added guidance OpenRTB 2.6-202409 Released 2024-09
## What it means
OpenRTB 2.6-202409 introduced appendix.cookie_sync, which openRTB 2.6-202409 added cookie-based ID syncing guidance to the specification..
Path appendix.cookie_sync
## Why it matters
appendix.cookie_sync is only defined from 2.6-202409 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202409 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202409 or later when you send appendix.cookie_sync, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202409 to see whether this rule fires against your payload.
## Reference
Specification section: Appendix C
Source: GitHub release notes: 2.6-202409
Back to the full rule catalog .
---
# openrtb.2.6-202409.eid.matching · OpenRTB 2.6-202409 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202409-eid-matching/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202409.eid.matching
Added field OpenRTB 2.6-202409 Released 2024-09
## What it means
OpenRTB 2.6-202409 introduced eid.inserter, eid.matcher, eid.mm, which openRTB 2.6-202409 added EID insertion, matcher, and match-method fields..
Path eid.inserter eid.matcher eid.mm
## Why it matters
eid.inserter is only defined from 2.6-202409 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202409 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202409 or later when you send eid.inserter, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202409 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.27
Source: GitHub release notes: 2.6-202409
Back to the full rule catalog .
---
# openrtb.2.6-202501.content.gtax_genres · OpenRTB 2.6-202501 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202501-content-gtax_genres/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202501.content.gtax_genres
Added field OpenRTB 2.6-202501 Released 2025-01
## What it means
OpenRTB 2.6-202501 introduced content.gtax, content.genres, which openRTB 2.6-202501 added genre taxonomy and genres fields on content..
Path content.gtax content.genres
## Why it matters
content.gtax is only defined from 2.6-202501 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202501 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202501 or later when you send content.gtax, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202501 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.16
Source: GitHub release notes: 2.6-202501
Back to the full rule catalog .
---
# openrtb.2.6-202505.data.cids · OpenRTB 2.6-202505 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202505-data-cids/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202505.data.cids
Added field OpenRTB 2.6-202505 Released 2025-05
## What it means
OpenRTB 2.6-202505 introduced data.cids, which openRTB 2.6-202505 added extended content identifiers on Data objects..
Path data.cids
## Why it matters
data.cids is only defined from 2.6-202505 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202505 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202505 or later when you send data.cids, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202505 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.21
Source: GitHub release notes: 2.6-202505
Back to the full rule catalog .
---
# openrtb.2.6-202606.content.liveness · OpenRTB 2.6-202606 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202606-content-liveness/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202606.content.liveness
Added field OpenRTB 2.6-202606 Released 2026-06
## What it means
OpenRTB 2.6-202606 introduced content.realtime, content.firstbroadcast, which openRTB 2.6-202606 added realtime and firstbroadcast attributes for signaling the liveness of programming on the Content object..
Path content.realtime content.firstbroadcast
## Why it matters
content.realtime is only defined from 2.6-202606 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202606 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202606 or later when you send content.realtime, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202606 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.16
Source: GitHub release notes: 2.6-202606
Back to the full rule catalog .
---
# openrtb.2.6-202606.macro.auction_discount · OpenRTB 2.6-202606 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-202606-macro-auction_discount/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6-202606.macro.auction_discount
Added macro OpenRTB 2.6-202606 Released 2026-06
## What it means
OpenRTB 2.6-202606 introduced macro.${AUCTION_DISCOUNT_PCT}, macro.${AUCTION_DISCOUNT_CPM}, which openRTB 2.6-202606 added seller discount substitution macros and revised the ${AUCTION_PRICE} definition..
Path macro.${AUCTION_DISCOUNT_PCT} macro.${AUCTION_DISCOUNT_CPM}
## Why it matters
macro.${AUCTION_DISCOUNT_PCT} is only defined from 2.6-202606 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202606 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202606 or later when you send macro.${AUCTION_DISCOUNT_PCT}, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202606 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.4
Source: GitHub release notes: 2.6-202606
Back to the full rule catalog .
---
# openrtb.2.6.bid.apis · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-bid-apis/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.bid.apis
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced bid.apis, which openRTB 2.6 added the multi-valued bid.apis field..
Path bid.apis
## Why it matters
bid.apis is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send bid.apis, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.bid.mtype · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-bid-mtype/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.bid.mtype
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced bid.mtype, which openRTB 2.6 added bid-level markup-type signaling..
Path bid.mtype
## Why it matters
bid.mtype is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send bid.mtype, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Section 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.cattax · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-cattax/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.cattax
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced bidrequest.cattax, site.cattax, app.cattax, publisher.cattax, content.cattax, producer.cattax, bid.cattax, which openRTB 2.6 standardized taxonomy selection with cattax across request and bid objects..
Path bidrequest.cattax site.cattax app.cattax publisher.cattax content.cattax producer.cattax bid.cattax
## Why it matters
bidrequest.cattax is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send bidrequest.cattax, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.1, 3.2.13, 3.2.14, 3.2.15, 3.2.16, 3.2.17, 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.deprecated_fields · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-deprecated_fields/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.deprecated_fields
Deprecated field OpenRTB 2.6-202204 Released 2022-04
## What it means
imp.video.sequence, imp.audio.sequence, device.didsha1, device.didmd5, device.dpidsha1, device.dpidmd5, device.macsha1, device.macmd5, user.yob, user.gender, bid.api is deprecated as of OpenRTB 2.6-202204.
OpenRTB 2.6 deprecated legacy sequence, device-ID hash, demographic, and single-api fields.
Path imp.video.sequence imp.audio.sequence device.didsha1 device.didmd5 device.dpidsha1 device.dpidmd5 device.macsha1 device.macmd5 user.yob user.gender bid.api
## Why it matters
Deprecated fields can be ignored or dropped by up-to-date consumers and are eventually removed. Building on one leaves you exposed when a partner stops reading it.
## How to fix it
Stop depending on imp.video.sequence and check the specification for its replacement.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.7, 3.2.8, 3.2.18, 3.2.20, 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.imp.rwdd_ssai · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-imp-rwdd_ssai/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.imp.rwdd_ssai
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced imp.rwdd, imp.ssai, which openRTB 2.6 added rewarded-inventory and SSAI signaling on impressions..
Path imp.rwdd imp.ssai
## Why it matters
imp.rwdd is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send imp.rwdd, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.4
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.imp.video_audio.pod_bidding · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-imp-video_audio-pod_bidding/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.imp.video_audio.pod_bidding
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced imp.video.maxseq, imp.video.poddur, imp.video.podid, imp.video.podseq, imp.video.mincpmpersec, imp.video.slotinpod, imp.audio.maxseq, imp.audio.poddur, imp.audio.podid, imp.audio.podseq, imp.audio.mincpmpersec, imp.audio.slotinpod, which openRTB 2.6 added pod-bidding controls for video and audio inventory..
Path imp.video.maxseq imp.video.poddur imp.video.podid imp.video.podseq imp.video.mincpmpersec imp.video.slotinpod imp.audio.maxseq imp.audio.poddur imp.audio.podid imp.audio.podseq imp.audio.mincpmpersec imp.audio.slotinpod
## Why it matters
imp.video.maxseq is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send imp.video.maxseq, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.7, 3.2.8
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.imp.video_audio.rqddurs · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-imp-video_audio-rqddurs/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.imp.video_audio.rqddurs
Added field OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced imp.video.rqddurs, imp.audio.rqddurs, which openRTB 2.6 added exact-duration requirements for video and audio creatives..
Path imp.video.rqddurs imp.audio.rqddurs
## Why it matters
imp.video.rqddurs is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send imp.video.rqddurs, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.7, 3.2.8
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.language.bcp47 · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-language-bcp47/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.language.bcp47
Added behavior OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced language.bcp47, which openRTB 2.6 added BCP 47-oriented language signaling, including wlangb-style fields for more precise locale handling..
Path language.bcp47
## Why it matters
language.bcp47 is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send language.bcp47, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.1, 3.2.16, 3.2.18, 4.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.macro.min_to_win · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-macro-min_to_win/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.macro.min_to_win
Added macro OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced macro.${AUCTION_MIN_TO_WIN}, which openRTB 2.6 added the AUCTION_MIN_TO_WIN substitution macro..
Path macro.${AUCTION_MIN_TO_WIN}
## Why it matters
macro.${AUCTION_MIN_TO_WIN} is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send macro.${AUCTION_MIN_TO_WIN}, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 4.4, 4.4.1
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.network_channel_supplychain_eids · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-network_channel_supplychain_eids/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.network_channel_supplychain_eids
Added object OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced network, channel, source.schain, source.schain.nodes, user.eids, eid.uids, which openRTB 2.6 added network, channel, supply-chain, and extended-ID object families..
Path network channel source.schain source.schain.nodes user.eids eid.uids
## Why it matters
network is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send network, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.23, 3.2.24, 3.2.25, 3.2.26, 3.2.27, 3.2.28
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.regs.gdpr · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-regs-gdpr/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.regs.gdpr
Moved field OpenRTB 2.6-202204 Released 2022-04
## What it means
In OpenRTB 2.6-202204, regs.ext.gdpr moved to regs.gdpr.
OpenRTB 2.6 moved GDPR signaling out of regs.ext into the core regs object.
Path regs.ext.gdpr
Use instead regs.gdpr
## Why it matters
A consumer on 2.6-202204 reads this value from regs.gdpr. Send it at the old location and it is silently ignored, so whatever it governs (consent, restrictions, targeting) never takes effect.
## How to fix it
Write the value at regs.gdpr instead of regs.ext.gdpr. While you still serve older partners, you may need to populate both during the transition.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.3
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.removed_deprecated_fields · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-removed_deprecated_fields/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.removed_deprecated_fields
Removed field OpenRTB 2.6-202204 Released 2022-04
## What it means
banner.wmax, banner.hmax, banner.wmin, banner.hmin, video.protocol, content.videoquality was removed in OpenRTB 2.6-202204.
OpenRTB 2.6 removed fields that had already been deprecated in earlier revisions.
Path banner.wmax banner.hmax banner.wmin banner.hmin video.protocol content.videoquality
## Why it matters
The field is no longer part of the specification at 2.6-202204. Consumers will not read it, and a strict one may reject the object.
## How to fix it
Remove banner.wmax from requests targeting 2.6-202204.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.6, 3.2.7, 3.2.16
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.user_agent_brandversion · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-user_agent_brandversion/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.user_agent_brandversion
Added object OpenRTB 2.6-202204 Released 2022-04
## What it means
OpenRTB 2.6-202204 introduced device.sua, brandversion, which openRTB 2.6 added structured user-agent and brand-version objects..
Path device.sua brandversion
## Why it matters
device.sua is only defined from 2.6-202204 onward. Used against an earlier version it is not valid, and a consumer below 2.6-202204 treats it as an unknown field.
## How to fix it
Target OpenRTB 2.6-202204 or later when you send device.sua, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Sections 3.2.29, 3.2.30
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.2.6.user.consent · OpenRTB 2.6-202204 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-2-6-user-consent/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.2.6.user.consent
Moved field OpenRTB 2.6-202204 Released 2022-04
## What it means
In OpenRTB 2.6-202204, user.ext.consent moved to user.consent.
OpenRTB 2.6 moved the TCF consent string from user.ext into the core user object.
Path user.ext.consent
Use instead user.consent
## Why it matters
A consumer on 2.6-202204 reads this value from user.consent. Send it at the old location and it is silently ignored, so whatever it governs (consent, restrictions, targeting) never takes effect.
## How to fix it
Write the value at user.consent instead of user.ext.consent. While you still serve older partners, you may need to populate both during the transition.
Paste your bid request into the tester and select OpenRTB 2.6-202204 to see whether this rule fires against your payload.
## Reference
Specification section: Section 3.2.20
Source: OpenRTB 2.6 Appendix B: Version 2.5 to 2.6
Back to the full rule catalog .
---
# openrtb.3.0.ads_cert · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-ads_cert/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.ads_cert
Added behavior OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 introduced inventory_authentication.ads.cert, which openRTB 3.0 added signed bid request and inventory-authentication guidance via ads.cert..
Path inventory_authentication.ads.cert
## Why it matters
inventory_authentication.ads.cert is only defined from 3.0 onward. Used against an earlier version it is not valid, and a consumer below 3.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 3.0 or later when you send inventory_authentication.ads.cert, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Inventory Authentication
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.events · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-events/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.events
Added object OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 introduced event.pending, event.billing, event.loss, which openRTB 3.0 formalized pending, billing, and loss event notifications..
Path event.pending event.billing event.loss
## Why it matters
event.pending is only defined from 3.0 onward. Used against an earlier version it is not valid, and a consumer below 3.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 3.0 or later when you send event.pending, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Event Notification
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.item · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-item/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.item
Structural shift OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 changes the structure around request.item.
OpenRTB 3.0 replaced the 2.x impression-centric payload shape with Item objects inside the request.
Path request.item
## Why it matters
A structural shift changes where data lives, so a payload shaped for an earlier version does not map cleanly onto 3.0.
## How to fix it
Reshape the payload to the 3.0 layout for request.item.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Object: Item
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.macro_object · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-macro_object/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.macro_object
Added object OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 introduced response.macro, which openRTB 3.0 introduced a Macro object within the response model..
Path response.macro
## Why it matters
response.macro is only defined from 3.0 onward. Used against an earlier version it is not valid, and a consumer below 3.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 3.0 or later when you send response.macro, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Object: Macro
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.openrtb_root · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-openrtb_root/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.openrtb_root
Structural shift OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 changes the structure around openrtb.
OpenRTB 3.0 introduced the Openrtb root object as the container for transport and payload metadata.
Path openrtb
## Why it matters
A structural shift changes where data lives, so a payload shaped for an earlier version does not map cleanly onto 3.0.
## How to fix it
Reshape the payload to the 3.0 layout for openrtb.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Object Model
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.request_response · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-request_response/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.request_response
Structural shift OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 changes the structure around request, response.
OpenRTB 3.0 split the transaction into Request and Response payload objects under the layered architecture.
Path request response
## Why it matters
A structural shift changes where data lives, so a payload shaped for an earlier version does not map cleanly onto 3.0.
## How to fix it
Reshape the payload to the 3.0 layout for request.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Bid Request Payload / Bid Response Payload
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# openrtb.3.0.version_header · OpenRTB 3.0 rule · RTBlint
URL: https://rtblint.org/docs/rules/openrtb-3-0-version_header/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule catalog + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule catalog
## openrtb.3.0.version_header
Added header OpenRTB 3.0 Released 2022-03
## What it means
OpenRTB 3.0 introduced header.x-openrtb-version, which openRTB 3.0 retained explicit version headers as part of the transport layer..
Path header.x-openrtb-version
## Why it matters
header.x-openrtb-version is only defined from 3.0 onward. Used against an earlier version it is not valid, and a consumer below 3.0 treats it as an unknown field.
## How to fix it
Target OpenRTB 3.0 or later when you send header.x-openrtb-version, and make sure the value matches the type and any enum the specification defines for it.
Paste your bid request into the tester and select OpenRTB 3.0 to see whether this rule fires against your payload.
## Reference
Specification section: Layer-1: Transport / Version Headers
Source: OpenRTB 3.0 final specification
Back to the full rule catalog .
---
# Privacy signal locations carry conflicting values · openrtb.privacy.signal_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-privacy-signal_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Privacy signal locations carry conflicting values
openrtb.privacy.signal_conflict warning Bid request
A canonical privacy field and its legacy extension disagree.
## What it means
Privacy checks use the selected version's location when it is present, including an empty or null value. If that location is absent, the alternate is inspected. Conflicting values are never merged.
## Why it matters
Readers using different field locations could reach different decisions about the same request.
## How to fix it
Reconcile the original values with the sender. Use the selected contract's location and remove a duplicate only after confirming that it carries the same value.
## Example that trips it
{ "regs": { "gdpr": 0, "ext": { "gdpr": 1 } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# Bid request is not valid JSON · openrtb.payload.invalid_json · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-payload-invalid_json/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid request is not valid JSON
openrtb.payload.invalid_json error Request or response
The payload is not parseable JSON. No field rules run until this is fixed.
## What it means
The payload could not be parsed as JSON at all: a truncated body, a stray trailing comma, single quotes, unescaped control characters, or a non-JSON body such as HTML from an error page. Validation stops here because no field-level rule can run against a document that does not parse.
## Why it matters
Every bidder rejects an unparseable request outright, so the auction never happens. In production this usually shows up as a partner reporting a 100% error rate while your own logs look clean, because the corruption happens in serialization or transport after your builder runs.
## How to fix it
Serialize with a real JSON library rather than string concatenation or templates, and validate the exact bytes you send, after compression and any proxy hops. The tester shows the parser's error position, which points at the first corrupt byte.
## Example that trips it
{ "id": "req-1", "imp": [ ]
Truncated body: the closing brace never arrives.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
How to validate a bid request
OpenRTB validation in CI
Back to the full diagnostic code reference .
---
# Bid request root is not a JSON object · openrtb.payload.root_not_object · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-payload-root_not_object/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid request root is not a JSON object
openrtb.payload.root_not_object error Request or response
The JSON parses but the root is not an object. A bid request must be a single JSON object.
## What it means
The payload parses as JSON, but the root is an array, a string, a number, or a bare literal instead of an object. An OpenRTB bid request or bid response is always a single JSON object at the top level.
## Why it matters
A typed consumer fails to bind the payload and drops it. The usual causes are batching requests as a JSON array, or double encoding, where the root parses to a string that itself contains the real JSON document.
## How to fix it
Send one object per request. If the root is a string, you are JSON-encoding twice; encode exactly once. If you batch, use the transport's framing (one request per HTTP call, or newline-delimited JSON where a partner explicitly supports it).
## Example that trips it
["{\"id\":\"req-1\"}"]
An array wrapping a double-encoded request: two mistakes in one payload.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Required OpenRTB field is missing · openrtb.field.required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Required OpenRTB field is missing
openrtb.field.required error Request or response
A field the specification marks as required is missing at this path.
## What it means
A field the OpenRTB specification marks as required is absent at this path for the version you validated against. The classic cases: a request without id or imp, an imp without its own id, or a bid without impid or price.
## Why it matters
Required fields are the minimum contract of the auction. A request that omits one is invalid per the spec, and strict bidders no-bid it without telling you. Because lenient partners still answer, the traffic looks healthy while the strictest (often highest-paying) demand silently disappears.
## How to fix it
Populate the field at the reported JSON path. If your builder assembles objects conditionally, make required fields unconditional and fail the build when a value is unavailable, rather than shipping a partial object.
## Example that trips it
{ "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }] }
Missing the top-level request id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid request anatomy
Bid response anatomy
Back to the full diagnostic code reference .
---
# Unknown OpenRTB field for this version · openrtb.field.undefined · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-undefined/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unknown OpenRTB field for this version
openrtb.field.undefined error Request or response
The field is not defined in the canonical OpenRTB catalog for the selected version. Usually a typo or an invented key.
## What it means
The field does not exist in the OpenRTB catalog for the version you validated against. It is usually a typo (bidflor, tagId), a field invented in-house that belongs under ext, or a field from a different object pasted at the wrong level. Subtrees under ext are intentionally left open and never trip this code.
## Why it matters
OpenRTB tells consumers to ignore unknown fields, so nothing errors: the data you meant to send simply never arrives. A misspelled field carrying a floor, a consent signal, or a deal id fails silently, which is far more expensive than a loud rejection.
## How to fix it
Fix the spelling to the canonical field name, or move proprietary data under the nearest ext object, which is the spec's designated extension point. The finding's path shows exactly which key was not recognized.
## Example that trips it
{ "imp": [{ "id": "1", "bidflor": 2.5 }] }
A misspelled bidfloor is ignored by every consumer, and the floor never applies.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Deprecated OpenRTB field still in use · openrtb.field.deprecated · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-deprecated/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Deprecated OpenRTB field still in use
openrtb.field.deprecated warning Request or response
The field still parses but is deprecated in the selected version. Migrate to its replacement.
## What it means
The field is deprecated in the version you validated against. It still parses, and older consumers still read it, but the specification has named a successor. The highest-traffic example is imp.video.placement, deprecated in 2.6-202303 in favor of imp.video.plcmt.
## Why it matters
Buyers move their logic to the replacement field. Inventory that only declares the deprecated form gets classified by defaults, which in the placement case means instream inventory priced as undeclared. Deprecated fields are also removal candidates in future snapshots.
## How to fix it
Populate the replacement field. During migration it is common to send both the old and new field with consistent values, then drop the deprecated one once your partners confirm they read the successor.
## Example that trips it
{ "device": { "didsha1": "9f86d081884c7d65" } }
Hashed hardware ids were deprecated across the 2.6 line. Send ifa, or an eid, and let the buyer resolve identity from there.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
placement vs plcmt
OpenRTB 2.5 vs 2.6
Versioned rule catalog
Back to the full diagnostic code reference .
---
# OpenRTB field moved to a new path · openrtb.field.moved · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-moved/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB field moved to a new path
openrtb.field.moved error Request or response
The field moved to a different path in this version, for example regs.ext.gdpr to regs.gdpr.
## What it means
The field exists in the version you validated against, but at a different path. The 2.6 promotions are the big ones: regs.ext.gdpr became regs.gdpr, user.ext.consent became user.consent, and source.ext.schain became source.schain.
## Why it matters
A consumer built for this version reads the new path only. Data sent at the old location is silently ignored, so whatever it governs never takes effect. For the privacy fields that can mean EU traffic with no visible consent signal, which buyers must treat as consent absent.
## How to fix it
Write the value at the path this finding names as the replacement. While you still serve partners on older versions, populate both paths with identical values, and retire the old one when those integrations upgrade.
## Example that trips it
{ "regs": { "ext": { "gdpr": 1 } } }
On 2.6 the flag lives at regs.gdpr; a 2.6-native buyer never sees this one.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
OpenRTB 2.5 vs 2.6
Back to the full diagnostic code reference .
---
# OpenRTB field was removed in this version · openrtb.field.removed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-removed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB field was removed in this version
openrtb.field.removed error Request or response
The field was removed in the selected version and is no longer valid.
## What it means
The field was part of an earlier OpenRTB release but was removed by the version you validated against, so it is no longer defined at this path.
## Why it matters
Consumers on this version do not read the field, and a strict parser may reject the containing object. Payloads carrying removed fields usually indicate a builder pinned to an old spec revision, which tends to come with other stale paths as well.
## How to fix it
Remove the field, or move to the replacement the finding names if one exists. If you must keep serving an old integration, send it a payload targeted at the version it actually speaks rather than mixing eras in one document.
## Example that trips it
rtblint validate --version 2.6-202606 request.json
{ "imp": [{ "id": "1", "banner": { "w": 300, "h": 250, "wmax": 728 } }] }
banner.wmax was deprecated before 2.6 and deleted in it. Against 2.5 the same payload reports the softer openrtb.field.deprecated, so the version you validate against decides which of the two you see.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB versions
Versioned rule catalog
Back to the full diagnostic code reference .
---
# OpenRTB field belongs to a later version · openrtb.field.not_yet_available · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-not_yet_available/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB field belongs to a later version
openrtb.field.not_yet_available error Request or response
The field belongs to a later version than the one selected, so it is not valid against this snapshot.
## What it means
The field is real, but it was introduced in a later OpenRTB version than the one you validated against. Sending 2.6 fields such as regs.gpp on a request declared as 2.5 lands here.
## Why it matters
A consumer honoring the declared version treats the field as unknown and ignores it. The mismatch usually means your builder and your version declaration drifted apart, and partners cannot tell which one to trust.
## How to fix it
Either declare the version that actually defines the field (the x-openrtb-version header and, on 3.0, the envelope ver) or drop the field from payloads aimed at older partners. Validate against the version you declare, not the one you wish you declared.
## Example that trips it
rtblint validate --version 2.6-202210 request.json
{ "regs": { "gpp": "DBABMA~CPXxRfAPXxRfA" } }
regs.gpp arrives in 2.6-202211, and the message names that version. This is the code to look for when a partner says a field is unknown: it usually means the two of you pinned different 2.6 snapshots, not that the field is wrong.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB versions
Back to the full diagnostic code reference .
---
# Skippable-only video field used on a non-skippable imp · openrtb.field.requires_skippable_video · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-field-requires_skippable_video/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Skippable-only video field used on a non-skippable imp
openrtb.field.requires_skippable_video error Bid request
The field only applies to skippable video and was used where skippability is not in effect.
## What it means
video.skipmin or video.skipafter is present, but video.skip is not set to 1. Both fields parameterize skippable video (the minimum duration that earns a skip button, and the seconds before it appears), so they only mean something when the placement is declared skippable.
## Why it matters
A buyer cannot tell whether the placement is skippable with contradictory signals, and skippability changes both creative choice and price. Some parsers drop the video object entirely rather than guess.
## How to fix it
If the placement is skippable, set "skip": 1 alongside skipmin and skipafter. If it is not, remove both dependent fields.
## Example that trips it
{ "video": { "mimes": ["video/mp4"], "skipmin": 15, "skipafter": 5 } }
skipmin and skipafter without skip: 1.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
CTV and video reference
Back to the full diagnostic code reference .
---
# Two mutually exclusive OpenRTB fields both set · openrtb.fields.mutually_exclusive · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-fields-mutually_exclusive/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Two mutually exclusive OpenRTB fields both set
openrtb.fields.mutually_exclusive error Request or response
Two fields that cannot coexist were both present. Keep one.
## What it means
Two fields the specification defines as mutually exclusive are both present. The best-known case is site and app (and dooh) on the same request. The same code fires for wseat with bseat, wlang with wlangb, acat with bcat, keywords with kwarray, language with langb, and a 3.0 envelope carrying both a request and a response.
## Why it matters
Each pair answers one question two contradictory ways: what inventory is this, which seats may bid, which categories are allowed. A bidder cannot resolve the contradiction, so many drop the request outright. The usual cause is a builder merging two config sources and keeping both branches.
## How to fix it
Keep exactly one of the pair. For site vs app, pick the object matching the actual inventory. For allowlist vs blocklist pairs, decide which policy you enforce and send only that list.
## Example that trips it
{ "site": { "domain": "example.com" }, "app": { "bundle": "com.example" } }
One request claiming to be both web and app inventory.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Common OpenRTB mistakes
Bid request anatomy
Back to the full diagnostic code reference .
---
# Imp has no banner, video, audio or native object · openrtb.imp.media_type.required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-imp-media_type-required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Imp has no banner, video, audio or native object
openrtb.imp.media_type.required error Bid request
An impression has no media-type object. Each imp needs a banner, video, audio, or native object.
## What it means
An entry in imp[] carries none of banner, video, audio, or native. Those subordinate objects are how an impression declares what kind of creative is for sale; an imp without any of them offers nothing.
## Why it matters
A bidder has no idea what creative form is acceptable, so it cannot bid. This usually comes from a request builder that attaches media objects conditionally and has a code path where every condition is false.
## How to fix it
Attach the media object matching the placement, with its own required fields populated (for example video.mimes, or banner dimensions via w/h or format). An imp may offer several media types at once; it must offer at least one.
## Example that trips it
{ "imp": [{ "id": "1", "bidfloor": 1.2 }] }
A floor with nothing for sale behind it.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid request anatomy
Back to the full diagnostic code reference .
---
# OpenRTB field has the wrong JSON type · openrtb.type.mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-type-mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB field has the wrong JSON type
openrtb.type.mismatch error Request or response
The value has the wrong JSON type, for example a string where an integer is expected.
## What it means
The value at this path has the wrong JSON type for the field: a quoted number where an integer belongs ("at": "1"), a boolean where the spec defines an integer flag ("secure": true), an object where an array is expected, and so on. One code covers every typed field in the catalog; the path tells you which field tripped it.
## Why it matters
Typed consumers (Go structs, Java POJOs, protobuf bridges) fail to deserialize the whole payload over one wrong type, not just the one field. That silently removes every strictly-typed bidder from your auction, and those tend to be the largest ones.
## How to fix it
Emit the type the catalog defines: JSON numbers for integers and floats, integer flags (0/1) rather than booleans, arrays where the field is plural. The usual root cause is a template or string-building serializer; construct payloads with a typed JSON library instead.
## Example that trips it
{ "at": "1", "tmax": "120", "imp": [{ "id": "1", "secure": true }] }
Three type mismatches that each break strict parsers.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Common OpenRTB mistakes
OpenRTB JSON Schemas
Back to the full diagnostic code reference .
---
# OpenRTB enum value is out of range · openrtb.value.invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-value-invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB enum value is out of range
openrtb.value.invalid error Request or response
The value is outside the documented set or range for this field, such as an out-of-range enum.
## What it means
The value has the right type but is outside what the specification documents for the field: an enum value that does not exist (plcmt: 9), a value from a neighboring list, or a stale value removed in the version you validated against. Exchange-specific ranges (500+) are recognized where the spec reserves them.
## Why it matters
Consumers either drop the field, guess a default, or discard the request. Enum drift is a classic version-skew symptom: the integer meant something in the list you built against, but not in the list the receiver reads.
## How to fix it
Send a value from the documented list for the version you target. The enum reference maps every list per version, including where 2.6 handed lists over to AdCOM.
## Example that trips it
{ "at": 99 }
Auction type 99 is outside the documented list. 1 is first price, 2 is second price plus, and 500 and above is reserved for exchange-specific values that both sides have agreed out of band.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Enumerated lists reference
Back to the full diagnostic code reference .
---
# OpenRTB version has no usable catalog · openrtb.version.unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-version-unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB version has no usable catalog
openrtb.version.unsupported error Request or response
The targeted version has no usable catalog. Validation refuses rather than passing the payload silently.
## What it means
You asked for validation against a version RTBlint has no usable catalog for. The one live example is 2.6-202204, whose source document does not yield a machine-readable catalog. Rather than run a hollow check and report the payload clean, validation refuses.
## Why it matters
A validator that silently passes everything is worse than none: it launders broken payloads into a green checkmark. The explicit refusal tells you the coverage gap exists so you can validate against an adjacent snapshot instead.
## How to fix it
Validate against the nearest supported snapshot (for 2.6-202204, use 2.6-202210). The versions page lists every tracked snapshot and its catalog status.
## Example that trips it
rtblint validate --version 2.6-202204 request.json
This one is tripped by the version you ask for rather than by the payload. 2.6-202204 has no extracted catalog, so the validator refuses instead of silently falling back to a neighbouring snapshot and giving you a confident wrong answer.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB versions
Back to the full diagnostic code reference .
---
# tmax is zero or negative · openrtb.request.tmax_non_positive · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-request-tmax_non_positive/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## tmax is zero or negative
openrtb.request.tmax_non_positive error Bid request
tmax is zero or negative, leaving no time for bids to be received.
## What it means
tmax, the number of milliseconds the exchange allows for bids to arrive (network latency included), is zero or negative. Taken literally, the auction is over before it starts.
## Why it matters
Bidders that honor tmax will not spend compute on a request they have already lost, and bidders that ignore it are answering a request whose contract is broken. Either way the value came from a bug: an unset default, a unit conversion, or subtraction that went negative.
## How to fix it
Send the real time budget in milliseconds; production values commonly sit between 100 and 500. If an upstream partner supplied tmax, forward it unchanged or reduced by your own processing time, never increased and never zeroed.
## Example that trips it
{ "id": "req-1", "tmax": 0, "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }] }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
tmax reference
tmax and bidder timeouts
Back to the full diagnostic code reference .
---
# tmax looks like seconds instead of milliseconds · openrtb.request.tmax_implausible · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-request-tmax_implausible/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## tmax looks like seconds instead of milliseconds
openrtb.request.tmax_implausible warning Bid request
tmax is unusually high for an RTB auction; likely seconds instead of milliseconds.
## What it means
tmax exceeds 10,000, which is ten seconds of auction budget. Real-time auctions complete in a few hundred milliseconds, so a value this size nearly always means the sender wrote seconds (or a whole timeout config) into a field defined as milliseconds.
## Why it matters
Bidders either clamp the value to their own maximum or flag the request as malformed. An exchange whose requests carry impossible timeouts reads as an exchange whose other fields deserve suspicion too.
## How to fix it
Express tmax in milliseconds. If your internal config keeps timeouts in seconds, convert at the serialization boundary and add a unit suffix to the config key so the next reader does not repeat the mistake.
## Example that trips it
{ "tmax": 300000 }
Five minutes. Someone sent seconds times a thousand, or a server timeout.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
tmax reference
Back to the full diagnostic code reference .
---
# cur is not a valid ISO-4217 currency code · openrtb.request.cur_format_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-request-cur_format_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## cur is not a valid ISO-4217 currency code
openrtb.request.cur_format_invalid warning Bid request
A cur entry is not a three-letter uppercase ISO-4217 currency code.
## What it means
An entry in the request's cur array, the list of currencies bids may use, is not shaped like an ISO 4217 code: three uppercase letters (USD, EUR, JPY). Lowercase, symbols, or full currency names land here.
## Why it matters
Buyers match bid currency against this list literally. An entry like "usd" or "$" matches nothing, so bidders either fall back to assuming USD or skip the request, and cross-currency demand you meant to invite never arrives.
## How to fix it
Use uppercase ISO 4217 alpha-3 codes, one per allowed currency. If you only transact in USD you can omit cur entirely, since USD is the default assumption.
## Example that trips it
{ "cur": ["usd", "€"] }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# bidfloor is negative · openrtb.imp.bidfloor_negative · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-imp-bidfloor_negative/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## bidfloor is negative
openrtb.imp.bidfloor_negative error Bid request
bidfloor is negative; a CPM price cannot be negative. Also fires on Deal.bidfloor.
## What it means
A bidfloor, the minimum CPM the seller accepts, is negative. The same check runs on each Deal inside imp.pmp.deals, which carries its own independent floor.
## Why it matters
A negative price is always an arithmetic bug: a currency conversion gone wrong, a discount subtracted below zero, or an uninitialized sentinel leaking into the payload. Bidders cannot honor it, and it signals broken pricing logic on everything else the request says.
## How to fix it
Clamp floors at zero and find the computation that produced the negative value. A floor of 0 is valid and means no minimum; use it when you genuinely have no floor.
## Example that trips it
{ "imp": [{ "id": "1", "bidfloor": -0.5, "banner": { "w": 300, "h": 250 } }] }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid floors reference
Back to the full diagnostic code reference .
---
# bidfloorcur is not a valid ISO-4217 code · openrtb.imp.bidfloorcur_format_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-imp-bidfloorcur_format_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## bidfloorcur is not a valid ISO-4217 code
openrtb.imp.bidfloorcur_format_invalid warning Bid request
bidfloorcur is not a three-letter uppercase ISO-4217 currency code. Also fires on Deal.bidfloorcur.
## What it means
bidfloorcur, the currency the floor is denominated in, is not a three-letter uppercase ISO 4217 code. The same check runs on the per-deal bidfloorcur inside imp.pmp.deals.
## Why it matters
bidfloorcur defaults to USD and inherits from nothing else. A malformed code is unreadable, so buyers fall back to the USD default, and a floor you meant in yen or won is suddenly a dollar figure that kills every bid on the impression.
## How to fix it
Send an uppercase ISO 4217 code ("JPY", "KRW", "EUR") whenever the floor is not in USD, next to every floor that needs it, deals included.
## Example that trips it
{ "imp": [{ "id": "1", "bidfloor": 120, "bidfloorcur": "yen" }] }
Unreadable currency, so the 120 floor reads as USD and nothing clears it.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid floors reference
Common OpenRTB mistakes
Back to the full diagnostic code reference .
---
# gpp_sid sent without the gpp string · openrtb.regs.gpp_sid_without_gpp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-gpp_sid_without_gpp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## gpp_sid sent without the gpp string
openrtb.regs.gpp_sid_without_gpp warning Bid request
gpp_sid is present but gpp is absent or empty.
## What it means
regs.gpp_sid names the GPP sections that apply to this request, but regs.gpp, the consent string those sections live in, is absent or empty. The section pointer has nothing to point at.
## Why it matters
A buyer told that section 8 applies but given no string cannot read any consent state. Under the US state privacy patchwork that forces the defensive path: suppress personalization or skip the request, both of which pay less.
## How to fix it
Send the pair together: the GPP string in regs.gpp and the applicable section ids in regs.gpp_sid. If no GPP framework applies, omit both fields.
## Example that trips it
{ "regs": { "gpp_sid": [8] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# gpp string sent without gpp_sid · openrtb.regs.gpp_without_gpp_sid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-gpp_without_gpp_sid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## gpp string sent without gpp_sid
openrtb.regs.gpp_without_gpp_sid warning Bid request
gpp is present but gpp_sid is absent or empty.
## What it means
regs.gpp carries a GPP consent string, but regs.gpp_sid, the list of section ids that declare which frameworks apply, is absent or empty. The string exists but nothing says which of its sections governs this user.
## Why it matters
GPP is a container for many regional frameworks. Without gpp_sid a buyer would have to guess which section applies, and privacy logic does not run on guesses: the practical result is the same as sending no consent signal at all.
## How to fix it
Always populate regs.gpp_sid alongside regs.gpp with the integer ids of the applicable sections (for example 7 for the US national section, 8 for California). Both fields arrived together in 2.6-202211; treat them as one unit.
## Example that trips it
{ "regs": { "gpp": "DBABMA~CPXxRfAPXxR..." } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# GPP string is not a well-formed GPP header · openrtb.regs.gpp_malformed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-gpp_malformed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## GPP string is not a well-formed GPP header
openrtb.regs.gpp_malformed warning Bid request
regs.gpp does not decode as a GPP v1 header (type 3, version 1, Fibonacci section range), or uses an illegal character, or has no '~' sections.
## What it means
A GPP string is a 6-bit-alphabet header, then '~', then one payload per declared section. The header starts with DB (type 3, version 1) and encodes the section ids as a Fibonacci range. This string does not decode that way, or gpp_sid names section 3 (the header itself) or an undocumented id.
## Why it matters
Buyers that cannot parse the header cannot find TCF or US National sections. They treat the user as having no GPP signal, which is usually a no-bid or a non-personalized bid.
## How to fix it
Emit the string from a CMP or the IAB GPP encoder. Do not concatenate TCF and USP by hand. gpp_sid must list the discrete section ids, never 3.
## Example that trips it
{ "regs": { "gpp": "not-a-gpp-string", "gpp_sid": [2] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# GPP header sections do not match gpp_sid or the payload count · openrtb.regs.gpp_section_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-gpp_section_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## GPP header sections do not match gpp_sid or the payload count
openrtb.regs.gpp_section_mismatch warning Bid request
The section ids encoded in the GPP header disagree with regs.gpp_sid, or the number of '~' payloads does not match the header.
## What it means
The GPP header's Fibonacci range is the table of contents. gpp_sid must list the same ids in the same order, and there must be one payload after '~' per id. A header that says section 2 with gpp_sid [7] is two different stories.
## Why it matters
A buyer that trusts gpp_sid will decode the wrong payload as US National or TCF. Privacy decisions then run on the wrong framework.
## How to fix it
Generate header, payloads, and gpp_sid from one encoder pass. If you add a section, rebuild the header; do not append '~' and forget the range.
## Example that trips it
{ "regs": { "gpp": "DBABM~CPXxRfAPXxRfAAfKABENAPCgAAAAAAAAAAAYgAAAAAAAA", "gpp_sid": [7] } }
DBABM encodes section 2 (TCF EU). gpp_sid claims 7 (US National).
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# TCF string is not a TCF 2 core string · openrtb.regs.tcf_malformed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-tcf_malformed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TCF string is not a TCF 2 core string
openrtb.regs.tcf_malformed warning Bid request
user.consent, legacy user.ext.consent, or a GPP section that should be TCF (sids 2 and 5), is not a TCF 2 core string (starts with C, long enough, TCF alphabet).
## What it means
TCF 2.x core strings start with C (version bits = 2). TCF 1 started with B. The core segment must be long enough to hold the required bit fields, and only A-Z a-z 0-9 - _ . appear. This check is shape, not a full vendor-bit decode.
## Why it matters
A malformed consent string is worse than none: CMPs and DSPs that try to decode it error out, and the bid is skipped rather than run as non-personalized.
## How to fix it
Take the string from a TCF 2.2 CMP. Do not put "yes", a US Privacy string, or a TCF 1 string in user.consent.
## Example that trips it
{ "user": { "consent": "yes" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# us_privacy string is malformed · openrtb.regs.us_privacy_malformed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-regs-us_privacy_malformed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## us_privacy string is malformed
openrtb.regs.us_privacy_malformed warning Bid request
us_privacy does not match the IAB US Privacy string shape: "1" followed by three Y/N/- characters.
## What it means
The us_privacy string does not match the IAB US Privacy (CCPA) shape: the version character "1" followed by three characters, each Y, N, or a hyphen, covering notice given, opt-out of sale, and LSPA coverage. "1YNN" and "1---" are valid; "yes" and "1YN" are not.
## Why it matters
Buyers parse the string positionally. A malformed value cannot be parsed, so CCPA-conscious buyers treat the signal as missing and default to the restrictive path on California traffic.
## How to fix it
Emit exactly four characters from the defined alphabet. Note the ecosystem is migrating this signal into GPP (the string also travels as a GPP section); if you send both, keep them consistent.
## Example that trips it
{ "regs": { "ext": { "us_privacy": "1Y" } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Privacy signals reference
Back to the full diagnostic code reference .
---
# schain has the same node twice · openrtb.schain.duplicate_node · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-duplicate_node/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain has the same node twice
openrtb.schain.duplicate_node warning Bid request
Two adjacent SupplyChain nodes share the same asi and sid, as if a node were appended twice.
## What it means
Two adjacent nodes in the SupplyChain object carry the same asi (advertising system identifier) and sid (seller id), which looks like the same hop appended twice rather than two real hops.
## Why it matters
Buyers audit schain against sellers.json hop by hop. A duplicated node makes the chain longer than the real supply path, fails path-length checks, and reads as either sloppy plumbing or deliberate padding. Unverifiable chains lose spend to paths that verify cleanly.
## How to fix it
Append exactly one node per system that handled the request. The usual bug is a forwarder that appends its node without checking whether the upstream already added it.
## Example that trips it
{ "source": { "schain": { "complete": 1, "ver": "1.0", "nodes": [
{ "asi": "ssp.example", "sid": "42", "hp": 1 },
{ "asi": "ssp.example", "sid": "42", "hp": 1 }
] } } }
The same seller appears twice. Usually the chain was appended by two hops that both believed they were the first to add it.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# schain node is missing hp · openrtb.schain.node.hp_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-node-hp_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain node is missing hp
openrtb.schain.node.hp_missing warning Bid request
A SupplyChain node has no hp field; the spec expects it to be propagated on every node.
## What it means
A SupplyChain node omits hp, the flag saying whether the node participated in the payment flow (1) or was a non-payment intermediary (0). The spec expects it on every node; in SupplyChain 1.0 chains it should be 1.
## Why it matters
hp is how buyers separate the money path from pass-through intermediaries. A node without it cannot be classified, which degrades the whole chain's auditability against sellers.json.
## How to fix it
Set hp explicitly on every node you append, and preserve it on nodes you forward. If your schain builder has an optional hp parameter, make it required.
## Example that trips it
{ "source": { "schain": { "ver": "1.0", "complete": 1, "nodes": [{ "asi": "exchange.example", "sid": "pub-42" }] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# schain node has an empty asi or sid · openrtb.schain.node.identifier_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-node-identifier_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain node has an empty asi or sid
openrtb.schain.node.identifier_empty error Bid request
A SupplyChain node's asi or sid is an empty string.
## What it means
A SupplyChain node carries an empty string for asi or sid. The pair is the node's identity: the advertising system's domain and the seller's account id within it. Empty strings satisfy a schema check while identifying nothing.
## Why it matters
An unidentifiable node cannot be cross-checked against sellers.json, and one broken node poisons the whole chain's verification. Buyers with supply-path policies treat an unverifiable chain the same as a suspicious one.
## How to fix it
Populate asi with the system's canonical domain and sid with the seller id exactly as it appears in that system's sellers.json. If a value is unavailable at build time, fail the node rather than emitting an empty placeholder.
## Example that trips it
{ "nodes": [{ "asi": "", "sid": "42", "hp": 1 }] }
An empty asi is worse than an absent node: it occupies a position in the chain while identifying nobody, so the path cannot be audited.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# schain ver is not 1.0 · openrtb.schain.ver_unexpected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-ver_unexpected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain ver is not 1.0
openrtb.schain.ver_unexpected warning Bid request
SupplyChain ver is something other than 1.0, the only published version.
## What it means
The SupplyChain object's ver field carries a value other than "1.0". That field names the version of the SupplyChain spec the chain was built against, and 1.0 is the only version ever published.
## Why it matters
Receivers branch on ver to decide how to read the chain. An unrecognised value sends a chain down an unhandled path, where it is usually dropped rather than rejected loudly, so the supply path silently stops being auditable.
## How to fix it
Set ver to "1.0". If the value came from a config field someone bumped alongside an unrelated version number, pin it to a constant instead.
## Example that trips it
{ "source": { "schain": { "ver": "2.0", "complete": 1, "nodes": [] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# schain declares complete: 0 · openrtb.schain.incomplete · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-incomplete/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain declares complete: 0
openrtb.schain.incomplete warning Bid request
complete is 0, declaring that at least one upstream node is missing from the path.
## What it means
The SupplyChain object sets complete to 0. That is a deliberate statement that the declared nodes do not cover the whole path from the publisher onward, so at least one hop is not named.
## Why it matters
An incomplete chain cannot be verified end to end, because the missing hop is exactly where an unauthorised reseller would sit. Buyers running supply-path policies commonly reject complete: 0 outright, so this is a revenue question before it is a compliance one.
## How to fix it
Trace where the chain is being built and find the hop that fails to append its node. complete: 0 is honest when a node genuinely cannot be identified, but it should be rare, not a default.
## Example that trips it
{ "source": { "schain": { "ver": "1.0", "complete": 0, "nodes": [{ "asi": "exchange.example", "sid": "pub-42", "hp": 1 }] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# schain declares more than ten hops · openrtb.schain.length_implausible · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-length_implausible/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain declares more than ten hops
openrtb.schain.length_implausible warning Bid request
The declared path has more than ten nodes, which is far longer than a real supply path.
## What it means
The SupplyChain object declares more than ten nodes. Real paths run to a handful of hops: a publisher's SSP, perhaps a reseller, perhaps an exchange in front of the bidder.
## Why it matters
Every hop has to be independently authorised in that system's sellers.json for the chain to verify, so a very long path is both expensive to audit and unlikely to be genuine. In practice it is usually a concatenation bug where a forwarder appends the upstream chain twice, and occasionally it is a laundered path.
## How to fix it
Log the chain at each hop and find the point where the node count jumps. Appending should add exactly one node per system, never splice two chains together.
## Example that trips it
{ "nodes": [
{ "asi": "hop1.example", "sid": "1", "hp": 1 },
...
{ "asi": "hop11.example", "sid": "11", "hp": 1 }
] }
Eleven hops. The ceiling is ten, and chains this long are usually a sign the schain was appended twice rather than a genuinely deep resale path.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# schain declared in two places at once · openrtb.schain.duplicate_location · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-duplicate_location/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain declared in two places at once
openrtb.schain.duplicate_location warning Bid request
A supply chain is declared at both source.schain and source.ext.schain.
## What it means
The request carries a chain in both places: source.schain, which is where OpenRTB 2.6 put the object, and source.ext.schain, which is where it lived as a community extension before that.
## Why it matters
The two copies can disagree, and receivers differ on which one they read. A request that verifies cleanly at one buyer can fail at the next, and a stale extension copy is a common way for a chain to keep naming a partner that was already removed from the canonical one.
## How to fix it
Emit one chain. On 2.6 and later that is source.schain. Keep the ext copy only while a named partner still requires it, and generate both from the same source so they cannot drift.
## Example that trips it
{ "source": { "schain": { "ver": "1.0", "complete": 1, "nodes": [] }, "ext": { "schain": { "ver": "1.0", "complete": 1, "nodes": [] } } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# schain node hp is not 1 · openrtb.schain.node.hp_unexpected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-node-hp_unexpected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain node hp is not 1
openrtb.schain.node.hp_unexpected warning Bid request
A SupplyChain node sets hp to something other than 1.
## What it means
A node carries an hp value other than 1. The flag says whether the node participates in the payment flow, and version 1.0 of the SupplyChain object expects every node on the declared path to be marked as participating.
## Why it matters
hp is how buyers tell the money path from pass-through intermediaries. A node claiming to be outside the payment flow on a 1.0 chain is either a builder bug or a hop that should not be in this object at all, and either way the chain stops classifying cleanly.
## How to fix it
Set hp to 1 on every node you append. If a system genuinely does not touch payment, the question to settle is whether it belongs in the chain, not whether to flag it with hp: 0.
## Example that trips it
{ "source": { "schain": { "ver": "1.0", "complete": 1, "nodes": [{ "asi": "exchange.example", "sid": "pub-42", "hp": 0 }] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# schain asi is not a bare domain · openrtb.schain.node.asi_not_domain · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-node-asi_not_domain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain asi is not a bare domain
openrtb.schain.node.asi_not_domain warning Bid request
A node's asi is not a bare domain: it carries a scheme, a path, a port, or whitespace.
## What it means
A SupplyChain node's asi holds something other than a bare canonical domain. The usual shapes are a full URL, a domain with a trailing slash, a host:port pair, or a value with stray whitespace.
## Why it matters
asi is a lookup key, not a label. Verifying a hop means fetching that domain's sellers.json and matching the sid inside it, then cross-checking the publisher's ads.txt. Anything that is not a bare domain fails the lookup, so the node cannot be authorised and the chain does not verify.
## How to fix it
Strip the value to the canonical domain of the selling system, matching the identifier used for that system in ads.txt. Parse and normalise at the point the node is built rather than trusting a configured string.
## Example that trips it
{ "source": { "schain": { "nodes": [{ "asi": "https://exchange.example/ssp", "sid": "pub-42", "hp": 1 }] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# schain asi contains uppercase characters · openrtb.schain.node.asi_not_lowercase · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-schain-node-asi_not_lowercase/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain asi contains uppercase characters
openrtb.schain.node.asi_not_lowercase warning Bid request
A node's asi contains uppercase characters; canonical domains are lowercase.
## What it means
A SupplyChain node's asi carries uppercase characters, such as Exchange.example rather than exchange.example.
## Why it matters
The value is matched against sellers.json and ads.txt entries, and implementations vary in whether they compare case-insensitively. A chain that verifies at one buyer can fail at the next for no reason other than casing, which is an expensive way to lose spend.
## How to fix it
Lowercase asi when the node is built. If the value comes from configuration or a partner feed, normalise on ingest so the same string is used everywhere.
## Example that trips it
{ "source": { "schain": { "nodes": [{ "asi": "Exchange.example", "sid": "pub-42", "hp": 1 }] } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# No sellers.json in the cache for this hop · openrtb.resolve.sellers_json_unavailable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-sellers_json_unavailable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## No sellers.json in the cache for this hop
openrtb.resolve.sellers_json_unavailable warning Bid request
The local cache has no sellers.json for this node's asi, so the hop cannot be authorised.
## What it means
Opt-in --resolve looked up sellers//sellers.json in the local cache and found no file. The core already checked that asi is a bare domain; this finding means that domain's sellers.json was not cached.
## Why it matters
A hop that cannot be looked up cannot be authorised. Buyers that verify SupplyChain against sellers.json treat a missing file as an unverifiable node and drop or discount the path.
## How to fix it
Fetch https:///sellers.json into the cache as sellers//sellers.json, then re-run with --resolve --cache. If the advertising system does not publish sellers.json, the node cannot be authorised.
## Example that trips it
rtblint validate --resolve --cache ./supply-cache request.json
Fires when a payment node's asi has no sellers//sellers.json in the cache directory.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# Cached sellers.json is not usable · openrtb.resolve.sellers_json_unparseable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-sellers_json_unparseable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Cached sellers.json is not usable
openrtb.resolve.sellers_json_unparseable warning Bid request
The cached sellers.json for this hop exists but cannot be read as a sellers.json document.
## What it means
sellers//sellers.json was present in the cache but is not a JSON object with a sellers array, so sid was not checked against it.
## Why it matters
A corrupt or HTML error-page cached as sellers.json is not a lookup. The hop stays unverifiable until the file is a real sellers.json document.
## How to fix it
Replace the cached file with the document published at https:///sellers.json. Confirm it parses as JSON and contains a sellers array.
## Example that trips it
rtblint validate --resolve --cache ./supply-cache request.json
Fires when sellers//sellers.json exists but is not a sellers.json object.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
Back to the full diagnostic code reference .
---
# schain sid is not in that domain's sellers.json · openrtb.resolve.sid_not_in_sellers · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-sid_not_in_sellers/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## schain sid is not in that domain's sellers.json
openrtb.resolve.sid_not_in_sellers error Bid request
This node's sid does not match any seller_id in the cached sellers.json for its asi.
## What it means
The cache has a sellers.json for the node's asi, but no seller in that file has seller_id equal to the node's sid. The hop names a seller the advertising system does not declare.
## Why it matters
sid is the account the advertising system assigned. If it is not in sellers.json, the node is not an authorised seller on that system, and buyers that verify the chain will reject the path.
## How to fix it
Use the seller_id published in that system's sellers.json. The usual bug is a house account id, a deprecated id, or a sid copied from a different advertising system.
## Example that trips it
{ "source": { "schain": { "nodes": [{ "asi": "exchange.example", "sid": "not-in-sellers", "hp": 1 }] } } }
Requires --resolve --cache with sellers/exchange.example/sellers.json that does not list not-in-sellers.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Supply chain reference
The supply chain trust stack
Back to the full diagnostic code reference .
---
# No ads.txt in the cache for this site · openrtb.resolve.ads_txt_unavailable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-ads_txt_unavailable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## No ads.txt in the cache for this site
openrtb.resolve.ads_txt_unavailable warning Bid request
The local cache has no ads.txt for site.domain, so the first payment hop cannot be checked against the publisher's authorization file.
## What it means
Opt-in --resolve looked up ads//ads.txt (and ads//ads.txt with a leading www. stripped) and found no file.
## Why it matters
ads.txt is how a publisher authorises who may sell its inventory. Without the file, the first SupplyChain hop cannot be matched to a DIRECT or RESELLER line.
## How to fix it
Fetch https:///ads.txt into the cache as ads//ads.txt, then re-run with --resolve --cache.
## Example that trips it
rtblint validate --resolve --cache ./supply-cache request.json
Fires when site.domain is set, a payment hop exists, and the cache has no ads.txt for that domain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
The supply chain trust stack
Back to the full diagnostic code reference .
---
# First payment hop is not in the publisher's ads.txt · openrtb.resolve.ads_txt_unauthorized · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-ads_txt_unauthorized/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## First payment hop is not in the publisher's ads.txt
openrtb.resolve.ads_txt_unauthorized error Bid request
The publisher's ads.txt does not list the first payment node's asi and sid as DIRECT or RESELLER.
## What it means
The cache has ads.txt for site.domain, but no DIRECT or RESELLER row matches the first SupplyChain node with hp not equal to 0.
## Why it matters
That hop is the seller the publisher authorised. If ads.txt does not list it, the inventory is being sold by someone the publisher did not name, which is the failure ads.txt exists to catch.
## How to fix it
The publisher must add a line `, , DIRECT` or `RESELLER` to ads.txt, or the chain's first payment node must use an asi/sid pair that is already listed.
## Example that trips it
{ "site": { "domain": "publisher.example" }, "source": { "schain": { "nodes": [{ "asi": "ssp.example", "sid": "99", "hp": 1 }] } } }
Requires --resolve --cache with ads/publisher.example/ads.txt that does not list ssp.example / 99.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
The supply chain trust stack
Back to the full diagnostic code reference .
---
# No app-ads.txt in the cache for this bundle · openrtb.resolve.app_ads_txt_unavailable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-app_ads_txt_unavailable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## No app-ads.txt in the cache for this bundle
openrtb.resolve.app_ads_txt_unavailable warning Bid request
The local cache has no app-ads.txt for app.bundle, so the first payment hop cannot be checked against the app's authorization file.
## What it means
Opt-in --resolve looked up app-ads//app-ads.txt and found no file.
## Why it matters
app-ads.txt is how an app developer authorises who may sell that app's inventory. Without the file, the first SupplyChain hop cannot be matched to a DIRECT or RESELLER line.
## How to fix it
Place the developer-domain app-ads.txt in the cache as app-ads//app-ads.txt, then re-run with --resolve --cache.
## Example that trips it
rtblint validate --resolve --cache ./supply-cache request.json
Fires when app.bundle is set, a payment hop exists, and the cache has no app-ads.txt for that bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
The supply chain trust stack
Back to the full diagnostic code reference .
---
# First payment hop is not in the app's app-ads.txt · openrtb.resolve.app_ads_txt_unauthorized · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-resolve-app_ads_txt_unauthorized/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## First payment hop is not in the app's app-ads.txt
openrtb.resolve.app_ads_txt_unauthorized error Bid request
The app's app-ads.txt does not list the first payment node's asi and sid as DIRECT or RESELLER.
## What it means
The cache has app-ads.txt for app.bundle, but no DIRECT or RESELLER row matches the first SupplyChain node with hp not equal to 0.
## Why it matters
That hop is the seller the developer authorised. If app-ads.txt does not list it, the app's inventory is being sold by someone the developer did not name.
## How to fix it
The developer must add a line `, , DIRECT` or `RESELLER` to app-ads.txt, or the chain's first payment node must use an asi/sid pair that is already listed.
## Example that trips it
{ "app": { "bundle": "com.example.app" }, "source": { "schain": { "nodes": [{ "asi": "ssp.example", "sid": "99", "hp": 1 }] } } }
Requires --resolve --cache with app-ads/com.example.app/app-ads.txt that does not list ssp.example / 99.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
The supply chain trust stack
Back to the full diagnostic code reference .
---
# video.rqddurs is an empty array · openrtb.video.pod.rqddurs_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-video-pod-rqddurs_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## video.rqddurs is an empty array
openrtb.video.pod.rqddurs_empty warning Bid request
video.rqddurs is present as an empty array.
## What it means
video.rqddurs, the list of exact creative durations a CTV ad pod slot accepts, is present but empty. The field exists to enumerate permitted durations; an empty list permits nothing.
## Why it matters
rqddurs replaces minduration/maxduration when present, so an empty array leaves the slot with no duration constraint at all, and buyers cannot tell which creatives fit. It almost always means a duration list failed to populate upstream.
## How to fix it
Populate rqddurs with the accepted durations in seconds (for example [15, 30]), or omit the field and express the constraint as a minduration/maxduration range instead. Never send it empty.
## Example that trips it
{ "video": { "mimes": ["video/mp4"], "rqddurs": [] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
CTV and ad pods reference
Back to the full diagnostic code reference .
---
# mincpmpersec sent without ad pod context · openrtb.video.pod.mincpmpersec_without_pod_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-video-pod-mincpmpersec_without_pod_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## mincpmpersec sent without ad pod context
openrtb.video.pod.mincpmpersec_without_pod_context warning Bid request
video.mincpmpersec is present without poddur or maxseq, which normally accompany a dynamic ad pod.
## What it means
video.mincpmpersec, the per-second price floor used for dynamic CTV ad pods, is present without either poddur (total pod duration) or maxseq (maximum ads in the pod). Those fields are what make a slot a dynamic pod in the first place.
## Why it matters
A per-second floor only prices something when the buyer knows how much pod time is for sale. Without pod context the floor is uninterpretable, and buyers fall back to imp.bidfloor or skip the impression.
## How to fix it
If the slot is a dynamic pod, declare it: set poddur and maxseq alongside mincpmpersec. If it is a plain video slot, drop mincpmpersec and price it with imp.bidfloor.
## Example that trips it
{ "imp": [{ "id": "1", "video": {
"mimes": ["video/mp4"], "mincpmpersec": 0.05
} }] }
A per-second floor with no poddur or maxseq alongside it. Buyers cannot work out what they are pricing, so most fall back to imp.bidfloor or skip the impression.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
CTV and ad pods reference
Back to the full diagnostic code reference .
---
# native.request was JSON-encoded twice · openrtb.native.request.double_encoded · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-request-double_encoded/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## native.request was JSON-encoded twice
openrtb.native.request.double_encoded error Bid request
native.request parses to another JSON string rather than an object: it was JSON-encoded twice.
## What it means
imp.native.request is defined as a string holding the JSON-encoded Native Markup Request, encoded exactly once. Here the string decodes to another JSON string rather than an object, meaning the payload was JSON-encoded twice.
## Why it matters
A buyer decodes once, per the spec, and finds a string of escaped quotes where the native request object should be. Most drop the impression. Double encoding usually comes from serializing an already-serialized string a second time in a generic pipeline.
## How to fix it
Encode the Native Markup Request exactly once: build the object, serialize it to a string, place that string at native.request, and stop. If a framework serializes the whole bid request afterward, store the native request as a raw string, not as an object it will re-serialize.
## Example that trips it
{ "native": { "request": "\"{\\\"ver\\\":\\\"1.2\\\"}\"" } }
The tell is a leading escaped quote inside the string.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# native.request does not parse as JSON · openrtb.native.request.unparseable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-request-unparseable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## native.request does not parse as JSON
openrtb.native.request.unparseable warning Bid request
native.request does not parse as JSON at all.
## What it means
imp.native.request should contain a JSON-encoded Native Markup Request, but the string does not parse as JSON at all: truncated content, an unescaped quote, or something that was never JSON.
## Why it matters
Native demand cannot bid on an impression whose asset requirements it cannot read. Because the outer bid request still parses, the breakage hides one layer down where generic JSON tooling does not look.
## How to fix it
Serialize the Native Markup Request with a JSON library and validate the inner document as JSON before embedding it. The native reference covers the request's required structure per Native Ads 1.2.
## Example that trips it
{ "native": { "request": "{not json", "ver": "1.2" } }
native.request holds the Native Markup Request as a JSON-encoded string. This one does not parse at all, so the buyer has no asset list to bid against.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# native.request uses the legacy native wrapper · openrtb.native.request.legacy_wrapper · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-request-legacy_wrapper/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## native.request uses the legacy native wrapper
openrtb.native.request.legacy_wrapper warning Bid request
native.request is wrapped in a top-level "native" key, the pre-Native-1.1 convention.
## What it means
The decoded native.request is an object with a single top-level "native" key wrapping the real request. That convention predates Native Ads 1.1, which made the Native Markup Request itself the root object.
## Why it matters
Consumers built for Native 1.1+ look for ver, assets, and friends at the root, find only "native", and read an empty request. Some parsers tolerate the wrapper for compatibility; relying on that tolerance is a bet you lose one partner at a time.
## How to fix it
Emit the Native Markup Request as the root object of the encoded string and declare the spec version in ver ("1.2"). Drop the wrapper unless a specific partner documents that they still require the legacy shape.
## Example that trips it
{ "native": { "request": "{\"native\":{\"ver\":\"1.2\",\"assets\":[]}}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native markup has no assets · openrtb.native.assets_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-assets_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native markup has no assets
openrtb.native.assets_missing error Request or response
The Native Markup Request or Response has no assets array, or it is empty, and the response has no assetsurl either.
## What it means
Native Ads 1.2 requires a non-empty assets array on the request. The response needs assets, or assetsurl for a third-party native ad. Encoding checks already ran; this is the inner document after decode.
## Why it matters
Without an asset list a buyer cannot tell which title, image, or data slots to fill, and an exchange cannot tell whether a native bid answered the request. The impression is dropped.
## How to fix it
Put at least one asset object in assets, each with an integer id and exactly one of title, img, video, or data. On the response, return those assets or set assetsurl.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\"}" } }
The encoded request has a version and nothing else. Native 1.2 requires assets.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native asset is missing an integer id · openrtb.native.asset.id_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-id_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native asset is missing an integer id
openrtb.native.asset.id_required error Request or response
A native asset has no integer id, so the response cannot be mapped back to the request.
## What it means
Each asset in the Native Markup Request and Response must carry an integer id unique within that document. The id is how the response names which requested slot it filled.
## Why it matters
A missing id makes the asset unlistable. Buyers skip the slot; exchanges that pair by id drop the bid.
## How to fix it
Give every asset a unique integer id. Response ids must be a subset of the request ids.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"title\":{\"len\":90}}]}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native asset id is used more than once · openrtb.native.asset.id_duplicate · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-id_duplicate/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native asset id is used more than once
openrtb.native.asset.id_duplicate error Bid request
Two native request assets share the same id, so a response cannot map assets unambiguously.
## What it means
Asset ids must be unique within the Native Markup Request. Two assets with the same id leave the buyer guessing which slot a response asset fills.
## Why it matters
The response is allowed one object per request id. A duplicate id is a collision; most buyers take the first and ignore the rest, or drop the impression.
## How to fix it
Number assets uniquely (1, 2, 3, …). Do not reuse an id for a second title or image.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{\"len\":90}},{\"id\":1,\"data\":{\"type\":2}}]}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native asset does not have exactly one of title, img, video, or data · openrtb.native.asset.subtype_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-subtype_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native asset does not have exactly one of title, img, video, or data
openrtb.native.asset.subtype_required error Request or response
A native asset has none of those subtypes, or more than one.
## What it means
Native Ads 1.2 allows exactly one of title, img, video, or data on an asset. Link is additional on the response, not a substitute.
## Why it matters
A buyer that sees both title and img on one asset, or neither, cannot tell which creative part to return. Exchanges reject mixed assets.
## How to fix it
Split mixed assets into one object per subtype, each with its own id. Empty assets are not slots.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1}]}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Required Native Ads field is missing · openrtb.native.field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Required Native Ads field is missing
openrtb.native.field_required error Request or response
A Native Ads field the spec marks required is absent: title.len, data.type, video mimes/protocols/duration, eventtracker event/methods, or response text/url/vasttag/value/link.url.
## What it means
After decoding the native string, a required inner field is missing. On the request that is title.len, data.type, video.mimes, video.protocols, video.minduration, video.maxduration, and eventtrackers.event plus methods. On the response that is link.url, title.text, img.url, video.vasttag, and data.value.
## Why it matters
Those fields are how the other side sizes a title, picks an image, or follows a click. Missing them is a dropped native bid, not a style warning.
## How to fix it
Populate the field named in the path. Video native assets need the same four fields as a standalone Video object.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"title\":{}}]}" } }
title is present but len is not. Native Ads 1.2 makes title.len required.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native layout was removed in Native Ads 1.1 · openrtb.native.layout_removed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-layout_removed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native layout was removed in Native Ads 1.1
openrtb.native.layout_removed warning Bid request
The encoded native request still carries layout, which Native 1.1 replaced with plcmttype and context.
## What it means
layout was a Native 1.0 field (feed, atomic, etc.). Native 1.1 dropped it in favour of plcmttype and context. It still appears on 1.2 payloads copied from old fixtures.
## Why it matters
1.1+ parsers ignore layout. The placement type they actually read is missing, so the buyer guesses at in-feed vs recommendation widget.
## How to fix it
If ver is 1.0, layout is still legal. On 1.1 or 1.2, drop layout and set plcmttype and context instead.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"layout\":1,\"assets\":[{\"id\":1,\"title\":{\"len\":90}}]}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native enum value is not in the documented set · openrtb.native.value.invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-value-invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native enum value is not in the documented set
openrtb.native.value.invalid error Bid request
data.type, img.type, eventtrackers.event, or methods carries a value Native Ads does not list (and it is below the vendor range 500+).
## What it means
Native Ads publishes small integer lists: image types 1 (icon), 2 (logo), 3 (main); data types 1-12; event 1-4; methods 1-2. Values 500 and above are exchange-specific and allowed.
## Why it matters
An undocumented type is not a custom creative. Buyers that switch on the enum skip the asset or the whole impression.
## How to fix it
Use a documented value, or 500+ if the exchange published a private type. Do not invent 13 for a thirteenth data type.
## Example that trips it
{ "native": { "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"data\":{\"type\":99}}]}" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Required native request asset is missing from the response · openrtb.native.asset.required_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-required_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Required native request asset is missing from the response
openrtb.native.asset.required_missing error Request/response pair
The native request marked an asset required, and the bid's adm does not return that id.
## What it means
With the originating request supplied, each request asset with required=1 must appear in the native response assets under the same id.
## Why it matters
A required title or main image that never comes back is an incomplete native ad. Publishers reject it; some exchanges do not even render.
## How to fix it
Return every required request asset id. Optional assets may be omitted.
## Example that trips it
{ "request": { "native": { "request": "{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}}]}" } }, "adm": "{\"link\":{\"url\":\"https://ex\"},\"assets\":[]}" }
Pair validation with --request. Asset 1 is required and absent from adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native response asset id was not in the request · openrtb.native.asset.id_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-id_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native response asset id was not in the request
openrtb.native.asset.id_unknown error Request/response pair
The native adm returns an asset id the request never asked for.
## What it means
Response asset ids must be drawn from the request's asset ids. An extra id is not a bonus slot; it is an unsolicited asset.
## Why it matters
The renderer only has placeholders for requested ids. An unknown id is ignored or treated as a malformed native response.
## How to fix it
Use only ids from the request. Extra creative parts belong on an existing asset (for example a link on that asset), not a new id.
## Example that trips it
{ "request": { "native": { "request": "{\"assets\":[{\"id\":1,\"title\":{\"len\":90}}]}" } }, "adm": "{\"link\":{\"url\":\"https://ex\"},\"assets\":[{\"id\":9,\"title\":{\"text\":\"Hi\"}}]}" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Native response asset subtype does not match the request · openrtb.native.asset.type_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-native-asset-type_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native response asset subtype does not match the request
openrtb.native.asset.type_mismatch error Request/response pair
The response filled a request title slot with an image, or the other way around.
## What it means
Each request asset asks for exactly one of title, img, video, or data. The response asset with that id must use the same subtype.
## Why it matters
A title slot that receives an image URL does not render. Native templates are typed per asset id.
## How to fix it
Return title.text for a title asset, img.url for an image asset, video.vasttag for video, data.value for data.
## Example that trips it
{ "request": { "native": { "request": "{\"assets\":[{\"id\":1,\"title\":{\"len\":90}}]}" } }, "adm": "{\"link\":{\"url\":\"https://ex\"},\"assets\":[{\"id\":1,\"img\":{\"url\":\"https://cdn/x.png\"}}]}" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Bid response has neither seatbid nor nbr · openrtb.response.seatbid_or_nbr.required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-response-seatbid_or_nbr-required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid response has neither seatbid nor nbr
openrtb.response.seatbid_or_nbr.required error Bid response
A bid response has neither a seatbid nor a no-bid reason code (nbr).
## What it means
The bid response contains neither seatbid (at least one seat's bids) nor nbr (the no-bid reason code). A response must either bid or say why it is not bidding; this one does neither.
## Why it matters
An empty-but-present response is ambiguous: the exchange cannot tell a deliberate pass from a bidder bug, so the traffic shows up in error dashboards instead of no-bid analytics. Persistent ambiguity gets a bidder's QPS deprioritized.
## How to fix it
Return bids in seatbid, or an nbr code explaining the pass, or no body at all (HTTP 204, the cleanest no-bid). The nbr guide lists every documented reason code.
## Example that trips it
{ "id": "req-1", "cur": "USD" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
No-bid reason codes (nbr)
Bid response anatomy
Back to the full diagnostic code reference .
---
# Bid has adm markup but no mtype · openrtb.bid.mtype_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-mtype_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid has adm markup but no mtype
openrtb.bid.mtype_missing warning Bid response
A bid carries adm markup but no mtype, on a version that defines mtype. The buyer is leaving the markup type to be sniffed.
## What it means
A bid carries creative markup in adm but does not declare mtype (1 banner, 2 video, 3 audio, 4 native), on an OpenRTB version that defines the field. The exchange is left to sniff what kind of markup arrived.
## Why it matters
Markup sniffing is guesswork, and misclassified creatives fail at render time, after the auction cleared and the win was billed. Exchanges increasingly reject unclassifiable bids up front instead of risking the discrepancy.
## How to fix it
Set mtype on every bid that carries adm, matching the creative you actually returned. It is one integer, known at bid time, and removes an entire failure class.
## Example that trips it
{ "id": "b1", "impid": "1", "price": 2.5, "adm": "creative
" }
No mtype, so the renderer has to guess what adm holds. Guessing is version-dependent and vendor-dependent, which is exactly the ambiguity mtype was added to remove.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
adm vs nurl
Bid response anatomy
Back to the full diagnostic code reference .
---
# Unknown OpenRTB substitution macro · openrtb.macro.unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-macro-unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unknown OpenRTB substitution macro
openrtb.macro.unknown warning Bid response
nurl, burl, lurl, or adm contains ${NAME} where NAME is not a documented AUCTION_* macro.
## What it means
OpenRTB lists a closed set of substitution macros (${AUCTION_ID}, ${AUCTION_PRICE}, ${AUCTION_LOSS}, and the rest of the AUCTION_* family). An encoding suffix such as ${AUCTION_PRICE:B64} is still that macro. This token is not in the set. Exchange %%MACRO%% spellings are ignored.
## Why it matters
Unknown macros are left unsubstituted. A typo (${AUCTION_PRCIE}) means the billing URL never gets a price, so you cannot settle the win.
## How to fix it
Use a documented name. ${AUCTION_PRICE:B64} is fine; ${WINNING_PRICE} is not OpenRTB (Google's %%WINNING_PRICE%% lives outside this check).
## Example that trips it
{ "nurl": "https://dsp.example/win?p=${AUCTION_PRCIE}" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB macros
Back to the full diagnostic code reference .
---
# Billing notice URL has no ${AUCTION_PRICE} · openrtb.bid.price_macro_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-price_macro_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Billing notice URL has no ${AUCTION_PRICE}
openrtb.bid.price_macro_missing warning Bid response
nurl or burl is present but neither contains ${AUCTION_PRICE}, so the notice cannot report the clearing price.
## What it means
A billing notice (nurl or burl) is how the exchange tells the bidder what the impression cleared at. Without ${AUCTION_PRICE} (optional :B64 or other encoding suffix) the URL fires with no price.
## Why it matters
You cannot bill, reconcile, or train a bidder without the clearing price. Wins still happen; the money path is blind.
## How to fix it
Put ${AUCTION_PRICE} on nurl or burl, whichever you use for billing. lurl is a loss notice and does not satisfy this.
## Example that trips it
{ "nurl": "https://dsp.example/win" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB macros
Back to the full diagnostic code reference .
---
# Loss notice URL has no ${AUCTION_LOSS} · openrtb.bid.loss_macro_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-loss_macro_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Loss notice URL has no ${AUCTION_LOSS}
openrtb.bid.loss_macro_missing warning Bid response
lurl is present without ${AUCTION_LOSS}, so the notice cannot report why the bid lost.
## What it means
lurl is the loss-notification URL. ${AUCTION_LOSS} expands to the OpenRTB loss reason code. An lurl without that macro is just a ping.
## Why it matters
Loss reason codes are how a DSP learns that the bid was below floor, filtered, or beaten. Without the macro the URL is traffic with no signal.
## How to fix it
Add ${AUCTION_LOSS} to lurl. Keep ${AUCTION_PRICE} on nurl/burl; that is a different notice.
## Example that trips it
{ "lurl": "https://dsp.example/loss" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB macros
Loss reason codes
Back to the full diagnostic code reference .
---
# Bid adm was JSON-encoded twice · openrtb.bid.adm.double_encoded · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-double_encoded/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid adm was JSON-encoded twice
openrtb.bid.adm.double_encoded error Bid response
adm parses to another JSON string rather than an object: the native markup response was JSON-encoded twice.
## What it means
The bid's adm decodes to another JSON string instead of markup: the payload (typically a native markup response) was JSON-encoded twice, the response-side twin of the native request encoding bug.
## Why it matters
The rendering side decodes once and gets a string of escaped quotes no renderer can display. You spent QPS and bid price to win an impression that then errors at render, which is billed waste plus a creative-quality strike.
## How to fix it
Encode adm exactly once. If your bidder framework serializes the response object as a whole, insert the native response as a pre-serialized raw string, not as an object serialized again.
## Example that trips it
{ "mtype": 4, "adm": "\"{\\"native\\":{\\"link\\":{}}}\"" }
Decoding adm once yields another JSON string rather than an object. Something serialized an already-serialized payload a second time.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
adm vs nurl
Back to the full diagnostic code reference .
---
# Native bid adm is not JSON · openrtb.bid.adm.native_not_json · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-native_not_json/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native bid adm is not JSON
openrtb.bid.adm.native_not_json error Bid response
mtype 4 declares native markup, but adm is not a JSON Native Markup Response.
## What it means
The bid declares mtype 4 (native), but adm does not parse as a JSON Native Markup Response. Native creatives travel as structured JSON assets, not as HTML or XML.
## Why it matters
The publisher's native renderer receives assets it cannot parse, so nothing renders. The declared type and the payload disagree, and one of them is lying; either way the impression is lost after the win.
## How to fix it
Return a valid Native Markup Response (JSON, matching the ver requested) in adm when bidding mtype 4. If you meant to send a banner or video creative, declare the mtype that matches the markup instead.
## Example that trips it
{ "mtype": 4, "adm": "" }
mtype 4 promises the JSON Native Markup Response and adm carries VAST. The bid is for a native slot and the creative is a video document.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Native ads reference
Back to the full diagnostic code reference .
---
# Bid adm contradicts the declared mtype · openrtb.bid.adm.markup_type_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-markup_type_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid adm contradicts the declared mtype
openrtb.bid.adm.markup_type_mismatch error Bid response
The adm payload contradicts the declared mtype, for example a banner bid carrying a JSON payload.
## What it means
What is actually inside adm contradicts the declared mtype: a bid marked banner (mtype 1) carrying JSON, a bid marked video (mtype 2) carrying HTML, and so on. RTBlint classifies the markup by shape and compares it to the declaration.
## Why it matters
Every downstream system keys off mtype: creative scanning, render path, reporting. A mislabeled creative fails at whichever step trusts the label, usually render, and the discrepancy lands after billing.
## How to fix it
Make mtype describe the payload you actually returned: HTML markup for 1, VAST XML for 2, DAAST/VAST audio for 3, native JSON for 4. If one bidder code path sets a constant mtype, that constant is the bug.
## Example that trips it
{ "mtype": 2, "adm": "{"native":{"link":{"url":"https://x"}}}" }
mtype 2 promises VAST XML and adm carries a JSON payload. The mismatch is detectable before the impression is ever rendered.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
adm vs nurl
Back to the full diagnostic code reference .
---
# Video bid adm has no VAST root element · openrtb.bid.adm.vast_root_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-vast_root_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Video bid adm has no VAST root element
openrtb.bid.adm.vast_root_missing warning Bid response
A video or audio bid's adm is XML but has no VAST or DAAST document root.
## What it means
A video or audio bid's adm is XML, but its document root is not VAST (or DAAST for audio). Some other XML document, or a fragment, is riding in the creative slot.
## Why it matters
Video players hand adm to a VAST parser. A non-VAST root fails immediately and the player fires VAST error 100 territory problems, burning the impression. XML that is not VAST usually means the wrong template or an SSAI artifact leaked into the bidder.
## How to fix it
Return a complete VAST document, root element and all. If you wrap third-party tags, validate the wrapped output; a VAST linter in the response path catches this class before it ships.
## Example that trips it
{ "mtype": 2, "adm": "" }
The markup is XML but the root is Ad rather than VAST. Players look for the VAST root element and will not descend into a document that does not have one.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
VAST and OpenRTB
Back to the full diagnostic code reference .
---
# Video bid adm is not XML markup · openrtb.bid.adm.not_markup · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-not_markup/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Video bid adm is not XML markup
openrtb.bid.adm.not_markup warning Bid response
A video or audio bid's adm does not start with an XML tag, so it is unlikely to be a VAST document.
## What it means
A video or audio bid's adm does not even start with an XML tag: a URL, plain text, or an error string is sitting where a VAST document belongs.
## Why it matters
A bare URL in adm is the most common variant, from confusing adm (inline markup) with nurl (win notice URL that can return markup). The player cannot parse a URL as VAST, so the creative never renders.
## How to fix it
Put the VAST XML itself in adm, or use the nurl delivery pattern and leave adm out. The adm vs nurl guide covers which delivery mode fits which integration.
## Example that trips it
{ "seatbid": [{ "bid": [{ "id": "1", "impid": "1", "price": 4.2, "mtype": 2, "adm": "https://cdn.example/vast.xml" }] }] }
A URL where a VAST document belongs.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
adm vs nurl
VAST and OpenRTB
Back to the full diagnostic code reference .
---
# Paired bid request could not be read · openrtb.pair.request_unusable · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-pair-request_unusable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Paired bid request could not be read
openrtb.pair.request_unusable error Request/response pair
Cross-validation was asked for, but the paired bid request does not parse or is not an object.
## What it means
You asked for request/response cross-validation, but the bid request supplied as context does not parse as JSON or is not a JSON object, so none of the pair checks (impid, mtype, seat, deal, currency) can run. The response was still validated on its own.
## Why it matters
Cross-validation is only as good as the request it checks against. Rather than skip silently and let a green result imply the pair checks passed, the unusable request is reported explicitly.
## How to fix it
Supply the originating bid request as a single valid JSON object (CLI: --request request.json). In batch mode the same request pairs against many response lines.
## Example that trips it
{ "id": "req-1", "imp": [
The response may be perfect. The request supplied for cross-validation is truncated, so none of the cross-document checks can run and the validator says so rather than reporting a clean pass.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
CLI reference
Back to the full diagnostic code reference .
---
# Bid response id does not echo the request id · openrtb.response.request_id_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-response-request_id_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid response id does not echo the request id
openrtb.response.request_id_mismatch error Request/response pair
The response id does not echo the id of the bid request it answers.
## What it means
BidResponse.id must echo the id of the bid request it answers; here it carries something else. The echo is how exchanges correlate a response to the auction that solicited it.
## Why it matters
A response the exchange cannot correlate is a response it cannot use: at best it is dropped, at worst it is attributed to the wrong auction and pollutes reporting on both sides. This is usually a bidder generating a fresh id instead of copying the request's.
## How to fix it
Copy BidRequest.id into BidResponse.id verbatim. Your own response identifier, if you need one, belongs in bidid or your ext.
## Example that trips it
{ "id": "resp-8841", "seatbid": [] }
Answering request "req-1" under a self-generated id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid response anatomy
Back to the full diagnostic code reference .
---
# Bid response uses a currency the request did not allow · openrtb.response.cur_not_allowed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-response-cur_not_allowed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid response uses a currency the request did not allow
openrtb.response.cur_not_allowed error Request/response pair
The response bids in a currency the request did not list in cur.
## What it means
The response declares a bid currency that is not among the currencies the request's cur array allows. When the request lists no cur, USD is the shared assumption.
## Why it matters
The exchange either converts at a rate you did not price against, rejects the bid, or (worst) compares your 900 JPY against USD bids numerically. All three end with your bid mispriced or discarded.
## How to fix it
Bid in one of the request's allowed currencies, converting on your side before pricing. If you must transact in a currency the exchange never offers, that is an integration conversation, not a field to force.
## Example that trips it
// request
{ "cur": ["USD"], "imp": [{ "id": "1", "banner": {} }] }
// response
{ "cur": "EUR", "seatbid": [{ "bid": [{ "impid": "1", "price": 2.5 }] }] }
The exchange advertised USD only. A bid in EUR is not a rounding problem, it is a bid the exchange cannot settle. Only visible with both documents side by side.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Floors and currency reference
Back to the full diagnostic code reference .
---
# Seat is not allowed to bid on this request · openrtb.seatbid.seat_not_allowed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-seatbid-seat_not_allowed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Seat is not allowed to bid on this request
openrtb.seatbid.seat_not_allowed error Request/response pair
The seat is absent from the request's wseat allowlist, or present in its bseat blocklist.
## What it means
The seatbid's seat is not permitted by the request: absent from its wseat allowlist, or present in its bseat blocklist. Seat restrictions are how publishers and deals scope which buyer accounts may participate.
## Why it matters
A bid from a disallowed seat is discarded no matter its price, so the compute behind it was pure waste. Recurring violations look like a bidder ignoring deal terms, which sours the direct relationships seats exist to serve.
## How to fix it
Filter eligible seats against wseat/bseat before bidding, and propagate the restriction into your campaign selection so restricted requests only reach campaigns from permitted seats.
## Example that trips it
// request
{ "wseat": ["dsp-1", "dsp-2"] }
// response
{ "seatbid": [{ "seat": "dsp-9", "bid": [ ... ] }] }
wseat is an allowlist. A seat outside it is not permitted to bid on this impression, whatever the price.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Deals and PMP
Back to the full diagnostic code reference .
---
# Bid impid matches no imp in the request · openrtb.bid.impid_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-impid_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid impid matches no imp in the request
openrtb.bid.impid_unknown error Request/response pair
A bid's impid does not match the id of any Imp in the bid request.
## What it means
The bid's impid does not match the id of any Imp in the paired bid request. Every bid must reference exactly which impression it is buying.
## Why it matters
A bid on a nonexistent impression can never win; it is discarded on arrival. This is nearly always an id mapping bug in the bidder: echoing an internal placement id, an off-by-one in multi-imp requests, or answering a cached copy of a different request.
## How to fix it
Echo the Imp.id from the request you are answering, exactly. Multi-impression requests make this bug visible fast; test with a request carrying several imps with distinct ids.
## Example that trips it
{ "seatbid": [{ "bid": [{ "id": "1", "impid": "placement-7", "price": 1.1 }] }] }
The request's imps were "1" and "2"; "placement-7" is the bidder's internal id leaking out.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid response anatomy
Back to the full diagnostic code reference .
---
# Bid mtype is a media type the imp never offered · openrtb.bid.mtype_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-mtype_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid mtype is a media type the imp never offered
openrtb.bid.mtype_not_offered error Request/response pair
The bid's mtype names a media type the referenced Imp does not offer, for example a banner bid on a video-only imp.
## What it means
The bid's mtype declares a media type the referenced Imp never offered: a banner bid (mtype 1) against an imp that only carries a video object, and so on. The offer defines what may be sold; the bid stepped outside it.
## Why it matters
The exchange discards the bid, because delivering a banner into a video slot is not a rendering option. Systematic mismatches point at campaign targeting keyed to the wrong media type or an mtype constant baked into one code path.
## How to fix it
Bid only the media types present on the referenced Imp (banner, video, audio, native). If a campaign can serve several formats, choose the mtype after selecting which of the imp's offered types you are answering.
## Example that trips it
// request: a video-only imp
{ "imp": [{ "id": "1", "video": { "mimes": ["video/mp4"] } }] }
// response: bids banner
{ "seatbid": [{ "bid": [{ "impid": "1", "mtype": 1 }] }] }
mtype 1 is banner and the imp only ever offered video. No reading of the request makes this bid servable.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Bid request anatomy
Back to the full diagnostic code reference .
---
# Bid adm markup does not match the imp's media types · openrtb.bid.adm.media_type_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-adm-media_type_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid adm markup does not match the imp's media types
openrtb.bid.adm.media_type_mismatch error Request/response pair
The markup sniffed from adm does not match any media subtype the referenced Imp offers.
## What it means
Classifying what is actually inside adm (HTML, VAST XML, native JSON), the markup matches none of the media types the referenced Imp offers. This fires even when mtype is absent or lying, because it inspects the payload itself.
## Why it matters
This is the deepest form of the wrong-creative bug: the declaration layer can be fooled, but the markup is what the player will choke on. Catching it at validation time is the difference between a rejected bid and a billed impression that never rendered.
## How to fix it
Return markup that matches an offered media type of the imp you reference, and declare it honestly in mtype. When this fires alongside impid or mtype findings, fix the id mapping first; wrong-imp references cascade into wrong-markup findings.
## Example that trips it
// request: banner only
{ "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }] }
// response: VAST markup
{ "seatbid": [{ "bid": [{ "impid": "1", "adm": "" }] }] }
The markup in adm is a media type the imp never offered. The bid may be internally consistent and still be unservable in the slot it won.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
adm vs nurl
Back to the full diagnostic code reference .
---
# Bid dealid is not in the imp's pmp deals · openrtb.bid.dealid_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-bid-dealid_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid dealid is not in the imp's pmp deals
openrtb.bid.dealid_unknown warning Request/response pair
The bid's dealid is not among the referenced Imp's pmp deals. Out-of-band deals exist, so this is a warning.
## What it means
The bid references a dealid that is not among the deals the referenced Imp's pmp object offered. Because deals negotiated out of band (not carried in the request) legitimately exist, this is a warning rather than an error.
## Why it matters
If the deal was supposed to be in the request, one side has a stale deal sync: the buyer bids a deal the seller no longer offers, the bid loses deal treatment, and both sides see the deal underdeliver without an obvious cause.
## How to fix it
Echo a Deal.id from the imp's pmp.deals when answering an in-request deal. If you transact out-of-band deals, confirm with the exchange that they accept dealids not present in the request; otherwise treat this warning as a sync failure to chase.
## Example that trips it
{ "seatbid": [{ "bid": [{ "id": "1", "impid": "1", "price": 8.0, "dealid": "PG-2025-old" }] }] }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Deals and PMP
Back to the full diagnostic code reference .
---
# OpenRTB 3.0 payload has no openrtb envelope · openrtb.envelope.missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-envelope-missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB 3.0 payload has no openrtb envelope
openrtb.envelope.missing error OpenRTB 3.0
An OpenRTB 3.0 payload has no openrtb wrapper. Sending a 2.x payload to a 3.0 validator lands here, with a note on where each object moved.
## What it means
A payload validated as OpenRTB 3.0 has no top-level openrtb envelope. 3.0 is a layered protocol: the envelope carries ver, domainspec, domainver, and the request or response. A 2.x-shaped payload sent to a 3.0 validator lands here, and the finding explains where each 2.x object moved.
## Why it matters
3.0 is not an incremental upgrade of 2.6; objects were redistributed between the transport layer and AdCOM. A consumer expecting the envelope cannot read a 2.x document at all, so version negotiation between partners has failed somewhere upstream.
## How to fix it
If you meant to speak 2.x, validate against a 2.x version; the payload is probably fine. If you are genuinely migrating to 3.0, wrap the transaction in the openrtb envelope and move context objects into AdCOM form per the migration guide.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1" }] }
This is a 2.x body sent to a 3.0 validator. In 3.0 everything lives under a top-level openrtb member, so the absence of it usually means the wrong version was negotiated rather than that a field is missing.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB 2.6 vs 3.0
Back to the full diagnostic code reference .
---
# OpenRTB envelope ver does not match the validated version · openrtb.envelope.ver_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-envelope-ver_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB envelope ver does not match the validated version
openrtb.envelope.ver_mismatch warning OpenRTB 3.0
The envelope's ver declares a different OpenRTB version than the one being validated against.
## What it means
The 3.0 envelope's ver field declares a different OpenRTB version than the one validation ran against. The payload says one thing about itself; the validation target says another.
## Why it matters
In a layered protocol the envelope's self-declaration is what receivers trust for parsing decisions. A mismatch means version negotiation drifted, and each party may be applying different field rules to the same bytes.
## How to fix it
Make ver reflect the specification the payload is actually built to, and validate against that same version. Fix whichever side is wrong; do not leave them disagreeing.
## Example that trips it
{ "openrtb": { "ver": "2.6", "request": { "id": "req-1", "item": [] } } }
The envelope declares 2.6 while being validated as 3.0. Trust the declared version over the endpoint you sent it to: one of the two is misconfigured.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB versions
Back to the full diagnostic code reference .
---
# OpenRTB envelope names a non-AdCOM domain spec · openrtb.envelope.domainspec_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-envelope-domainspec_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## OpenRTB envelope names a non-AdCOM domain spec
openrtb.envelope.domainspec_unsupported warning OpenRTB 3.0
The envelope names a domain spec other than AdCOM, so the objects under item.spec and bid.media are left unchecked.
## What it means
The 3.0 envelope's domainspec names a domain object model other than AdCOM. The transport layer still validates fully, but the domain objects under item.spec and bid.media are opaque to RTBlint, so they are left unchecked.
## Why it matters
In practice the 3.0 ecosystem is AdCOM; a different domainspec is either intentional (a closed ecosystem with its own object model) or a typo that will make partners skip your domain objects. Either way, know that the domain layer went unvalidated.
## How to fix it
If you meant AdCOM, set domainspec to "adcom" and domainver accordingly. If you run a custom domain spec on purpose, this warning is informational: validate the domain objects with that spec's own tooling.
## Example that trips it
{ "openrtb": { "ver": "3.0", "domainspec": "custom",
"request": { "id": "req-1", "item": [] } } }
domainspec names the domain model that fills item.spec and bid.media. Anything other than adcom is a private arrangement the validator has no catalog for.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
What is AdCOM
Back to the full diagnostic code reference .
---
# AdCOM Placement has no display, video, or audio subtype · adcom.placement.subtype_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/adcom-placement-subtype_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AdCOM Placement has no display, video, or audio subtype
adcom.placement.subtype_required error OpenRTB 3.0
item.spec.placement has none of the media subtype objects AdCOM requires.
## What it means
An AdCOM Placement is the root of what an OpenRTB 3.0 item is selling. The spec marks display, video, and audio as required-star: at least one subtype object has to be present so a buyer knows which media the placement accepts.
## Why it matters
A placement with only tagid or secure and no subtype is not a sellable impression. Buyers cannot match a creative to it, and an exchange that forwards it is offering an item with no allowed ad.
## How to fix it
Add a display, video, or audio object under placement. A banner slot is placement.display; a preroll is placement.video with mime and duration bounds.
## Example that trips it
{ "openrtb": { "ver": "3.0", "domainver": "1.0", "request": { "id": "req-1", "item": [{ "id": "1", "spec": { "placement": { "tagid": "plc-1" } } }] } } }
tagid names the slot but does not say what can run in it. AdCOM wants at least one of display, video, or audio.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
AdCOM 1.0 object reference
Back to the full diagnostic code reference .
---
# AdCOM Ad has no display, video, or audio subtype · adcom.ad.subtype_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/adcom-ad-subtype_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AdCOM Ad has no display, video, or audio subtype
adcom.ad.subtype_required error OpenRTB 3.0
bid.media.ad has none of the media subtype objects AdCOM requires.
## What it means
An AdCOM Ad is the creative OpenRTB 3.0 returns in bid.media. display, video, and audio are required-star: at least one subtype has to describe the creative so the publisher can render it.
## Why it matters
An ad with only an id is metadata without a creative. The publisher has nothing to stitch, and the bid cannot be rendered.
## How to fix it
Add a display, video, or audio object under ad. A structured banner lives under ad.display; VAST markup lives under ad.video.adm.
## Example that trips it
{ "openrtb": { "ver": "3.0", "domainver": "1.0", "response": { "id": "req-1", "seatbid": [{ "bid": [{ "id": "b1", "item": "1", "price": 1.0, "media": { "ad": { "id": "c1" } } }] }] } } }
The Ad has an id and no subtype. AdCOM wants at least one of display, video, or audio.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
AdCOM 1.0 object reference
Back to the full diagnostic code reference .
---
# AdCOM Asset has no title, image, video, data, or link subtype · adcom.asset.subtype_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/adcom-asset-subtype_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AdCOM Asset has no title, image, video, data, or link subtype
adcom.asset.subtype_required error OpenRTB 3.0
A native Asset object has none of the subtype objects AdCOM requires.
## What it means
An AdCOM Asset is one piece of a native ad. The spec marks title, image, video, data, and link as required-star: at least one subtype has to say what this asset is.
## Why it matters
A native asset with only an id cannot be rendered. The publisher does not know whether to draw a title, an image, or a link.
## How to fix it
Add a title, image, video, data, or link object on the Asset.
## Example that trips it
{ "id": 1 }
An Asset with only an id. Nested under ad.display.native.asset in a full 3.0 response.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
AdCOM 1.0 object reference
Back to the full diagnostic code reference .
---
# AdCOM AssetFormat has no title, img, video, or data subtype · adcom.assetformat.subtype_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/adcom-assetformat-subtype_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AdCOM AssetFormat has no title, img, video, or data subtype
adcom.assetformat.subtype_required error OpenRTB 3.0
A native AssetFormat object has none of the format subtype objects AdCOM requires.
## What it means
An AdCOM AssetFormat describes what a native placement will accept for one asset. title, img, video, and data are required-star: at least one format subtype has to constrain the asset.
## Why it matters
A format with only an id does not tell the buyer which asset types can fill the slot, so the native request is incomplete.
## How to fix it
Add a title, img, video, or data object on the AssetFormat.
## Example that trips it
{ "id": 1 }
An AssetFormat with only an id. Nested under placement.display.nativefmt.asset in a full 3.0 request.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
AdCOM 1.0 object reference
Back to the full diagnostic code reference .
---
# Cross-validation is not supported on OpenRTB 3.0 · openrtb.pair.unsupported_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-pair-unsupported_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Cross-validation is not supported on OpenRTB 3.0
openrtb.pair.unsupported_version warning Request/response pair
Request/response cross-validation was asked for on OpenRTB 3.0; the checks are 2.x-only, so the response was validated on its own.
## What it means
Request/response cross-validation was requested for an OpenRTB 3.0 pair. The pair checks (impid, mtype, seat, deal, currency against the originating request) are built for the 2.x object model, so the response was validated on its own instead.
## Why it matters
A silent skip would let a green result imply the pair checks ran when they did not. The warning marks the coverage boundary explicitly so a CI gate cannot mistake absence of findings for cross-validated coverage.
## How to fix it
Nothing is broken in your payload. Validate 3.0 requests and responses individually; if you also run 2.x traffic, pair validation works there in full.
## Example that trips it
rtblint validate --type response --version 3.0 --request req.json resp.json
The cross-checks are written against 2.x shapes: imp ids, media subtypes, pmp deals. A 3.0 pair validates layer by layer instead, and skipping quietly would look like the checks had passed.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
OpenRTB 2.6 vs 3.0
Back to the full diagnostic code reference .
---
# Flag field is true/false where OpenRTB wants 0 or 1 · openrtb.dialect.bool_for_integer · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-dialect-bool_for_integer/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Flag field is true/false where OpenRTB wants 0 or 1
openrtb.dialect.bool_for_integer error Request or response
A flag field arrived as a boolean. The specification types it as an integer, but the IAB OpenRTB protobuf schema declares it bool, so this is a protobuf JSON payload sent to a spec JSON reader.
## What it means
A field such as imp.secure, regs.coppa or pmp.private_auction arrived as true or false. The OpenRTB specification types 28 such flag fields as integers with the value set {0, 1}. The IAB OpenRTB protobuf schema declares those same fields bool, so a payload produced by protojson writes booleans and a payload produced from the specification writes integers.
## Why it matters
Neither encoding is wrong on its own transport, which is what makes this expensive to find. A gRPC integration serialising with protojson produces booleans that a JSON exchange's typed parser rejects, and the rejection looks like a schema bug rather than a transport mismatch. The bare type error, 'expects integer but received boolean', sends people to check their builder when their builder is correct and their assumption about the reader is not.
## How to fix it
If the payload is going to a JSON exchange, send the integer form: 1 for true, 0 for false. If it is a protobuf JSON payload you are validating deliberately, say so, with --dialect proto-json on the CLI, dialect: "proto-json" on the MCP tools, or JSON_DIALECT_PROTO in the gRPC ValidationContext.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "secure": true, "banner": { "w": 300, "h": 250 } }] }
Correct as protobuf JSON, invalid as OpenRTB JSON. The payload carries no marker saying which one it is, so the validator is told rather than left to guess.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# The site domain contains URL syntax or whitespace · openrtb.site.domain_not_domain · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-site-domain_not_domain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The site domain contains URL syntax or whitespace
openrtb.site.domain_not_domain warning Bid request
site.domain contains a scheme, path, port, query, fragment, credentials or whitespace.
## What it means
site.domain identifies a domain. The full page URL belongs in site.page.
## Why it matters
Inventory authorization and domain matching need a bare domain. A full URL can miss the publisher's ads.txt lookup.
## How to fix it
Set site.domain to the hostname, such as publisher.example, and put the page URL in site.page.
## Example that trips it
{ "id": "r", "imp": [{ "id": "i", "banner": {} }], "site": { "domain": "https://publisher.example/" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# The native markup supplies conflicting protobuf alternatives · openrtb.dialect.oneof_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-dialect-oneof_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The native markup supplies conflicting protobuf alternatives
openrtb.dialect.oneof_conflict error Request or response
A protobuf native oneof has multiple populated alternatives or both spellings of its object field.
## What it means
The IAB protobuf schema places request and request_native in one oneof, and adm and adm_native in another. CamelCase names identify the same fields.
## Why it matters
A protobuf parser cannot select multiple alternatives for a single oneof.
## How to fix it
Supply either the encoded string or the native object. Use one field spelling.
## Example that trips it
{ "id": "r", "imp": [{ "id": "i", "native": { "request": "{}", "request_native": { "assets": [{ "id": 1, "title": { "len": 40 } }] } } }] }
Validate this request with the proto-json dialect.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Flag field is 0 or 1 where protobuf JSON wants true or false · openrtb.dialect.integer_for_bool · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-dialect-integer_for_bool/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Flag field is 0 or 1 where protobuf JSON wants true or false
openrtb.dialect.integer_for_bool error Request or response
The payload was validated as protobuf JSON, and a field the OpenRTB protobuf schema declares bool arrived as an integer. A protojson parser rejects the whole payload.
## What it means
The payload was declared as protobuf JSON, and one of the 28 fields the IAB OpenRTB protobuf schema declares bool carried 0 or 1 instead of false or true. Protobuf JSON has no integer-to-bool coercion: a bool field accepts only the JSON literals true and false.
## Why it matters
This is not a style difference. protojson.Unmarshal fails on the message and the receiving agent gets nothing at all, so a single stray flag drops the entire request rather than one field. It is the most common defect in hand-written protobuf JSON fixtures, because the author copied a value from an OpenRTB JSON example that was correct in its own dialect.
## How to fix it
Write true or false for these fields when the payload travels over protobuf, or generate the JSON with protojson rather than by hand. If the payload was never meant to be protobuf JSON, drop the proto-json dialect and validate it as spec JSON instead.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "secure": 1, "banner": { "w": 300, "h": 250 } }] }
Validated with --dialect proto-json. The same payload is correct in the default spec JSON dialect.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Field name is lowerCamelCase instead of the OpenRTB spelling · openrtb.dialect.camel_case_name · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-dialect-camel_case_name/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Field name is lowerCamelCase instead of the OpenRTB spelling
openrtb.dialect.camel_case_name warning Request or response
A field arrived under the lowerCamelCase name protojson emits by default, such as privateAuction for private_auction. The field was resolved and validated, but a JSON reader will not find it.
## What it means
A field arrived spelled the way protobuf JSON serialises it by default: privateAuction rather than private_auction, usPrivacy rather than us_privacy. Protojson emits lowerCamelCase unless the serializer sets UseProtoNames, and OpenRTB's own field names are the underscored ones.
## Why it matters
Protojson accepts both spellings when parsing, so a protobuf-to-protobuf hop works and hides the problem. The moment the payload reaches a plain JSON consumer, the field is simply absent: a private auction reads as an open one, a privacy string goes unread, and nothing errors. It is a silent data loss rather than a rejection.
## How to fix it
Serialize with proto field names. In Go that is protojson.MarshalOptions{UseProtoNames: true}. Only three field names in the whole OpenRTB catalog have an underscore, so the fix is small and the exposure is narrow, but it is silent, which is why it is worth flagging.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 }, "pmp": { "privateAuction": true } }] }
Validated with --dialect proto-json, which resolves the name and keeps checking the subtree. In spec JSON the same field reports as undefined.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# EID is missing source, uids, or a UID id · openrtb.eid.field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-eid-field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## EID is missing source, uids, or a UID id
openrtb.eid.field_required error Bid request
An Extended Identifier object has no source, no uids array, or a UID with no id.
## What it means
OpenRTB 2.6 User.eids entries need source (the identity provider's canonical domain) and a non-empty uids array. Each UID needs id, the actual identifier. atype is optional and already enum-checked when present.
## Why it matters
An EID without a source or id is not addressable. DSPs drop the whole eids array rather than risk joining on an empty key, which is how identity "support" becomes a no-op.
## How to fix it
Set source to the provider domain, and put at least one UID with a non-empty id. Do not send an empty eids placeholder.
## Example that trips it
{ "user": { "eids": [{}] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Structured User Agent has no browsers · openrtb.sua.browsers_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-sua-browsers_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Structured User Agent has no browsers
openrtb.sua.browsers_empty warning Bid request
device.sua is present but browsers is missing or empty, so it cannot replace device.ua.
## What it means
UserAgent.browsers is recommended: an array of BrandVersion objects, each with a required brand. An empty sua object is a structured UA with no brands.
## Why it matters
CHIPS and UA reduction make device.ua unreliable. sua is the replacement. Empty browsers means the structured path carries nothing, and buyers fall back to a reduced ua string or skip device targeting.
## How to fix it
Populate browsers with at least one BrandVersion (brand required, version optional). platform is the OS BrandVersion.
## Example that trips it
{ "device": { "ua": "Mozilla/5.0", "sua": {} } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# SKAdNetwork extension is missing a documented field · openrtb.skadn.field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-skadn-field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## SKAdNetwork extension is missing a documented field
openrtb.skadn.field_required error Request or response
imp.ext.skadn or bid.ext.skadn is present but lacks a field the IAB SKAdNetwork OpenRTB extension requires.
## What it means
On the request, versions (or the deprecated version string), sourceapp, and either skadnetids or skadnetlist.max/addl are required. On the response, version, network, itunesitem, and sourceapp are required; SKAdNetwork 4+ needs sourceidentifier, 3.x and below need campaign; fidelities each need nonce, timestamp, and signature (or the 2.0/2.1 top-level equivalents).
## Why it matters
A partial skadn object cannot be signed. Apple's loadProduct() fails, the install is unattributed, and loss reason 214 (invalid SKAdNetwork) is the exchange's report of the same defect.
## How to fix it
If you signal SKAdNetwork, send the full documented object. If the inventory cannot do SKAdNetwork, omit ext.skadn entirely.
## Example that trips it
{ "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 }, "ext": { "skadn": {} } }] }
ext.skadn is present and empty. versions, sourceapp, and an id list are required.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Field required by the declared exchange profile · openrtb.profile.field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Field required by the declared exchange profile
openrtb.profile.field_required error Bid request
An exchange profile was declared, and a field that exchange documents as required is missing or empty.
## What it means
The selected exchange and integration direction document a mandatory field or a conditional requirement satisfied by this capture. Examples include Google Imp.ext.billing_id, supplied Prebid stored-request IDs, BidSwitch billing URLs, and supplier routing identifiers. Optional Xandr identity/context fields and Magnite xAPI protobuf fields are checked when provided. Their omission is not universally rejected.
## Why it matters
A partner contract can require information beyond canonical OpenRTB. Direction matters: supplier ingest requirements do not automatically apply to bidder traffic. Mandatory errors use published requirements; unresolved account configuration remains outside capture-only validation.
## How to fix it
Populate the field the profile names, or drop --profile / profile if you meant the specification only. Floors, blocklists, and other business policy are not encoded here.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }] }
Validated with --profile google-ab. The same payload is valid against the specification, which does not require Imp.ext.billing_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Prebid Server Imp names no bidder · openrtb.profile.prebid.bidder_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-bidder_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Prebid Server Imp names no bidder
openrtb.profile.prebid.bidder_required error Bid request
The Prebid Server profile was declared, and this Imp has no bidder targeting and no stored request that would supply it after merge.
## What it means
Prebid Server offers an impression to a bidder only when imp.ext.prebid.bidder.{bidder} is present (recommended), or the legacy imp.ext.{bidder} object, or a stored request / stored auction response id that PBS merges in. Reserved ext keys (prebid, data, skadn, gpid, tid, ae, igs, context, general, all) are not bidders. PBS returns 400: request.imp[0].ext must contain at least one bidder.
## Why it matters
Without a bidder code, PBS has no adapter to call. The auction endpoint refuses the request rather than running an empty auction.
## How to fix it
Put bidder params at imp.ext.prebid.bidder.{code}, or set imp.ext.prebid.storedrequest.id (or a top-level ext.prebid.storedrequest.id) if the stored request supplies them. Drop --profile prebid-server if this is not a PBS auction payload.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 } }] }
Validated with --profile prebid-server. The same payload is valid against the specification.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Field refused by the declared exchange profile · openrtb.profile.field_forbidden · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-field_forbidden/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Field refused by the declared exchange profile
openrtb.profile.field_forbidden error Bid request
The payload contains a field the declared exchange documents as invalid on that endpoint.
## What it means
Prebid Server returns 400 on requests that define wseat or bseat. Bidder selection is imp.ext.prebid.bidder.{bidder} (or legacy imp.ext.{bidder}), not the OpenRTB seat allow/block lists.
## Why it matters
PBS treats seat lists as an OpenRTB difference, not a filter. Sending them is a protocol error on /openrtb2/auction.
## How to fix it
Remove wseat and bseat. Name bidders on each Imp. Or drop --profile prebid-server if you meant a different exchange.
## Example that trips it
{ "id": "req-1", "wseat": ["appnexus"], "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 }, "ext": { "prebid": { "bidder": { "appnexus": {} } } } }] }
Validated with --profile prebid-server. wseat is legal OpenRTB and illegal on PBS.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Value is not in the declared profile's set · openrtb.profile.value_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-value_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Value is not in the declared profile's set
openrtb.profile.value_invalid error Request or response
A field the exchange documents has a closed value set, and this payload is outside it.
## What it means
Under prebid-server, ext.prebid.trace must be verbose or basic; bid.ext.prebid.type must be banner, video, native, or audio; imp.ext.prebid.bidder must be an object keyed by bidder code; app.ext.prebid.source and version must be strings when present. Under xandr, supplied video.ext.appnexus.context is 0 through 10 in the pinned bidder contract. Other profiles use their own documented enum, range and conditional rules.
## Why it matters
These are documented PBS extension contracts, not OpenRTB enums. A typo here is dropped or 400s depending on the field.
## How to fix it
Use a documented value, or omit the field. Bidder param objects themselves are opaque and not schema-checked.
## Example that trips it
{ "id": "req-1", "imp": [{ "id": "1", "banner": { "w": 300, "h": 250 }, "ext": { "prebid": { "bidder": { "appnexus": {} } } } }], "ext": { "prebid": { "trace": "debug" } } }
Validated with --profile prebid-server. trace allows verbose and basic, not debug.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# ARTF payload is not valid JSON · artf.payload.invalid_json · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-payload-invalid_json/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## ARTF payload is not valid JSON
artf.payload.invalid_json error ARTF envelope
The RTBRequest or RTBResponse could not be parsed as JSON, so no envelope or mutation check can run.
## What it means
The ARTF payload handed to the validator is not parseable JSON. Nothing downstream can run: the envelope members, the carried OpenRTB payloads, and the mutation checks all need a parsed document.
## Why it matters
ARTF transports these messages as protobuf over gRPC, so JSON usually appears at exactly two points: a hand-written fixture, and a debugging dump. Both are where a truncated or double-encoded document slips in unnoticed.
## How to fix it
Serialize with protojson rather than by hand, and check the exact bytes. If the document came out of a log, confirm it was not truncated at a line-length limit.
## Example that trips it
{ "id": "ep-1", "mutations": [
Truncated mutation set: the arrays never close.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# ARTF payload root is not a JSON object · artf.payload.root_not_object · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-payload-root_not_object/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## ARTF payload root is not a JSON object
artf.payload.root_not_object error ARTF envelope
The payload parses but its root is not an object. An RTBRequest and an RTBResponse are each a single message.
## What it means
The document parses as JSON, but the root is an array, a string, or a bare literal. Both ARTF messages are single protobuf messages, so their JSON form is always one object.
## Why it matters
The usual cause is sending the mutation array on its own rather than the RTBResponse that carries it. The mutations are a repeated field inside the message, not the message.
## How to fix it
Send the whole message: an object with id, mutations, and metadata for a response, or the RTBRequest envelope for a request.
## Example that trips it
[{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/imp/imp-1" }]
The mutation list sent where the RTBResponse belongs.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Required RTBRequest member is missing · artf.field.required · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-field-required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Required RTBRequest member is missing
artf.field.required error ARTF envelope
The envelope is missing one of id, lifecycle, tmax, or bid_request, which the ARTF specification marks required.
## What it means
One of the four members the ARTF v1.0 message definition marks required is absent: id (the extension point request id), lifecycle (which auction stage this is), tmax (the time budget), or bid_request (the auction itself).
## Why it matters
Each absence breaks a different thing. Without id the orchestrator cannot match the agent's response to the call. Without lifecycle the agent cannot tell which payload is authoritative. Without tmax it has no budget and will be timed out rather than told. Without bid_request there is no auction to reason about.
## How to fix it
Populate all four. They are cheap fields, and an agent that receives an incomplete envelope has no good option other than declining to respond.
## Example that trips it
{ "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "tmax": 120, "bid_request": { "id": "a-1" } }
No id: the orchestrator has nothing to correlate the response against.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Member is not part of the ARTF message · artf.field.undefined · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-field-undefined/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Member is not part of the ARTF message
artf.field.undefined error ARTF envelope
The envelope carries a member the ARTF proto does not define. Protobuf JSON rejects unknown fields by default.
## What it means
A member appears that is not in the RTBRequest or RTBResponse definition. The most common instance is a camelCased spelling, bidRequest for bid_request, which the reference server marshals with proto names and so does not produce.
## Why it matters
protojson.Unmarshal rejects unknown fields unless the caller opts into DiscardUnknown, so this fails the call rather than being ignored. When it is ignored, the effect is worse: the auction the agent reasons about is not the auction the orchestrator sent.
## How to fix it
Use proto field names and drop anything the message does not define. Extensions belong in the ext member the proto reserves for them.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bidRequest": { "id": "a-1" } }
bidRequest is the protojson camelCase spelling; the field is bid_request.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Carried payload is not an OpenRTB object · artf.field.type_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-field-type_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Carried payload is not an OpenRTB object
artf.field.type_mismatch error ARTF envelope
bid_request or bid_response is present but is not a JSON object, so there is nothing to validate inside it.
## What it means
The envelope carries a bid_request or bid_response member that is not an object: a string, an array, or a literal. Both are embedded protobuf messages, so their JSON form is an object.
## Why it matters
A string here almost always means the payload was JSON-encoded twice, which is a mistake that survives transport and fails at the far end, where the agent tries to read imp and finds a character array.
## How to fix it
Embed the message, do not stringify it. Encode the envelope once, with the auction nested inside it.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": "{\"id\":\"a-1\"}" }
The auction double-encoded as a string inside the envelope.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# tmax is not an integer · artf.tmax.not_integer · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-tmax-not_integer/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## tmax is not an integer
artf.tmax.not_integer error ARTF envelope
tmax carries a non-integer value. It is the milliseconds the exchange allows for mutations to come back.
## What it means
tmax arrived as something other than a whole number: a string, a float, or a null. The field is an int32 carrying milliseconds.
## Why it matters
A string tmax fails to unmarshal on the agent side, and a fractional one is a sign the value was computed in seconds and converted carelessly. Either way the agent cannot size its own work.
## How to fix it
Send whole milliseconds as a number, not a string.
## Example that trips it
{ "id": "ep-1", "tmax": "120", "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# tmax leaves the agent no time to answer · artf.tmax.non_positive · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-tmax-non_positive/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## tmax leaves the agent no time to answer
artf.tmax.non_positive error ARTF envelope
tmax is zero or negative, so the call is already out of budget when it arrives.
## What it means
tmax is zero or below. The field is the time the exchange will wait for mutations, including network latency, so a non-positive value describes a call that cannot succeed.
## Why it matters
It usually means a deadline was computed by subtracting elapsed time from a budget and went negative under load. The agent has no way to distinguish that from a misconfiguration, and any work it does is discarded.
## How to fix it
Skip the extension point call when the remaining budget has run out rather than issuing it with a spent deadline. Calling anyway costs a connection and produces nothing.
## Example that trips it
{ "id": "ep-1", "tmax": 0, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# tmax is too large for an in-auction call · artf.tmax.implausible · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-tmax-implausible/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## tmax is too large for an in-auction call
artf.tmax.implausible warning ARTF envelope
tmax exceeds 1000ms. The extension point runs inside an auction the exchange is already timing out, so a budget this large usually means seconds were sent as milliseconds.
## What it means
tmax is above one second. ARTF's reference samples run at 150ms, and the extension point is called inside an auction that the exchange itself is timing out in the low hundreds of milliseconds.
## Why it matters
The common cause is a unit slip: a 30-second service timeout copied into a field that counts milliseconds. The agent then sizes its work for a budget it will never actually be given, and the orchestrator abandons the call long before the answer arrives.
## How to fix it
Set tmax from the auction's own remaining budget, in milliseconds, minus expected network latency. If the value really is intended, nothing is broken; the warning marks it as worth a second look.
## Example that trips it
{ "id": "ep-1", "tmax": 30000, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": { "id": "a-1" } }
30 seconds where 30 milliseconds or 300 was meant.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# lifecycle is not an ARTF Lifecycle value · artf.lifecycle.unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-lifecycle-unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## lifecycle is not an ARTF Lifecycle value
artf.lifecycle.unknown error ARTF envelope
The lifecycle value is not one the ARTF enum defines, so the agent cannot tell which auction stage it is being called at.
## What it means
lifecycle carries a value outside the Lifecycle enum. ARTF v1.0 defines LIFECYCLE_UNSPECIFIED, LIFECYCLE_PUBLISHER_BID_REQUEST, and LIFECYCLE_DSP_BID_RESPONSE, and states that more will be added.
## Why it matters
The stage decides which intents make sense: bid shading has nothing to shade before a DSP has answered. An agent that cannot read the stage either guesses or declines, and both are worse than being told.
## How to fix it
Send an enum value name or its number. If you are extending the vocabulary privately, note that the proto reserves no range for it, so a receiver has no way to distinguish your value from a version skew.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_MIDROLL", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# lifecycle is LIFECYCLE_UNSPECIFIED · artf.lifecycle.unspecified · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-lifecycle-unspecified/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## lifecycle is LIFECYCLE_UNSPECIFIED
artf.lifecycle.unspecified error ARTF envelope
The stage is explicitly unset, so the agent does not know which payload is authoritative or which intents apply.
## What it means
lifecycle is the enum's zero value. In protobuf that is indistinguishable from the field never being set, which is why it reads as unspecified rather than as a stage.
## Why it matters
Every mutation an agent can propose is stage dependent. Segment activation belongs on the request; bid shading belongs on the response. Without the stage the agent cannot tell which of the two payloads it is being asked to change.
## How to fix it
Set the stage explicitly. The zero value exists so that protobuf can express 'not set', not as a default worth sending.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_UNSPECIFIED", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Response-stage call carries no bid response · artf.lifecycle.payload_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-lifecycle-payload_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Response-stage call carries no bid response
artf.lifecycle.payload_mismatch error ARTF envelope
lifecycle is LIFECYCLE_DSP_BID_RESPONSE but the envelope has no bid_response, so response-stage intents have nothing to target.
## What it means
The envelope declares the DSP bid response stage and carries no bid_response member. The intents that belong to that stage, BID_SHADE above all, address a bid by seat and bid id.
## Why it matters
The agent is being asked to reason about an answer it has not been shown. Any mutation it returns will name a bid that the orchestrator cannot resolve, which is a wasted call at best and a rejected mutation at worst.
## How to fix it
Attach the bid response you want mutated, or call at the publisher request stage instead if the auction has not been answered yet.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_DSP_BID_RESPONSE", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Request-stage call carries a bid response · artf.lifecycle.payload_unexpected · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-lifecycle-payload_unexpected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Request-stage call carries a bid response
artf.lifecycle.payload_unexpected warning ARTF envelope
lifecycle is LIFECYCLE_PUBLISHER_BID_REQUEST, which runs before any DSP has answered, yet the envelope carries a bid_response.
## What it means
The envelope declares the publisher bid request stage and also carries a bid response. At that stage no DSP has answered yet, so there should be nothing to carry.
## Why it matters
Either the stage is mislabelled or the envelope is being reused across stages, and both mean the agent's view of where it sits in the auction is wrong. It is a warning rather than an error because a private arrangement to pass prior-auction context is conceivable, and this validator will not invent a prohibition the specification does not state.
## How to fix it
Set the stage that matches what you sent. If you are passing historical context deliberately, put it in ext rather than in the bid_response member.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": { "id": "a-1" }, "bid_response": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# originator.type is not an ARTF Originator type · artf.originator.type_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-originator-type_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## originator.type is not an ARTF Originator type
artf.originator.type_unknown error ARTF envelope
The business entity type is outside the enum, so the agent cannot tell whose payload it is being asked to change.
## What it means
originator.type carries a value outside TYPE_UNSPECIFIED, TYPE_PUBLISHER, TYPE_SSP, TYPE_EXCHANGE, and TYPE_DSP.
## Why it matters
The originator is who owns the enclosed payload. An agent curating on behalf of an SSP behaves differently from one advising a DSP, and least-privilege reasoning starts from knowing which one is asking.
## How to fix it
Send one of the defined values. Roles that do not fit, curators for instance, are not yet in the v1.0 enum, and inventing a value locally makes the field unreadable for everyone else.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "originator": { "type": "TYPE_CURATOR", "id": "c-1" }, "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# originator.id is empty · artf.originator.id_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-originator-id_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## originator.id is empty
artf.originator.id_missing warning ARTF envelope
The originator names a type but no identity, so the agent cannot tell which business entity owns the payload.
## What it means
The originator object is present with an empty or absent id. The type says what kind of entity it is; the id says which one.
## Why it matters
An agent deployed across several exchanges applies different policy per counterparty, and the orchestrator's own audit trail is thinner without it. It is a warning because nothing in the payload becomes unreadable, only less accountable.
## How to fix it
Populate the identifier you use with that agent contractually, not an internal surrogate key that means nothing on the other side.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "originator": { "type": "TYPE_EXCHANGE" }, "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# No applicable_intents on the envelope · artf.intents.missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-intents-missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## No applicable_intents on the envelope
artf.intents.missing warning ARTF envelope
The agent is not told which intents it may return, and the orchestrator has no declared basis for rejecting the ones it gets.
## What it means
The envelope carries no applicable_intents list. That field is how the orchestrator states which mutations it is prepared to evaluate on this call.
## Why it matters
The framework's evaluation model rests on declared intent: an agent proposes, the orchestrator accepts or rejects, and each side knows the vocabulary in advance. Without the list the agent guesses at what is welcome, and rejections read as arbitrary.
## How to fix it
Send the intents this extension point actually honours. An agent that receives them can skip work it knows will be discarded, which is the point of an in-auction budget.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# applicable_intents is not an array · artf.intents.not_array · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-intents-not_array/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## applicable_intents is not an array
artf.intents.not_array error ARTF envelope
applicable_intents is a repeated field, so its JSON form is an array even when it holds one value.
## What it means
applicable_intents carries a scalar or an object instead of an array. Protobuf repeated fields always serialise as JSON arrays.
## Why it matters
A single-intent extension point is the case where this slips through, because a bare string looks natural and protojson will refuse it.
## How to fix it
Wrap the value in an array, even when there is only one.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "applicable_intents": "ACTIVATE_DEALS", "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# applicable_intents is empty · artf.intents.empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-intents-empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## applicable_intents is empty
artf.intents.empty warning ARTF envelope
The list is present but empty, so every mutation the agent returns is out of scope by definition.
## What it means
applicable_intents is an empty array. The orchestrator has declared that it will accept no intent at all on this call.
## Why it matters
The call still costs a connection, a serialization, and a slice of the auction's time budget, and nothing the agent proposes can be accepted. It is almost always a configuration that filtered every intent out rather than an intentional no-op.
## How to fix it
Either list the intents this extension point honours, or stop making the call.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "applicable_intents": [], "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# applicable_intents lists an unknown intent · artf.intent.unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-intent-unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## applicable_intents lists an unknown intent
artf.intent.unknown error ARTF envelope
One of the declared intents is not an ARTF Intent value, so the agent cannot tell what is actually being offered.
## What it means
A member of applicable_intents is outside the Intent enum: ACTIVATE_SEGMENTS, ACTIVATE_DEALS, SUPPRESS_DEALS, ADJUST_DEAL_FLOOR, ADJUST_DEAL_MARGIN, BID_SHADE, ADD_METRICS, and ADD_CIDS in v1.0.
## Why it matters
The list is a contract offer. An unreadable entry either narrows what the agent will attempt, or, worse, is a newer intent from a version the agent has not adopted, and the two cases are indistinguishable from the payload.
## How to fix it
Send enum names or numbers from the version both sides have agreed on. The intent set is growing in the reference repository, so a value you do not recognise is worth checking against the current proto before assuming it is a typo.
## Example that trips it
{ "id": "ep-1", "tmax": 120, "lifecycle": "LIFECYCLE_PUBLISHER_BID_REQUEST", "applicable_intents": ["ACTIVATE_DEALS", "RESHAPE_AUCTION"], "bid_request": { "id": "a-1" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# The RTBRequest supplied for cross-validation is unusable · artf.request_unusable · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-request_unusable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The RTBRequest supplied for cross-validation is unusable
artf.request_unusable error ARTF mutation set
The envelope passed alongside the mutation set is not a JSON object, so no mutation can be checked against the auction it targets.
## What it means
Mutation validation was asked for, but the RTBRequest envelope supplied as context could not be read as a JSON object.
## Why it matters
Every mutation check is relative: an intent is checked against applicable_intents, a path against the impressions and deals the auction carries. Without the envelope there is nothing to be relative to, and reporting the mutations as clean would be reporting that no checks ran.
## How to fix it
Pass the RTBRequest envelope the agent answered, not the bare bid request and not the mutation set again.
## Example that trips it
rtblint validate --type artf-response --request rtb-request.json rtb-response.json
The --request file must be the RTBRequest envelope, which is what carries applicable_intents and the auction.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# RTBResponse has no id · artf.response.id_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-response-id_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## RTBResponse has no id
artf.response.id_missing error ARTF mutation set
The response carries no id, so the orchestrator cannot tie the mutations back to the extension point call it made.
## What it means
RTBResponse.id is absent or empty. It is how a response is correlated with the RTBRequest that produced it.
## Why it matters
An orchestrator calls several agents concurrently within one auction. Without the id it cannot attribute mutations to the agent that proposed them, which breaks both the accept/reject decision and any later audit of who changed what.
## How to fix it
Echo the id from the RTBRequest verbatim.
## Example that trips it
{ "mutations": [], "metadata": { "api_version": "1.0.0" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# RTBResponse id does not echo the RTBRequest id · artf.response.id_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-response-id_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## RTBResponse id does not echo the RTBRequest id
artf.response.id_mismatch error ARTF mutation set
The response id is not the extension point request id. The envelope id is not the bid request id, and confusing the two is the common failure.
## What it means
RTBResponse.id carries something other than the RTBRequest.id it answers. The usual value found here is the bid request id, which sits one level deeper, inside bid_request.
## Why it matters
The two ids are adjacent, similar looking, and assigned by different parties: the envelope id is the exchange's handle for this extension point call, while the bid request id identifies the auction. An agent that echoes the wrong one produces mutations the orchestrator drops as unmatched, and the symptom is an agent that appears to return nothing.
## How to fix it
Echo the top-level RTBRequest.id, not bid_request.id.
## Example that trips it
{ "id": "auction-9001", "mutations": [], "metadata": { "api_version": "1.0.0" } }
The auction id echoed where the extension point request id belongs.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# RTBResponse carries no metadata · artf.response.metadata_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-response-metadata_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## RTBResponse carries no metadata
artf.response.metadata_missing warning ARTF mutation set
Without api_version and model_version, an orchestrator cannot record which agent build produced these mutations.
## What it means
The response has no metadata object. ARTF defines it to carry the data provider API version and, where a model computed the mutation, the model version.
## Why it matters
Mutations change what an auction pays and who wins it. When a curation model starts behaving badly, the version stamp is what lets an orchestrator say which build did it and from when, and reconstructing that after the fact from deployment logs is guesswork.
## How to fix it
Populate metadata on every response, including responses that propose nothing.
## Example that trips it
{ "id": "ep-1", "mutations": [{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/imp/imp-1", "ids": { "id": ["deal-2"] } }] }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# The response proposes no mutations · artf.mutations.empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutations-empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The response proposes no mutations
artf.mutations.empty warning ARTF mutation set
The agent returned an empty mutation set, so the orchestrator paid for the call and has nothing to evaluate.
## What it means
The response carries no mutations, either because the field is absent or because it is an empty array.
## Why it matters
An empty answer is legitimate: an agent that has nothing useful to propose should say so rather than invent something. It is worth a warning because a persistently empty agent is indistinguishable from a broken one, and the in-auction call is not free.
## How to fix it
Nothing to fix in the payload. If the emptiness is unexpected, check whether applicable_intents excluded everything the agent knows how to do.
## Example that trips it
{ "id": "ep-1", "mutations": [], "metadata": { "api_version": "1.0.0", "model_version": "curation-2026.07" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# A mutation entry is not an object · artf.mutation.not_object · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-not_object/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A mutation entry is not an object
artf.mutation.not_object error ARTF mutation set
An entry in the mutations array is not a Mutation object, so it carries no intent, operation, or path to check.
## What it means
One member of the mutations array is a scalar or an array rather than an object. Each entry is a Mutation message with intent, op, path, and one value payload.
## Why it matters
It is usually a list of ids where a list of mutations belongs, which means the agent's builder collapsed one nesting level and every mutation in that batch is lost.
## How to fix it
Wrap each proposed change in a Mutation object, even when the change is a single id.
## Example that trips it
{ "id": "ep-1", "mutations": ["deal-2"], "metadata": { "api_version": "1.0.0" } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation intent is not an ARTF Intent value · artf.mutation.intent_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-intent_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation intent is not an ARTF Intent value
artf.mutation.intent_unknown error ARTF mutation set
The declared intent is outside the enum, so the orchestrator cannot tell why the change is being proposed.
## What it means
The mutation's intent is not one of the ARTF Intent values and does not match the document's own legacy spellings either.
## Why it matters
ARTF's whole evaluation model is that a mutation declares its purpose so the orchestrator can accept or reject it on that basis. An unreadable intent is a change with no stated reason, which an orchestrator can only reject.
## How to fix it
Send an enum value name or its number. Check the current proto before assuming a value is invalid: the intent set is growing, and an unknown value can be a newer intent rather than a typo.
## Example that trips it
{ "intent": "ROTATE_CREATIVE", "op": "OPERATION_REPLACE", "path": "/imp/imp-1" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation intent is INTENT_UNSPECIFIED · artf.mutation.intent_unspecified · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-intent_unspecified/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation intent is INTENT_UNSPECIFIED
artf.mutation.intent_unspecified error ARTF mutation set
The mutation declares no purpose, so it cannot be evaluated independently, which is what ARTF requires of every change.
## What it means
intent is the enum's zero value, indistinguishable in protobuf from never being set.
## Why it matters
The specification requires that agentic changes declare their intentions so orchestrators understand why a change is proposed, and that each change be evaluable in isolation. An unspecified intent fails both.
## How to fix it
Name the intent the change serves. If no defined intent fits, the change does not have a home in v1.0, and inventing one silently is worse than not proposing it.
## Example that trips it
{ "intent": "INTENT_UNSPECIFIED", "op": "OPERATION_ADD", "path": "/imp/imp-1", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Intent is not among the request's applicable_intents · artf.mutation.intent_not_applicable · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-intent_not_applicable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Intent is not among the request's applicable_intents
artf.mutation.intent_not_applicable error ARTF mutation set
The mutation declares an intent the orchestrator did not offer on this call, so it is rejected on arrival.
## What it means
The mutation's intent is valid but absent from the applicable_intents list the RTBRequest declared. That list is the orchestrator stating what it is prepared to evaluate.
## Why it matters
The mutation is dead on arrival, and the work behind it was spent inside an auction's time budget. When it happens systematically it usually means the agent ignores the field entirely, which also means it will keep proposing intents an orchestrator has deliberately disabled.
## How to fix it
Filter proposals against applicable_intents before returning them. If an intent you need is never offered, that is a conversation with the orchestrator rather than something to work around.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/seatbid/dsp-1/bid/bid-abc", "adjust_bid": { "price": 3.15 } }
Sent against a request whose applicable_intents covered only deal and segment activation.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation op is not an ARTF Operation value · artf.mutation.op_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-op_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation op is not an ARTF Operation value
artf.mutation.op_unknown error ARTF mutation set
The operation is outside the enum, so the orchestrator cannot tell whether to add, replace, or remove at the target path.
## What it means
op carries a value outside OPERATION_ADD, OPERATION_REMOVE, and OPERATION_REPLACE, and is not one of the document's lowercase spellings either.
## Why it matters
The path says where and the payload says what; the operation says which of three quite different things to do with it. Guessing between adding a deal and replacing the deal list is not a guess an orchestrator can safely make.
## How to fix it
Send an enum value name or its number.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_UPSERT", "path": "/imp/imp-1", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation op is OPERATION_UNSPECIFIED · artf.mutation.op_unspecified · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-op_unspecified/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation op is OPERATION_UNSPECIFIED
artf.mutation.op_unspecified error ARTF mutation set
The operation is unset, so the change has a target and a value but no verb.
## What it means
op is the enum's zero value, which protobuf cannot distinguish from an unset field.
## Why it matters
For an id list the difference between add and replace is the difference between extending the deals on an impression and discarding the ones already there. That is not a detail an orchestrator can infer from intent alone.
## How to fix it
Set the operation explicitly on every mutation.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_UNSPECIFIED", "path": "/imp/imp-1", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Remove operation on an intent that carries a value · artf.mutation.op_not_applicable · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-op_not_applicable/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Remove operation on an intent that carries a value
artf.mutation.op_not_applicable warning ARTF mutation set
The mutation removes at a path while declaring an intent that adjusts a price or a floor, where replace is the operation that applies.
## What it means
op is OPERATION_REMOVE on ADJUST_DEAL_FLOOR, ADJUST_DEAL_MARGIN, or BID_SHADE. Those intents carry a new value for a field that already exists.
## Why it matters
An orchestrator reading the operation literally would delete the floor rather than change it, which quietly turns a curated deal into an unfloored one. A warning rather than an error, because removing a floor is a coherent thing to want; it is just not what these intents describe.
## How to fix it
Use OPERATION_REPLACE to change a price or a floor. If you really mean to clear the field, say so with an intent that describes removal.
## Example that trips it
{ "intent": "ADJUST_DEAL_FLOOR", "op": "OPERATION_REMOVE", "path": "/imp/imp-1/pmp/deals/deal-premium", "adjust_deal": { "bidfloor": 14.5 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation has no path · artf.mutation.path_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-path_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation has no path
artf.mutation.path_missing error ARTF mutation set
path is required: it is the semantic reference naming which auction entity the mutation applies to.
## What it means
The mutation carries no path, or an empty one. ARTF paths are semantic references such as /imp/imp-1 or /user/data/segment, naming a business entity rather than a JSON location.
## Why it matters
Without it the orchestrator has an intent and a value but no target. For an intent like ADJUST_DEAL_FLOOR, which deal to reprice is the whole content of the proposal.
## How to fix it
Name the entity: /user/data/segment for segments, /imp/{imp id} for an impression, /imp/{imp id}/pmp/deals/{deal id} for a deal, /seatbid/{seat}/bid/{bid id} for a bid.
## Example that trips it
{ "intent": "ADJUST_DEAL_FLOOR", "op": "OPERATION_REPLACE", "adjust_deal": { "bidfloor": 14.5 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation path does not start with a slash · artf.mutation.path_not_absolute · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-path_not_absolute/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation path does not start with a slash
artf.mutation.path_not_absolute error ARTF mutation set
ARTF semantic paths are rooted at the payload, so they begin with /.
## What it means
The path is present but does not start with /. Every path in the specification and in the reference implementation is rooted.
## Why it matters
A relative-looking path leaves the orchestrator guessing what it is relative to, and the two plausible guesses, the payload root and the previous mutation's target, resolve to different entities.
## How to fix it
Root the path at the payload: imp/imp-1 becomes /imp/imp-1.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "imp/imp-1", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation path is not one ARTF documents · artf.mutation.path_unrecognized · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-path_unrecognized/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation path is not one ARTF documents
artf.mutation.path_unrecognized warning ARTF mutation set
The path is rooted and well formed but is not one of the semantic references ARTF v1.0 documents, so only a prior agreement can resolve it.
## What it means
The path does not match /user/data/segment, /imp/{imp id}, /imp/{imp id}/pmp/deals/{deal id}, or /seatbid/{seat}/bid/{bid id}. Those four are what the specification and its example docs actually show.
## Why it matters
Paths are deliberately semantic, so the vocabulary can grow, and an orchestrator may well have agreed a private one with a given agent. It stays a warning for that reason. What it cannot do is resolve against the auction, so nothing further about this mutation is checked.
## How to fix it
Use a documented path where one fits. If the path is a private arrangement, expect any generic tooling in the chain to treat it as opaque.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/curation/pods/pod-1", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Path names a different kind of entity than the intent expects · artf.mutation.path_intent_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-path_intent_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Path names a different kind of entity than the intent expects
artf.mutation.path_intent_mismatch warning ARTF mutation set
The intent and the path disagree: segment activation pointed at a bid, or bid shading pointed at an impression.
## What it means
The path resolves to an entity the declared intent does not act on. ACTIVATE_SEGMENTS belongs on /user/data/segment, deal and metric intents on an impression, floor and margin intents on a deal, and BID_SHADE on a bid.
## Why it matters
The orchestrator has two contradictory statements about what is being changed and no rule for which to believe. In practice it is a copied mutation whose path was updated and whose intent was not, or the reverse.
## How to fix it
Make the two agree. The finding names the example path shape for the intent it saw.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/imp/imp-1", "adjust_bid": { "price": 3.15 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation path names an impression the auction does not carry · artf.mutation.imp_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-imp_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation path names an impression the auction does not carry
artf.mutation.imp_unknown error ARTF mutation set
The imp id in the path is not among the impressions in the bid request the envelope carried.
## What it means
The path names an impression id that does not appear in bid_request.imp. The finding lists the ids the auction actually carries.
## Why it matters
It is the most common way an agent's own state goes stale: an impression id remembered from a previous auction, or a hard-coded id from a sample. The mutation is unappliable, and because it names an id rather than an index there is no near-miss for the orchestrator to fall back on.
## How to fix it
Take impression ids from the bid request in this envelope rather than from cached state.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/imp/imp-404", "ids": { "id": ["deal-2"] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation path names a deal the impression does not offer · artf.mutation.deal_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-deal_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation path names a deal the impression does not offer
artf.mutation.deal_unknown error ARTF mutation set
The deal id in the path is not among the deals the impression's pmp object carries, so there is no floor or margin to adjust.
## What it means
The impression resolved, but the deal id in the path is not in its pmp.deals. The finding lists the deal ids that impression does offer.
## Why it matters
A floor or a margin can only be adjusted on a deal the auction already carries. Proposing one for an absent deal is either stale deal sync or a confusion between activating a deal, which uses the ids payload, and repricing one, which uses the path.
## How to fix it
To reprice an existing deal, name it in the path. To bring a new deal into the auction, use ACTIVATE_DEALS with the id in the payload and the impression in the path.
## Example that trips it
{ "intent": "ADJUST_DEAL_FLOOR", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-unlisted", "adjust_deal": { "bidfloor": 3.0 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation path names a bid the response does not contain · artf.mutation.bid_unknown · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-bid_unknown/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation path names a bid the response does not contain
artf.mutation.bid_unknown error ARTF mutation set
The seat and bid id in the path do not resolve to a bid in the carried bid response.
## What it means
The path is a bid reference, /seatbid/{seat}/bid/{bid id}, and no seatbid with that seat holds a bid with that id.
## Why it matters
Bid shading names its target by seat and bid id rather than by position, so a mismatch is not recoverable by looking nearby. A shading proposal that cannot be resolved is a price that silently does not change.
## How to fix it
Read the seat and bid id out of the bid response in this envelope. Watch for shading a bid from a different seat than the one it belongs to.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/seatbid/dsp-9/bid/bid-abc", "adjust_bid": { "price": 3.15 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation targets a bid, but the envelope carried no bid response · artf.mutation.target_payload_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-target_payload_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation targets a bid, but the envelope carried no bid response
artf.mutation.target_payload_missing error ARTF mutation set
The path addresses a bid and the RTBRequest has no bid_response to mutate.
## What it means
A bid-targeting mutation was proposed against an envelope that carries only a bid request. There is no response document for the path to resolve into.
## Why it matters
It is the mutation-side symptom of a stage mismatch: an agent proposing response-stage changes while being called at the publisher request stage, before any DSP has answered.
## How to fix it
Propose bid changes only when the envelope carries a bid response, which is the LIFECYCLE_DSP_BID_RESPONSE stage.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/seatbid/dsp-1/bid/bid-abc", "adjust_bid": { "price": 3.15 } }
Returned against a request-stage envelope.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation sets no value payload · artf.mutation.payload_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-payload_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation sets no value payload
artf.mutation.payload_missing error ARTF mutation set
The mutation names an intent and a target but carries none of the value oneof members, so there is nothing to apply.
## What it means
None of ids, adjust_deal, adjust_bid, metrics, or content_data is present. Each intent carries its value in one of them.
## Why it matters
The proposal is empty. An orchestrator can neither apply nor sensibly reject it, since it cannot tell whether the agent meant to clear something or failed to populate the payload.
## How to fix it
Set the payload member the intent uses: ids for segment and deal activation, adjust_deal for floors and margins, adjust_bid for shading, metrics for ADD_METRICS. The finding names the expected member.
## Example that trips it
{ "intent": "ADJUST_DEAL_FLOOR", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-premium" }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# More than one value payload is set · artf.mutation.payload_ambiguous · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-payload_ambiguous/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## More than one value payload is set
artf.mutation.payload_ambiguous error ARTF mutation set
value is a protobuf oneof, so exactly one payload member may be present.
## What it means
Two or more of ids, adjust_deal, adjust_bid, metrics, and content_data are set on the same mutation.
## Why it matters
In protobuf a oneof holds a single member, and setting a second clears the first, so the JSON expresses something the wire format cannot carry. Whichever member survives the round trip depends on ordering, which makes the mutation's effect a property of the serializer rather than of the proposal.
## How to fix it
Split the change into separate mutations. ARTF evaluates each independently anyway, which is what makes splitting free.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/imp/imp-1", "ids": { "id": ["deal-2"] }, "adjust_bid": { "price": 4.0 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Value payload does not match the declared intent · artf.mutation.payload_intent_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-payload_intent_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Value payload does not match the declared intent
artf.mutation.payload_intent_mismatch error ARTF mutation set
The mutation sets a payload member the intent does not carry, such as adjust_bid on a deal activation.
## What it means
Exactly one payload member is set, but it is not the one the intent uses. The finding names the member the intent expects.
## Why it matters
Intent and payload are the two halves of what is being proposed, and when they disagree the orchestrator has no basis to prefer one. It usually surfaces when a mutation builder is copied between intents and the payload construction is not updated.
## How to fix it
Set the member the intent carries. ADD_CIDS is the only intent that accepts more than one, ids or content_data.
## Example that trips it
{ "intent": "ACTIVATE_DEALS", "op": "OPERATION_ADD", "path": "/imp/imp-1", "adjust_bid": { "price": 4.0 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Id list payload is empty · artf.mutation.ids_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-ids_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Id list payload is empty
artf.mutation.ids_empty error ARTF mutation set
The mutation proposes no ids, so it changes nothing while still consuming an evaluation slot.
## What it means
The ids payload is present but holds no identifiers. Segment activation, deal activation, and deal suppression all carry their subject in that list.
## Why it matters
An empty list is a no-op dressed as a proposal. It usually means an upstream lookup returned nothing and the mutation was built anyway, which hides the fact that the agent found no segments or deals to act on.
## How to fix it
Skip the mutation when the list would be empty. Returning nothing is a clearer answer than returning an empty change.
## Example that trips it
{ "intent": "ACTIVATE_SEGMENTS", "op": "OPERATION_ADD", "path": "/user/data/segment", "ids": { "id": [] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Proposed deal bidfloor is negative · artf.mutation.bidfloor_negative · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-bidfloor_negative/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Proposed deal bidfloor is negative
artf.mutation.bidfloor_negative error ARTF mutation set
The floor adjustment carries a negative price, which OpenRTB has no meaning for.
## What it means
adjust_deal.bidfloor is below zero. A deal's bidfloor is the minimum CPM that deal accepts, in the deal's currency.
## Why it matters
Applying it writes a negative floor into the auction, which downstream bidders interpret unpredictably: some clamp it to zero, some reject the deal outright. Where it comes from is usually a shading or margin calculation subtracting more than the original floor.
## How to fix it
Clamp floor calculations at zero and decide deliberately what a zero floor means for that deal.
## Example that trips it
{ "intent": "ADJUST_DEAL_FLOOR", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-premium", "adjust_deal": { "bidfloor": -2.5 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Proposed margin is negative · artf.mutation.margin_negative · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-margin_negative/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Proposed margin is negative
artf.mutation.margin_negative error ARTF mutation set
The margin adjustment carries a negative value, whether it is expressed as CPM or as a percentage.
## What it means
adjust_deal.margin.value is below zero.
## Why it matters
A negative margin is a request to pay out more than comes in. If that is genuinely intended, it is a commercial decision that should be explicit somewhere other than a sign flip in an in-auction mutation.
## How to fix it
Send a non-negative value, and check whether the calculation inverted a subtraction.
## Example that trips it
{ "intent": "ADJUST_DEAL_MARGIN", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-premium", "adjust_deal": { "margin": { "value": -5.0, "calculation_type": "PERCENT" } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Percentage margin is above 100 · artf.mutation.margin_implausible · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-margin_implausible/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Percentage margin is above 100
artf.mutation.margin_implausible warning ARTF mutation set
A PERCENT margin above 100 would take the whole bid and more.
## What it means
adjust_deal.margin carries calculation_type PERCENT with a value above 100.
## Why it matters
It is almost always a unit confusion: a CPM amount sent while the calculation type says percentage, or a fraction scaled twice. It stays a warning because the specification sets no ceiling, so the validator reports the implausibility rather than inventing a limit.
## How to fix it
Check the calculation type against the value. A CPM adjustment belongs with CPM, not with PERCENT.
## Example that trips it
{ "intent": "ADJUST_DEAL_MARGIN", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-premium", "adjust_deal": { "margin": { "value": 140.0, "calculation_type": "PERCENT" } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Bid shading carries no price · artf.mutation.price_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-price_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Bid shading carries no price
artf.mutation.price_missing error ARTF mutation set
BID_SHADE proposes a new bid price, and adjust_bid.price is absent.
## What it means
The adjust_bid payload is present without a price member.
## Why it matters
The price is the entire content of a shading proposal. Without it the orchestrator knows which bid to change and not what to change it to.
## How to fix it
Set adjust_bid.price to the shaded CPM, in the bid response's currency.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/seatbid/dsp-1/bid/bid-abc", "adjust_bid": {} }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Proposed bid price is negative · artf.mutation.price_negative · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-price_negative/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Proposed bid price is negative
artf.mutation.price_negative error ARTF mutation set
The shaded price is below zero, which no auction can settle.
## What it means
adjust_bid.price is negative. Bid prices in OpenRTB are CPMs in the response's currency.
## Why it matters
A shading model that subtracts an absolute amount from a low bid crosses zero, and clamping is often left out because the case looks impossible in testing. Applied, it produces a bid nothing downstream can price.
## How to fix it
Clamp shaded prices at or above the applicable floor, and treat a shade that would go below it as a decision not to bid rather than as a negative price.
## Example that trips it
{ "intent": "BID_SHADE", "op": "OPERATION_REPLACE", "path": "/seatbid/dsp-1/bid/bid-abc", "adjust_bid": { "price": -2.5 } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Metrics payload is empty · artf.mutation.metrics_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-metrics_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Metrics payload is empty
artf.mutation.metrics_empty error ARTF mutation set
ADD_METRICS proposes no metrics, so the mutation adds nothing to the impression.
## What it means
The metrics payload is present but carries no Metric entries.
## Why it matters
As with an empty id list, this is a no-op that still occupies an evaluation slot, and it conceals the more interesting fact that the agent had no measurement to contribute.
## How to fix it
Skip the mutation when there is nothing to add.
## Example that trips it
{ "intent": "ADD_METRICS", "op": "OPERATION_ADD", "path": "/imp/imp-1", "metrics": { "metric": [] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Proposed metric has no type · artf.mutation.metric_type_missing · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-metric_type_missing/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Proposed metric has no type
artf.mutation.metric_type_missing error ARTF mutation set
OpenRTB requires Metric.type. Without it, whoever receives the mutated request cannot interpret the value.
## What it means
A metric in the metrics payload carries no type. In OpenRTB the Metric object's type names what is being measured, for example viewability, and the value is meaningless without it.
## Why it matters
The metric is written into the bid request and travels onward to bidders, which read type first. A typeless metric is a number with no unit, and the request that carries it is no longer valid OpenRTB.
## How to fix it
Set type on every metric, and set vendor too when the value did not come from the exchange itself.
## Example that trips it
{ "intent": "ADD_METRICS", "op": "OPERATION_ADD", "path": "/imp/imp-1", "metrics": { "metric": [{ "value": 0.82 }] } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# ADJUST_DEAL_MARGIN has no OpenRTB field to write to · artf.mutation.no_openrtb_target · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-no_openrtb_target/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## ADJUST_DEAL_MARGIN has no OpenRTB field to write to
artf.mutation.no_openrtb_target warning ARTF mutation set
Margin is not part of the OpenRTB Deal object, so the orchestrator has to apply it out of band and no validator can check the result.
## What it means
The mutation declares ADJUST_DEAL_MARGIN. The ARTF payload for it is well defined, but OpenRTB 2.6's Deal object has no margin field, so there is nowhere in the auction for the value to land.
## Why it matters
This is a gap between the two specifications rather than a defect in the payload. It matters because the rest of a mutation set can be verified end to end, and this one cannot: whatever the orchestrator does with the margin happens in its own systems, invisible to anything that inspects the resulting bid request.
## How to fix it
Nothing to fix in the mutation. Expect the value to be applied out of band, and do not rely on reading it back from the auction.
## Example that trips it
{ "intent": "ADJUST_DEAL_MARGIN", "op": "OPERATION_REPLACE", "path": "/imp/imp-1/pmp/deals/deal-premium", "adjust_deal": { "margin": { "value": 12.0, "calculation_type": "PERCENT" } } }
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Mutation uses the ARTF document's vocabulary, not its proto's · artf.mutation.legacy_spec_encoding · RTBlint
URL: https://rtblint.org/docs/rule-reference/artf-mutation-legacy_spec_encoding/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Mutation uses the ARTF document's vocabulary, not its proto's
artf.mutation.legacy_spec_encoding warning ARTF mutation set
The mutation is written the way the ARTF v1.0 document's examples are, with camelCase intents and a value wrapper, rather than the enum names and oneof members its own .proto defines.
## What it means
The mutation carries an intent such as activateSegments or adjustDeals, an op such as add, or a payload wrapped as value: {IDsPayload: ...}. The ARTF v1.0 document's worked examples use that vocabulary; the .proto in the same repository defines ACTIVATE_SEGMENTS, OPERATION_ADD, and top-level oneof members.
## Why it matters
The two are not interchangeable, and the reference server speaks only the second. Someone implementing from the specification document produces the first and gets a rejection that reads like an unknown intent, which sends them looking for a mistake they did not make. The validator maps the spelling and keeps checking the rest of the mutation for that reason.
## How to fix it
Generate mutations from the .proto rather than from the document's examples: enum value names for intent and op, and the payload as a top-level oneof member.
## Example that trips it
{ "intent": "adjustDeals", "op": "replace", "path": "/imp/1/deals/500", "value": { "AdjustDealPayload": { "bidfloor": 8.0 } } }
Copied from the ARTF v1.0 document's complex orchestration example.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Back to the full diagnostic code reference .
---
# Adform DSA advertiser names must contain at most 100 Unicode characters. · openrtb.profile.adform.dsa_name_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-adform-dsa_name_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Adform DSA advertiser names must contain at most 100 Unicode characters.
openrtb.profile.adform.dsa_name_length error Bid response
Adform DSA advertiser names must contain at most 100 Unicode characters.
## What it means
Adform DSA advertiser names must contain at most 100 Unicode characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "handler-request",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"ext": {
"dsa": {
"behalf": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé",
"paid": "Sponsor",
"adrender": 1,
"transparency": [
{
"domain": "buyer.example",
"params": [
1,
2,
3
]
}
]
}
}
}
]
}
]
}
Profile adform-handler, OpenRTB 2.5. The fixture asserts openrtb.profile.adform.dsa_name_length at seatbid[0].bid[0].ext.dsa.behalf.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Adform DSA targeting parameter must be 1, 2, or 3. · openrtb.profile.adform.dsa_parameter · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-adform-dsa_parameter/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Adform DSA targeting parameter must be 1, 2, or 3.
openrtb.profile.adform.dsa_parameter error Bid request
Adform DSA targeting parameter must be 1, 2, or 3.
## What it means
Adform DSA targeting parameter must be 1, 2, or 3. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "handler-request",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"regs": {
"ext": {
"gdpr": 0,
"gpc": "1",
"dsa": {
"dsarequired": 2,
"pubrender": 0,
"datatopub": 2,
"transparency": [
{
"domain": "platform.example",
"dsaparams": [
0
]
}
]
}
}
}
}
Profile adform-handler, OpenRTB 2.5. The fixture asserts openrtb.profile.adform.dsa_parameter at regs.ext.dsa.transparency[0].dsaparams[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Adform requires DSA response information when the Handler request's DSA requirement is 2 or 3. · openrtb.profile.adform.dsa_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-adform-dsa_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Adform requires DSA response information when the Handler request's DSA requirement is 2 or 3.
openrtb.profile.adform.dsa_required error Request/response pair
Adform requires DSA response information when the Handler request's DSA requirement is 2 or 3.
## What it means
Adform requires DSA response information when the Handler request's DSA requirement is 2 or 3. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
Request:
{
"id": "handler-request",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"regs": {
"ext": {
"gdpr": 0,
"gpc": "1",
"dsa": {
"dsarequired": 2,
"pubrender": 0,
"datatopub": 2,
"transparency": [
{
"domain": "platform.example",
"dsaparams": [
1,
2,
3
]
}
]
}
}
}
}
Response:
{
"id": "handler-request",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"ext": {}
}
]
}
]
}
Profile adform-handler, OpenRTB 2.5. The fixture asserts openrtb.profile.adform.dsa_required at seatbid[0].bid[0].ext.dsa.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Adform Native image requests need image dimensions; unbounded images do not generate impressions. · openrtb.profile.adform.native_image_size · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-adform-native_image_size/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Adform Native image requests need image dimensions; unbounded images do not generate impressions.
openrtb.profile.adform.native_image_size error Bid request
Adform Native image requests need image dimensions; unbounded images do not generate impressions.
## What it means
Adform Native image requests need image dimensions; unbounded images do not generate impressions. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "handler-request",
"imp": [
{
"id": "1",
"native": {
"ver": "1.1",
"request": "{\"ver\": \"1.1\", \"assets\": [{\"id\": 1, \"required\": 1, \"img\": {\"type\": 3}}]}"
}
}
]
}
Profile adform-handler, OpenRTB 2.5. The fixture asserts openrtb.profile.adform.native_image_size at imp[0].native.request.assets[0].img.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Adform's declared supply chain requires at least one node. · openrtb.profile.adform.schain_nodes · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-adform-schain_nodes/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Adform's declared supply chain requires at least one node.
openrtb.profile.adform.schain_nodes error Bid request
Adform's declared supply chain requires at least one node.
## What it means
Adform's declared supply chain requires at least one node. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "handler-request",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"source": {
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [],
"ext": {}
}
}
}
}
Profile adform-handler, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.adform.schain_nodes at source.ext.schain.nodes.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin requires an advertiser domain. · openrtb.profile.applovin.advertiser_domain · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-advertiser_domain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin requires an advertiser domain.
openrtb.profile.applovin.advertiser_domain error Bid response
AppLovin requires an advertiser domain.
## What it means
AppLovin requires an advertiser domain. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1"
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.advertiser_domain at seatbid[0].bid[0].adomain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin ALX does not support VPAID or ORMMA. · openrtb.profile.applovin.api_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-api_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin ALX does not support VPAID or ORMMA.
openrtb.profile.applovin.api_unsupported error Bid response
AppLovin ALX does not support VPAID or ORMMA.
## What it means
AppLovin ALX does not support VPAID or ORMMA. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"api": 1
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.api_unsupported at seatbid[0].bid[0].api.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin HTML with SKAdNetwork requires click trackers. · openrtb.profile.applovin.clicktrackers · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-clicktrackers/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin HTML with SKAdNetwork requires click trackers.
openrtb.profile.applovin.clicktrackers error Bid response
AppLovin HTML with SKAdNetwork requires click trackers.
## What it means
AppLovin HTML with SKAdNetwork requires click trackers. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "12345678-1234-1234-1234-123456789abc",
"signature": "signed-value",
"timestamp": "1700000000000"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.clicktrackers at seatbid[0].bid[0].ext.clicktrackers.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin creative type must identify a supported HTML, MRAID, Native or VAST format. · openrtb.profile.applovin.creative_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-creative_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin creative type must identify a supported HTML, MRAID, Native or VAST format.
openrtb.profile.applovin.creative_type error Bid response
AppLovin creative type must identify a supported HTML, MRAID, Native or VAST format.
## What it means
AppLovin creative type must identify a supported HTML, MRAID, Native or VAST format. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"ext": {
"crtype": "audio"
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.creative_type at seatbid[0].bid[0].ext.crtype.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin ALX accepts only USD; omitting currency defaults to USD. · openrtb.profile.applovin.currency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin ALX accepts only USD; omitting currency defaults to USD.
openrtb.profile.applovin.currency error Bid response
AppLovin ALX accepts only USD; omitting currency defaults to USD.
## What it means
AppLovin ALX accepts only USD; omitting currency defaults to USD. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1"
}
]
}
],
"cur": 7
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.currency at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin substitutes AUCTION_LOSS only in lurl. · openrtb.profile.applovin.macro_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-macro_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin substitutes AUCTION_LOSS only in lurl.
openrtb.profile.applovin.macro_context error Bid response
AppLovin substitutes AUCTION_LOSS only in lurl.
## What it means
AppLovin substitutes AUCTION_LOSS only in lurl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://events.example/?loss=${AUCTION_LOSS}",
"cat": [
"IAB9"
],
"crid": "creative-1"
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.macro_context at seatbid[0].bid[0].burl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin ALX Native does not support video assets. · openrtb.profile.applovin.native_video · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-native_video/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin ALX Native does not support video assets.
openrtb.profile.applovin.native_video error Bid response
AppLovin ALX Native does not support video assets.
## What it means
AppLovin ALX Native does not support video assets. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"video\": {\"vasttag\": \"\"}}], \"link\": {\"url\": \"https://advertiser.example\"}}",
"ext": {
"crtype": "native"
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.native_video at seatbid[0].bid[0].adm.native.assets[0].video.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin rejects publisher app.bundle used as the advertised app bundle. · openrtb.profile.applovin.publisher_bundle · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-publisher_bundle/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin rejects publisher app.bundle used as the advertised app bundle.
openrtb.profile.applovin.publisher_bundle error Request/response pair
AppLovin rejects publisher app.bundle used as the advertised app bundle.
## What it means
AppLovin rejects publisher app.bundle used as the advertised app bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "request-1",
"app": {
"bundle": "123456789"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"skadn": {
"version": "3.0",
"sourceapp": "123456789",
"skadnetids": [
"example.skadnetwork"
]
}
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "123456789"
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.publisher_bundle at seatbid[0].bid[0].bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# ALX documents a 4 KB maximum bid response; this JSON body exceeds 4096 UTF-8 bytes. · openrtb.profile.applovin.response_size · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-response_size/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## ALX documents a 4 KB maximum bid response; this JSON body exceeds 4096 UTF-8 bytes.
openrtb.profile.applovin.response_size error Bid response
ALX documents a 4 KB maximum bid response; this JSON body exceeds 4096 UTF-8 bytes.
## What it means
ALX documents a 4 KB maximum bid response; this JSON body exceeds 4096 UTF-8 bytes. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1"
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.response_size. The original response is 4512 UTF-8 bytes. Its exact bytes are preserved for replay.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# A supplied AppLovin seat must be an alphanumeric string of at most 40 characters. · openrtb.profile.applovin.seat_format · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-seat_format/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A supplied AppLovin seat must be an alphanumeric string of at most 40 characters.
openrtb.profile.applovin.seat_format error Bid response
A supplied AppLovin seat must be an alphanumeric string of at most 40 characters.
## What it means
A supplied AppLovin seat must be an alphanumeric string of at most 40 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1"
}
],
"seat": ""
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.seat_format at seatbid[0].seat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork campaign must be an integer string in its version-specific range. · openrtb.profile.applovin.skadn_campaign · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_campaign/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork campaign must be an integer string in its version-specific range.
openrtb.profile.applovin.skadn_campaign error Bid response
AppLovin SKAdNetwork campaign must be an integer string in its version-specific range.
## What it means
AppLovin SKAdNetwork campaign must be an integer string in its version-specific range. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "12345678-1234-1234-1234-123456789abc",
"signature": "signed-value",
"timestamp": "1700000000000"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_campaign at seatbid[0].bid[0].ext.skadn.campaign.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork fidelities must not be empty. · openrtb.profile.applovin.skadn_fidelity · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_fidelity/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork fidelities must not be empty.
openrtb.profile.applovin.skadn_fidelity error Bid response
AppLovin SKAdNetwork fidelities must not be empty.
## What it means
AppLovin SKAdNetwork fidelities must not be empty. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": []
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_fidelity at seatbid[0].bid[0].ext.skadn.fidelities.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork itunesitem must match advertised bid.bundle. · openrtb.profile.applovin.skadn_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork itunesitem must match advertised bid.bundle.
openrtb.profile.applovin.skadn_mismatch error Bid response
AppLovin SKAdNetwork itunesitem must match advertised bid.bundle.
## What it means
AppLovin SKAdNetwork itunesitem must match advertised bid.bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "11",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "12345678-1234-1234-1234-123456789abc",
"signature": "signed-value",
"timestamp": "1700000000000"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_mismatch at seatbid[0].bid[0].ext.skadn.itunesitem.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork nonce must use UUID format. · openrtb.profile.applovin.skadn_nonce · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_nonce/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork nonce must use UUID format.
openrtb.profile.applovin.skadn_nonce error Bid response
AppLovin SKAdNetwork nonce must use UUID format.
## What it means
AppLovin SKAdNetwork nonce must use UUID format. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "not-uuid",
"signature": "signed-value",
"timestamp": "1700000000000"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_nonce at seatbid[0].bid[0].ext.skadn.fidelities[0].nonce.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork timestamp must be a decimal Unix timestamp in milliseconds, expressed as a string. · openrtb.profile.applovin.skadn_timestamp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_timestamp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork timestamp must be a decimal Unix timestamp in milliseconds, expressed as a string.
openrtb.profile.applovin.skadn_timestamp error Bid response
AppLovin SKAdNetwork timestamp must be a decimal Unix timestamp in milliseconds, expressed as a string.
## What it means
AppLovin SKAdNetwork timestamp must be a decimal Unix timestamp in milliseconds, expressed as a string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "3.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "12345678-1234-1234-1234-123456789abc",
"signature": "signed-value",
"timestamp": "tomorrow"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_timestamp at seatbid[0].bid[0].ext.skadn.fidelities[0].timestamp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# AppLovin SKAdNetwork version must be 2.0 or above. · openrtb.profile.applovin.skadn_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-applovin-skadn_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## AppLovin SKAdNetwork version must be 2.0 or above.
openrtb.profile.applovin.skadn_version error Bid response
AppLovin SKAdNetwork version must be 2.0 or above.
## What it means
AppLovin SKAdNetwork version must be 2.0 or above. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"bundle": "987654321",
"ext": {
"crtype": "HTML",
"clicktrackers": [
"https://click.example"
],
"skadn": {
"version": "1.0",
"network": "example.skadnetwork",
"campaign": "100",
"itunesitem": "987654321",
"sourceapp": "123456789",
"fidelities": [
{
"fidelity": 1,
"nonce": "12345678-1234-1234-1234-123456789abc",
"signature": "signed-value",
"timestamp": "1700000000000"
}
]
}
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.applovin.skadn_version at seatbid[0].bid[0].ext.skadn.version.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Audio format 3 needs either VAST or DAAST URL. · openrtb.profile.bidswitch.audio_url · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-audio_url/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Audio format 3 needs either VAST or DAAST URL.
openrtb.profile.bidswitch.audio_url error Request/response pair
Audio format 3 needs either VAST or DAAST URL.
## What it means
Audio format 3 needs either VAST or DAAST URL. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "r",
"imp": [
{
"id": "i",
"secure": 1,
"audio": {
"mimes": [
"audio/mpeg"
],
"protocols": [
9,
10
],
"ext": {
"format": 3
}
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Response:
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.audio_url at seatbid[0].bid[0].ext.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Buyer responses allow at most two bids per ad slot across all seats. · openrtb.profile.bidswitch.bid_count · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-bid_count/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Buyer responses allow at most two bids per ad slot across all seats.
openrtb.profile.bidswitch.bid_count error Bid response
Buyer responses allow at most two bids per ad slot across all seats.
## What it means
Buyer responses allow at most two bids per ad slot across all seats. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b0",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
},
{
"id": "b1",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
},
{
"id": "b2",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.bid_count at seatbid[0].bid[2].impid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The buyer billing URL must contain the win price macro. · openrtb.profile.bidswitch.billing_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-billing_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The buyer billing URL must contain the win price macro.
openrtb.profile.bidswitch.billing_macro error Bid response
The buyer billing URL must contain the win price macro.
## What it means
The buyer billing URL must contain the win price macro. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "https://buyer.example/bill",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.billing_macro at seatbid[0].bid[0].burl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Creative markup may contain the supplier click tracking macro at most once. · openrtb.profile.bidswitch.click_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-click_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Creative markup may contain the supplier click tracking macro at most once.
openrtb.profile.bidswitch.click_macro error Bid response
Creative markup may contain the supplier click tracking macro at most once.
## What it means
Creative markup may contain the supplier click tracking macro at most once. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "${CLICK_URL_ENC}${CLICK_URL_ENC}",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.click_macro at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# BidSwitch recommends adid or crid for creative review. · openrtb.profile.bidswitch.creative_id_recommended · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-creative_id_recommended/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## BidSwitch recommends adid or crid for creative review.
openrtb.profile.bidswitch.creative_id_recommended warning Bid response
BidSwitch recommends adid or crid for creative review.
## What it means
BidSwitch recommends adid or crid for creative review. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.creative_id_recommended at seatbid[0].bid[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Advertiser domains must use ASCII, including punycode for international domains. · openrtb.profile.bidswitch.domain_ascii · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-domain_ascii/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Advertiser domains must use ASCII, including punycode for international domains.
openrtb.profile.bidswitch.domain_ascii error Bid response
Advertiser domains must use ASCII, including punycode for international domains.
## What it means
Advertiser domains must use ASCII, including punycode for international domains. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"bücher.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.domain_ascii at seatbid[0].bid[0].adomain[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DSA names have a maximum of 100 characters. · openrtb.profile.bidswitch.dsa_name_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-dsa_name_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DSA names have a maximum of 100 characters.
openrtb.profile.bidswitch.dsa_name_length error Bid response
DSA names have a maximum of 100 characters.
## What it means
DSA names have a maximum of 100 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview",
"ext": {
"dsa": {
"behalf": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"paid": "payer"
}
}
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.dsa_name_length at seatbid[0].bid[0].ext.dsa.behalf.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The win price macro may appear once in adm and cannot appear in both adm and nurl. · openrtb.profile.bidswitch.impression_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-impression_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The win price macro may appear once in adm and cannot appear in both adm and nurl.
openrtb.profile.bidswitch.impression_macro error Bid response
The win price macro may appear once in adm and cannot appear in both adm and nurl.
## What it means
The win price macro may appear once in adm and cannot appear in both adm and nurl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "${AUCTION_PRICE}${AUCTION_PRICE}",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.impression_macro at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# A DOOH request cannot also contain site or app. · openrtb.profile.bidswitch.inventory_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-inventory_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A DOOH request cannot also contain site or app.
openrtb.profile.bidswitch.inventory_conflict error Bid request
A DOOH request cannot also contain site or app.
## What it means
A DOOH request cannot also contain site or app. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
},
"dooh": {
"publisher": {
"id": "pub"
}
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.inventory_conflict at dooh.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# BidSwitch requires a documented inventory context. · openrtb.profile.bidswitch.inventory_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-inventory_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## BidSwitch requires a documented inventory context.
openrtb.profile.bidswitch.inventory_required error Bid request
BidSwitch requires a documented inventory context.
## What it means
BidSwitch requires a documented inventory context. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.inventory_required.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Markup document URLs cannot contain the win price macro. · openrtb.profile.bidswitch.markup_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-markup_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Markup document URLs cannot contain the win price macro.
openrtb.profile.bidswitch.markup_macro error Bid response
Markup document URLs cannot contain the win price macro.
## What it means
Markup document URLs cannot contain the win price macro. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview",
"ext": {
"vast_url": "https://buyer.example/doc?p=${AUCTION_PRICE}"
}
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.markup_macro at seatbid[0].bid[0].ext.vast_url.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Buyer adm requires a declared protocol version of at least 4.0. · openrtb.profile.bidswitch.markup_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-markup_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Buyer adm requires a declared protocol version of at least 4.0.
openrtb.profile.bidswitch.markup_version error Bid response
Buyer adm requires a declared protocol version of at least 4.0.
## What it means
Buyer adm requires a declared protocol version of at least 4.0. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "3.0"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.markup_version at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Supplier native markup requires version 1.2. · openrtb.profile.bidswitch.native_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-native_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Supplier native markup requires version 1.2.
openrtb.profile.bidswitch.native_version error Bid request
Supplier native markup requires version 1.2.
## What it means
Supplier native markup requires version 1.2. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"secure": 1,
"native": {
"request_native": {
"ver": "1.1",
"assets": [
{
"id": 1,
"required": 1,
"title": {
"len": 40
}
}
]
}
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Profile bidswitch-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.native_version at imp[0].native.request_native.ver.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Server-to-server notification requests forbid the win price macro in adm. · openrtb.profile.bidswitch.s2s_markup_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-s2s_markup_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Server-to-server notification requests forbid the win price macro in adm.
openrtb.profile.bidswitch.s2s_markup_macro error Request/response pair
Server-to-server notification requests forbid the win price macro in adm.
## What it means
Server-to-server notification requests forbid the win price macro in adm. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
Request:
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1,
"ext": {
"s2s_nurl": 1
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Response:
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "${AUCTION_PRICE}",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.s2s_markup_macro at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# All bids from a buyer seat must be grouped into one SeatBid. · openrtb.profile.bidswitch.seat_unique · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-seat_unique/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## All bids from a buyer seat must be grouped into one SeatBid.
openrtb.profile.bidswitch.seat_unique error Bid response
All bids from a buyer seat must be grouped into one SeatBid.
## What it means
All bids from a buyer seat must be grouped into one SeatBid. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
},
{
"seat": "buyer",
"bid": [
{
"id": "b2",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.seat_unique at seatbid[1].seat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Browser win notifications on secure inventory require HTTPS. · openrtb.profile.bidswitch.secure_notification · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-secure_notification/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Browser win notifications on secure inventory require HTTPS.
openrtb.profile.bidswitch.secure_notification error Request/response pair
Browser win notifications on secure inventory require HTTPS.
## What it means
Browser win notifications on secure inventory require HTTPS. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1,
"ext": {
"s2s_nurl": 0
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Response:
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"adm": "Example
",
"iurl": "https://buyer.example/preview",
"nurl": "http://buyer.example/win"
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.secure_notification at seatbid[0].bid[0].nurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# BidSwitch user identifiers have a maximum of 50 characters. · openrtb.profile.bidswitch.user_id_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-user_id_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## BidSwitch user identifiers have a maximum of 50 characters.
openrtb.profile.bidswitch.user_id_length error Bid request
BidSwitch user identifiers have a maximum of 50 characters.
## What it means
BidSwitch user identifiers have a maximum of 50 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {
"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.user_id_length at user.id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The extension value is outside the BidSwitch documented set. · openrtb.profile.bidswitch.value_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-value_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The extension value is outside the BidSwitch documented set.
openrtb.profile.bidswitch.value_invalid error Bid request
The extension value is outside the BidSwitch documented set.
## What it means
The extension value is outside the BidSwitch documented set. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
},
"secure": 1,
"ext": {
"ae": 2
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.value_invalid at imp[0].ext.ae.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Video bids need ext.vast_url or the documented nurl fallback. · openrtb.profile.bidswitch.video_url · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-bidswitch-video_url/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Video bids need ext.vast_url or the documented nurl fallback.
openrtb.profile.bidswitch.video_url error Request/response pair
Video bids need ext.vast_url or the documented nurl fallback.
## What it means
Video bids need ext.vast_url or the documented nurl fallback. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "r",
"imp": [
{
"id": "i",
"secure": 1,
"video": {
"mimes": [
"video/mp4"
],
"minduration": 1,
"maxduration": 30,
"protocols": [
6,
8
],
"ext": {
"vast_url_rq": 0
}
}
}
],
"device": {
"ip": "203.0.113.2",
"geo": {
"country": "USA"
}
},
"site": {
"id": "site",
"domain": "publisher.example",
"publisher": {
"id": "pub"
}
},
"user": {},
"tmax": 120,
"cur": [
"USD"
],
"ext": {
"ssp": "example",
"media_src": "example"
}
}
Response:
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"burl": "http://buyer.example/bill?p=${AUCTION_PRICE}",
"adomain": [
"advertiser.example"
],
"crid": "creative",
"iurl": "https://buyer.example/preview",
"protocol": 6
}
]
}
],
"ext": {
"protocol": "5.7"
}
}
Profile bidswitch, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.bidswitch.video_url at seatbid[0].bid[0].ext.vast_url.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid requires banner formats, even for a single size. · openrtb.profile.commerce_grid.banner_format · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-banner_format/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid requires banner formats, even for a single size.
openrtb.profile.commerce_grid.banner_format error Bid request
Commerce Grid requires banner formats, even for a single size.
## What it means
Commerce Grid requires banner formats, even for a single size. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "grid-request",
"cur": [
"USD"
],
"site": {
"publisher": {
"id": "pub"
}
},
"user": {
"buyeruid": "criteo-user"
},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
}
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"banner": {
"w": 300,
"h": 250,
"format": []
}
}
]
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.banner_format at imp[0].banner.format.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid requires at least one allowed bid currency. · openrtb.profile.commerce_grid.currency_offer · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-currency_offer/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid requires at least one allowed bid currency.
openrtb.profile.commerce_grid.currency_offer error Bid request
Commerce Grid requires at least one allowed bid currency.
## What it means
Commerce Grid requires at least one allowed bid currency. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "grid-request",
"cur": [],
"site": {
"publisher": {
"id": "pub"
}
},
"user": {
"buyeruid": "criteo-user"
},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
}
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"banner": {
"w": 300,
"h": 250,
"format": [
{
"w": 300,
"h": 250
}
]
}
}
]
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.currency_offer at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid accepts only one of wlang and wlangb. · openrtb.profile.commerce_grid.language_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-language_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid accepts only one of wlang and wlangb.
openrtb.profile.commerce_grid.language_conflict error Bid request
Commerce Grid accepts only one of wlang and wlangb.
## What it means
Commerce Grid accepts only one of wlang and wlangb. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "grid-request",
"cur": [
"USD"
],
"site": {
"publisher": {
"id": "pub"
}
},
"user": {
"buyeruid": "criteo-user"
},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
}
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"banner": {
"w": 300,
"h": 250,
"format": [
{
"w": 300,
"h": 250
}
]
}
}
],
"wlang": [
"en"
],
"wlangb": [
"en-US"
]
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.language_conflict at wlangb.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid metric values must be between 0 and 1. · openrtb.profile.commerce_grid.metric_value · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-metric_value/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid metric values must be between 0 and 1.
openrtb.profile.commerce_grid.metric_value error Bid request
Commerce Grid metric values must be between 0 and 1.
## What it means
Commerce Grid metric values must be between 0 and 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "grid-request",
"cur": [
"USD"
],
"site": {
"publisher": {
"id": "pub"
}
},
"user": {
"buyeruid": "criteo-user"
},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
}
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"banner": {
"w": 300,
"h": 250,
"format": [
{
"w": 300,
"h": 250
}
]
},
"metric": [
{
"type": "viewability",
"value": 1.1,
"vendor": "example"
}
]
}
]
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.metric_value at imp[0].metric[0].value.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid native requests require privacy 1. · openrtb.profile.commerce_grid.native_privacy · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-native_privacy/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid native requests require privacy 1.
openrtb.profile.commerce_grid.native_privacy error Bid request
Commerce Grid native requests require privacy 1.
## What it means
Commerce Grid native requests require privacy 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "grid-request",
"cur": [
"USD"
],
"site": {
"publisher": {
"id": "pub"
}
},
"user": {
"buyeruid": "criteo-user"
},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
}
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"native": "{\"ver\": \"1.2\", \"privacy\": 0, \"assets\": [{\"id\": 1, \"required\": 1, \"title\": {\"len\": 25}}]}"
}
]
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.native_privacy at imp[0].native.privacy.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Commerce Grid SKAdNetwork sourceapp must match publisher app.bundle. · openrtb.profile.commerce_grid.skadn_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-commerce_grid-skadn_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Commerce Grid SKAdNetwork sourceapp must match publisher app.bundle.
openrtb.profile.commerce_grid.skadn_mismatch error Bid request
Commerce Grid SKAdNetwork sourceapp must match publisher app.bundle.
## What it means
Commerce Grid SKAdNetwork sourceapp must match publisher app.bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "grid-request",
"cur": [
"USD"
],
"user": {},
"device": {
"ua": "ua",
"ip": "203.0.113.2",
"dnt": 0,
"lmt": 0,
"geo": {
"country": "USA"
},
"os": "iOS",
"ifa": "00000000-0000-0000-0000-000000000000"
},
"source": {
"ext": {
"sourcetype": 1,
"sourceorigin": 1
},
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "seller.example",
"sid": "pub",
"hp": 1
}
]
}
},
"imp": [
{
"id": "1",
"instl": 0,
"banner": {
"w": 300,
"h": 250,
"format": [
{
"w": 300,
"h": 250
}
]
},
"displaymanager": "SDK",
"displaymanagerver": "1.0",
"clickbrowser": 0,
"rwdd": 0,
"ext": {
"skadn": {
"version": "3.0",
"sourceapp": "987654321",
"skadnetids": [
"example.skadnetwork"
]
}
}
}
],
"app": {
"bundle": "123456789"
}
}
Profile commerce-grid, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.commerce_grid.skadn_mismatch at imp[0].ext.skadn.sourceapp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT supply chain needs at least one node. · openrtb.profile.digital_turbine.array_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-array_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT supply chain needs at least one node.
openrtb.profile.digital_turbine.array_empty error Bid request
DT supply chain needs at least one node.
## What it means
DT supply chain needs at least one node. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": []
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"autostore": 1
}
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.array_empty at source.ext.schain.nodes.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT display Auto Store and SKOverlay click firing needs a nonempty tracker list. · openrtb.profile.digital_turbine.clicktrackers · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-clicktrackers/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT display Auto Store and SKOverlay click firing needs a nonempty tracker list.
openrtb.profile.digital_turbine.clicktrackers error Bid response
DT display Auto Store and SKOverlay click firing needs a nonempty tracker list.
## What it means
DT display Auto Store and SKOverlay click firing needs a nonempty tracker list. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"autostore": 1,
"autostoreclick": 1,
"clicktrackers": []
},
"bundle": "123"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.clicktrackers at seatbid[0].bid[0].ext.clicktrackers.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT ext.crtype must identify the creative type when supplied. · openrtb.profile.digital_turbine.creative_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-creative_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT ext.crtype must identify the creative type when supplied.
openrtb.profile.digital_turbine.creative_type error Bid response
DT ext.crtype must identify the creative type when supplied.
## What it means
DT ext.crtype must identify the creative type when supplied. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"cid": "campaign-1",
"attr": [],
"ext": {
"crtype": ""
}
}
],
"seat": "buyer-seat"
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.creative_type at seatbid[0].bid[0].ext.crtype.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT supports only USD. · openrtb.profile.digital_turbine.currency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT supports only USD.
openrtb.profile.digital_turbine.currency error Bid response
DT supports only USD.
## What it means
DT supports only USD. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"cid": "campaign-1",
"attr": [],
"ext": {
"crtype": "HTML"
}
}
],
"seat": "buyer-seat"
}
],
"cur": "EUR"
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.currency at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT response dealid must reference a deal in the matched impression. · openrtb.profile.digital_turbine.deal_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-deal_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT response dealid must reference a deal in the matched impression.
openrtb.profile.digital_turbine.deal_mismatch error Request/response pair
DT response dealid must reference a deal in the matched impression.
## What it means
DT response dealid must reference a deal in the matched impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"autostore": 1
}
},
"pmp": {
"private_auction": 0,
"deals": [
{
"id": "deal1",
"bidfloor": 0.1,
"at": 3,
"wseat": [
"buyer"
]
}
]
}
}
]
}
Response:
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML"
},
"dealid": "deal2"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.deal_mismatch at seatbid[0].bid[0].dealid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT reports its app framework as unity or native. · openrtb.profile.digital_turbine.framework · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-framework/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT reports its app framework as unity or native.
openrtb.profile.digital_turbine.framework error Bid request
DT reports its app framework as unity or native.
## What it means
DT reports its app framework as unity or native. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "other",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"autostore": 1
}
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.framework at app.ext.fmwname.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT supports AUCTION_MIN_TO_WIN only in nurl. · openrtb.profile.digital_turbine.macro_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-macro_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT supports AUCTION_MIN_TO_WIN only in nurl.
openrtb.profile.digital_turbine.macro_context error Bid response
DT supports AUCTION_MIN_TO_WIN only in nurl.
## What it means
DT supports AUCTION_MIN_TO_WIN only in nurl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://events.example/?p=${AUCTION_PRICE}&m=${AUCTION_MIN_TO_WIN}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"cid": "campaign-1",
"attr": [],
"ext": {
"crtype": "HTML"
}
}
],
"seat": "buyer-seat"
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.macro_context at seatbid[0].bid[0].burl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT Native producer asset IDs 1 through 7 identify title, main image, video, icon, description, rating and CTA respectively. · openrtb.profile.digital_turbine.native_asset · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-native_asset/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT Native producer asset IDs 1 through 7 identify title, main image, video, icon, description, rating and CTA respectively.
openrtb.profile.digital_turbine.native_asset error Bid request
DT Native producer asset IDs 1 through 7 identify title, main image, video, icon, description, rating and CTA respectively.
## What it means
DT Native producer asset IDs 1 through 7 identify title, main image, video, icon, description, rating and CTA respectively. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"native": {
"ver": "1.2",
"request": "{\"ver\": \"1.2\", \"context\": 1, \"contextsubtype\": 10, \"plcmttype\": 1, \"plcmtcnt\": 1, \"seq\": 0, \"eventtrackers\": [{\"event\": 1, \"methods\": [1, 2]}], \"assets\": [{\"id\": 8, \"required\": 1, \"title\": {\"len\": 90}}, {\"id\": 2, \"img\": {\"type\": 3, \"wmin\": 1200, \"hmin\": 627, \"mimes\": [\"image/png\"]}}, {\"id\": 3, \"video\": {\"mimes\": [\"video/mp4\"], \"minduration\": 0, \"maxduration\": 60, \"protocols\": [2, 3, 5, 6, 7, 8]}}, {\"id\": 4, \"img\": {\"type\": 1, \"wmin\": 100, \"hmin\": 100}}, {\"id\": 5, \"data\": {\"type\": 2, \"len\": 90}}, {\"id\": 6, \"data\": {\"type\": 3, \"len\": 5}}, {\"id\": 7, \"data\": {\"type\": 12, \"len\": 15}}]}"
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.native_asset at imp[0].native.request.assets[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT Native requests use version 1.2. · openrtb.profile.digital_turbine.native_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-native_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT Native requests use version 1.2.
openrtb.profile.digital_turbine.native_version error Bid request
DT Native requests use version 1.2.
## What it means
DT Native requests use version 1.2. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"native": {
"ver": "1.2",
"request": "{\"ver\": \"1.1\", \"context\": 1, \"contextsubtype\": 10, \"plcmttype\": 1, \"plcmtcnt\": 1, \"seq\": 0, \"eventtrackers\": [{\"event\": 1, \"methods\": [1, 2]}], \"assets\": [{\"id\": 1, \"required\": 1, \"title\": {\"len\": 90}}, {\"id\": 2, \"img\": {\"type\": 3, \"wmin\": 1200, \"hmin\": 627, \"mimes\": [\"image/png\"]}}, {\"id\": 3, \"video\": {\"mimes\": [\"video/mp4\"], \"minduration\": 0, \"maxduration\": 60, \"protocols\": [2, 3, 5, 6, 7, 8]}}, {\"id\": 4, \"img\": {\"type\": 1, \"wmin\": 100, \"hmin\": 100}}, {\"id\": 5, \"data\": {\"type\": 2, \"len\": 90}}, {\"id\": 6, \"data\": {\"type\": 3, \"len\": 5}}, {\"id\": 7, \"data\": {\"type\": 12, \"len\": 15}}]}"
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.native_version at imp[0].native.request.ver.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT user percentages range from 0 through 100. · openrtb.profile.digital_turbine.percentage · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-percentage/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT user percentages range from 0 through 100.
openrtb.profile.digital_turbine.percentage error Bid request
DT user percentages range from 0 through 100.
## What it means
DT user percentages range from 0 through 100. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": -1,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"autostore": 1
}
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.percentage at user.ext.completionrate.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT Rewarded Playable responses require creative attribute 13. · openrtb.profile.digital_turbine.playable_attr · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-playable_attr/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT Rewarded Playable responses require creative attribute 13.
openrtb.profile.digital_turbine.playable_attr error Request/response pair
DT Rewarded Playable responses require creative attribute 13.
## What it means
DT Rewarded Playable responses require creative attribute 13. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 1,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 1,
"autostore": 1
}
}
}
]
}
Response:
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "Playable"
}
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.playable_attr at seatbid[0].bid[0].attr.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT requires AUCTION_PRICE in nurl, burl or an adm tracking pixel. · openrtb.profile.digital_turbine.price_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-price_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT requires AUCTION_PRICE in nurl, burl or an adm tracking pixel.
openrtb.profile.digital_turbine.price_macro error Bid response
DT requires AUCTION_PRICE in nurl, burl or an adm tracking pixel.
## What it means
DT requires AUCTION_PRICE in nurl, burl or an adm tracking pixel. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bill.example/",
"cat": [
"IAB9"
],
"crid": "creative-1",
"cid": "campaign-1",
"attr": [],
"ext": {
"crtype": "HTML"
}
}
],
"seat": "buyer-seat"
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.price_macro at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT producer field contains a value outside its documented emitted subset. · openrtb.profile.digital_turbine.producer_value · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-producer_value/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT producer field contains a value outside its documented emitted subset.
openrtb.profile.digital_turbine.producer_value error Bid request
DT producer field contains a value outside its documented emitted subset.
## What it means
DT producer field contains a value outside its documented emitted subset. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"Puzzle"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 1,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"video": {
"mimes": [
"video/mp4"
],
"minduration": 0,
"maxduration": 30,
"protocols": [
1
],
"w": 640,
"h": 360,
"startdelay": 0,
"placement": 5,
"plcmt": 3,
"linearity": 1,
"skip": 1,
"battr": [],
"playbackmethod": [
5
],
"playbackend": 1,
"pos": 7,
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"mraidendcard": 1,
"autostore": 1,
"dualendcard": 0,
"dspdualendcard": false
}
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.producer_value at imp[0].video.protocols[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT SKAdNetwork 2 and 3 campaign ranges 1 through 100. · openrtb.profile.digital_turbine.skadn_campaign · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_campaign/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT SKAdNetwork 2 and 3 campaign ranges 1 through 100.
openrtb.profile.digital_turbine.skadn_campaign error Bid response
DT SKAdNetwork 2 and 3 campaign ranges 1 through 100.
## What it means
DT SKAdNetwork 2 and 3 campaign ranges 1 through 100. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "3.0",
"network": "test.skadnetwork",
"campaign": "0",
"itunesitem": "2002",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "11111111-1111-1111-1111-111111111111",
"timestamp": "1700000000000",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_campaign at seatbid[0].bid[0].ext.skadn.campaign.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT request SKAdNetwork sourceapp must match app.bundle. · openrtb.profile.digital_turbine.skadn_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT request SKAdNetwork sourceapp must match app.bundle.
openrtb.profile.digital_turbine.skadn_mismatch error Bid response
DT request SKAdNetwork sourceapp must match app.bundle.
## What it means
DT request SKAdNetwork sourceapp must match app.bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "3.0",
"network": "test.skadnetwork",
"campaign": "50",
"itunesitem": "other",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "11111111-1111-1111-1111-111111111111",
"timestamp": "1700000000000",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_mismatch at seatbid[0].bid[0].ext.skadn.itunesitem.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT attribution nonce must be a UUID string. · openrtb.profile.digital_turbine.skadn_nonce · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_nonce/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT attribution nonce must be a UUID string.
openrtb.profile.digital_turbine.skadn_nonce error Bid response
DT attribution nonce must be a UUID string.
## What it means
DT attribution nonce must be a UUID string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "3.0",
"network": "test.skadnetwork",
"campaign": "50",
"itunesitem": "2002",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "bad",
"timestamp": "1700000000000",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_nonce at seatbid[0].bid[0].ext.skadn.fidelities[0].nonce.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT SKAdNetwork 4 sourceidentifier is a four-digit string from 0001 through 9999. · openrtb.profile.digital_turbine.skadn_sourceidentifier · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_sourceidentifier/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT SKAdNetwork 4 sourceidentifier is a four-digit string from 0001 through 9999.
openrtb.profile.digital_turbine.skadn_sourceidentifier error Bid response
DT SKAdNetwork 4 sourceidentifier is a four-digit string from 0001 through 9999.
## What it means
DT SKAdNetwork 4 sourceidentifier is a four-digit string from 0001 through 9999. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "4.0",
"network": "test.skadnetwork",
"campaign": "50",
"itunesitem": "2002",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "11111111-1111-1111-1111-111111111111",
"timestamp": "1700000000000",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page",
"sourceidentifier": "1"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_sourceidentifier at seatbid[0].bid[0].ext.skadn.sourceidentifier.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT attribution timestamp must be a decimal Unix millisecond string. · openrtb.profile.digital_turbine.skadn_timestamp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_timestamp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT attribution timestamp must be a decimal Unix millisecond string.
openrtb.profile.digital_turbine.skadn_timestamp error Bid response
DT attribution timestamp must be a decimal Unix millisecond string.
## What it means
DT attribution timestamp must be a decimal Unix millisecond string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "3.0",
"network": "test.skadnetwork",
"campaign": "50",
"itunesitem": "2002",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "11111111-1111-1111-1111-111111111111",
"timestamp": "1.5",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_timestamp at seatbid[0].bid[0].ext.skadn.fidelities[0].timestamp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT supports SKAdNetwork 2.0 and later. · openrtb.profile.digital_turbine.skadn_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-skadn_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT supports SKAdNetwork 2.0 and later.
openrtb.profile.digital_turbine.skadn_version error Bid response
DT supports SKAdNetwork 2.0 and later.
## What it means
DT supports SKAdNetwork 2.0 and later. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"skadn": {
"version": "1.0",
"network": "test.skadnetwork",
"campaign": "50",
"itunesitem": "2002",
"sourceapp": "1001",
"fidelities": [
{
"fidelity": 1,
"nonce": "11111111-1111-1111-1111-111111111111",
"timestamp": "1700000000000",
"signature": "signature"
}
],
"skoverlay": {
"present": 1,
"dismissible": 1,
"delay": 0,
"pos": 0,
"endcarddelay": -1,
"autoclose": 60,
"autoclick": 0,
"landpageclick": 0,
"landpagedelay": -1
},
"productpageid": "page"
}
},
"bundle": "2002"
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.skadn_version at seatbid[0].bid[0].ext.skadn.version.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT sources give conflicting, conditional or optional presence guidance; verify this field against your integration. · openrtb.profile.digital_turbine.source_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-source_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT sources give conflicting, conditional or optional presence guidance; verify this field against your integration.
openrtb.profile.digital_turbine.source_conflict warning Bid response
DT sources give conflicting, conditional or optional presence guidance; verify this field against your integration.
## What it means
DT sources give conflicting, conditional or optional presence guidance; verify this field against your integration. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"crid": "creative-1",
"cid": "campaign-1",
"attr": [],
"ext": {
"crtype": "HTML"
}
}
],
"seat": "buyer-seat"
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.source_conflict at seatbid[0].bid[0].cat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT caps store subcategories at three strings. · openrtb.profile.digital_turbine.store_categories · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-store_categories/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT caps store subcategories at three strings.
openrtb.profile.digital_turbine.store_categories error Bid request
DT caps store subcategories at three strings.
## What it means
DT caps store subcategories at three strings. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"bcat": [],
"badv": [],
"bapp": [],
"source": {
"fd": 0,
"tid": "transaction",
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "fyber.com",
"sid": "seller",
"hp": 1
}
]
},
"omidpn": "DT",
"omidpv": "1.0"
}
},
"regs": {
"coppa": 0,
"ext": {
"gdpr": 0,
"us_privacy": "1---",
"gpp": "",
"gpp_sid": [
2,
6
]
}
},
"app": {
"id": "app",
"name": "App",
"bundle": "publisher.example",
"cat": [
"IAB9"
],
"ver": "1.0",
"privacypolicy": 1,
"publisher": {
"id": "seller",
"name": "Publisher"
},
"ext": {
"storecat": "Games",
"storesubcat": [
"a",
"b",
"c",
"d"
],
"fmwname": "native",
"apilevel": 35
}
},
"device": {
"ua": "Mozilla/5.0",
"dnt": 0,
"ip": "192.0.2.1",
"devicetype": 4,
"h": 1920,
"w": 1080,
"js": 1,
"language": "en",
"connectiontype": 2,
"geo": {
"country": "USA"
},
"ext": {
"headset": 0,
"atts": 3,
"inputlanguage": [
"en"
],
"ifv": "idfv",
"diskspace": 1,
"totaldisk": 2,
"ringmute": 0,
"charging": 1,
"bluetooth": 0,
"batterylevel": 8,
"batterysaver": 0,
"darkmode": 1,
"airplane": 0,
"dnd": 0
}
},
"user": {
"ext": {
"consent": "",
"impdepth": 2,
"sessionduration": 10,
"lastbundle": "last.app",
"lastadomain": "last.example",
"clickrate": 5,
"lastclick": 0,
"lastclicktype": 0,
"completionrate": 70,
"eids": [
{
"source": "id.example",
"uids": [
{
"id": "user",
"atype": 1
}
]
}
]
}
},
"imp": [
{
"id": "1",
"displaymanager": "DT",
"displaymanagerver": "1.0",
"instl": 0,
"tagid": "placement",
"bidfloor": 0.1,
"bidfloorcur": "USD",
"clickbrowser": 0,
"secure": 0,
"exp": 1800,
"rwdd": 0,
"ext": {
"brsrclk": 0,
"dpl": 1
},
"banner": {
"id": "banner",
"w": 320,
"h": 50,
"btype": [],
"battr": [],
"pos": 1,
"topframe": 0,
"mimes": [
"text/html"
],
"api": [
3,
5,
7
],
"ext": {
"rewarded": 0,
"autostore": 1
}
}
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.store_categories at app.ext.storesubcat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT Auto Store requires a store listing ID in bundle or SKAdNetwork itunesitem. · openrtb.profile.digital_turbine.store_id · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-digital_turbine-store_id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT Auto Store requires a store listing ID in bundle or SKAdNetwork itunesitem.
openrtb.profile.digital_turbine.store_id error Bid response
DT Auto Store requires a store listing ID in bundle or SKAdNetwork itunesitem.
## What it means
DT Auto Store requires a store listing ID in bundle or SKAdNetwork itunesitem. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "dt-auction",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"cid": "campaign",
"crid": "creative",
"cat": [
"IAB9"
],
"attr": [],
"burl": "https://bill.example/?price=${AUCTION_PRICE}",
"ext": {
"crtype": "HTML",
"autostore": 1
}
}
]
}
]
}
Profile digital-turbine, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.digital_turbine.store_id at seatbid[0].bid[0].bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 always includes adm for banner bids. · openrtb.profile.dv360.banner_markup · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-banner_markup/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 always includes adm for banner bids.
openrtb.profile.dv360.banner_markup error Bid response
DV360 always includes adm for banner bids.
## What it means
DV360 always includes adm for banner bids. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adomain": [
"advertiser.example"
],
"mtype": 1
}
]
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.banner_markup at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 deal IDs must be unique within an impression. · openrtb.profile.dv360.duplicate_deal · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-duplicate_deal/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 deal IDs must be unique within an impression.
openrtb.profile.dv360.duplicate_deal error Bid request
DV360 deal IDs must be unique within an impression.
## What it means
DV360 deal IDs must be unique within an impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"pmp": {
"deals": [
{
"id": "deal"
},
{
"id": "deal"
}
]
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.duplicate_deal at imp[0].pmp.deals[1].id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# disable_gma_format is permitted only with gdemsignals. · openrtb.profile.dv360.gma_dependency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-gma_dependency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## disable_gma_format is permitted only with gdemsignals.
openrtb.profile.dv360.gma_dependency error Bid request
disable_gma_format is permitted only with gdemsignals.
## What it means
disable_gma_format is permitted only with gdemsignals. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"ext": {
"disable_gma_format": 1
}
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.gma_dependency at ext.disable_gma_format.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 parses the field but does not use it for bidding. · openrtb.profile.dv360.ignored_field · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-ignored_field/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 parses the field but does not use it for bidding.
openrtb.profile.dv360.ignored_field warning Bid request
DV360 parses the field but does not use it for bidding.
## What it means
DV360 parses the field but does not use it for bidding. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"test": 0
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.ignored_field at test.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 sound-off playback must be classified as outstream. · openrtb.profile.dv360.instream_sound · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-instream_sound/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 sound-off playback must be classified as outstream.
openrtb.profile.dv360.instream_sound error Bid request
DV360 sound-off playback must be classified as outstream.
## What it means
DV360 sound-off playback must be classified as outstream. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"protocols": [
3
],
"plcmt": 1,
"playbackmethod": [
2
]
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.instream_sound at imp[0].video.playbackmethod.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 requests require site or app inventory. · openrtb.profile.dv360.inventory_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-inventory_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 requests require site or app inventory.
openrtb.profile.dv360.inventory_required error Bid request
DV360 requests require site or app inventory.
## What it means
DV360 requests require site or app inventory. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.inventory_required at site.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 iOS app bundles must be numeric App Store IDs. · openrtb.profile.dv360.ios_bundle · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-ios_bundle/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 iOS app bundles must be numeric App Store IDs.
openrtb.profile.dv360.ios_bundle error Bid request
DV360 iOS app bundles must be numeric App Store IDs.
## What it means
DV360 iOS app bundles must be numeric App Store IDs. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1",
"os": "iOS"
},
"user": {},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"app": {
"bundle": "com.example.app"
}
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.ios_bundle at app.bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 requires the device IPv4 or IPv6 address. · openrtb.profile.dv360.ip_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-ip_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 requires the device IPv4 or IPv6 address.
openrtb.profile.dv360.ip_required error Bid request
DV360 requires the device IPv4 or IPv6 address.
## What it means
DV360 requires the device IPv4 or IPv6 address. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.ip_required at device.ip.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 supports Native Ads 1.2; versions 1.0 and 1.1 are unsupported. · openrtb.profile.dv360.native_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-native_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 supports Native Ads 1.2; versions 1.0 and 1.1 are unsupported.
openrtb.profile.dv360.native_version error Bid request
DV360 supports Native Ads 1.2; versions 1.0 and 1.1 are unsupported.
## What it means
DV360 supports Native Ads 1.2; versions 1.0 and 1.1 are unsupported. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "Browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"native": {
"request": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1, \"title\": {\"len\": 50}}]}",
"ver": "1.0"
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.native_version at imp[0].native.ver.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 expects one US Privacy signal location. · openrtb.profile.dv360.privacy_locations · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-privacy_locations/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 expects one US Privacy signal location.
openrtb.profile.dv360.privacy_locations warning Bid request
DV360 expects one US Privacy signal location.
## What it means
DV360 expects one US Privacy signal location. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
],
"regs": {
"gdpr": 0,
"ext": {
"gdpr": 0
}
}
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.privacy_locations at regs.ext.gdpr.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 video requires a nonempty supported protocol list. · openrtb.profile.dv360.protocols_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-protocols_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 video requires a nonempty supported protocol list.
openrtb.profile.dv360.protocols_required error Bid request
DV360 video requires a nonempty supported protocol list.
## What it means
DV360 video requires a nonempty supported protocol list. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"protocols": []
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.protocols_required at imp[0].video.protocols.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DV360 requires SupplyChain in almost all integrations; an exemption needs account context. · openrtb.profile.dv360.schain_expected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-dv360-schain_expected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DV360 requires SupplyChain in almost all integrations; an exemption needs account context.
openrtb.profile.dv360.schain_expected warning Bid request
DV360 requires SupplyChain in almost all integrations; an exemption needs account context.
## What it means
DV360 requires SupplyChain in almost all integrations; an exemption needs account context. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile dv360, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.dv360.schain_expected at source.schain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Equativ App table marks bundle required, but its parent description strongly recommends App ID or Bundle ID. Missing bundle is advisory while these source requirements conflict. · openrtb.profile.equativ.app_identity_advisory · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-app_identity_advisory/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Equativ App table marks bundle required, but its parent description strongly recommends App ID or Bundle ID. Missing bundle is advisory while these source requirements conflict.
openrtb.profile.equativ.app_identity_advisory warning Bid request
The Equativ App table marks bundle required, but its parent description strongly recommends App ID or Bundle ID. Missing bundle is advisory while these source requirements conflict.
## What it means
The Equativ App table marks bundle required, but its parent description strongly recommends App ID or Bundle ID. Missing bundle is advisory while these source requirements conflict. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
}
],
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
},
"app": {
"publisher": {
"id": "1234"
}
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.app_identity_advisory at app.bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ supplier responses contain at most ten bid objects. · openrtb.profile.equativ.bid_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-bid_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ supplier responses contain at most ten bid objects.
openrtb.profile.equativ.bid_limit error Bid response
Equativ supplier responses contain at most ten bid objects.
## What it means
Equativ supplier responses contain at most ten bid objects. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b0",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b1",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b2",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b3",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b4",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b5",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b6",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b7",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b8",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b9",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
},
{
"id": "b10",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
}
]
}
]
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.bid_limit at seatbid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ dealtype must be one of its four documented strings. · openrtb.profile.equativ.deal_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-deal_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ dealtype must be one of its four documented strings.
openrtb.profile.equativ.deal_type error Bid response
Equativ dealtype must be one of its four documented strings.
## What it means
Equativ dealtype must be one of its four documented strings. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250
}
]
}
],
"ext": {
"dealtype": "OtherDeal"
}
}
Profile equativ, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.deal_type at ext.dealtype.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Publisher directpay can be sent only once in a request. · openrtb.profile.equativ.directpay_once · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-directpay_once/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Publisher directpay can be sent only once in a request.
openrtb.profile.equativ.directpay_once error Bid request
Publisher directpay can be sent only once in a request.
## What it means
Publisher directpay can be sent only once in a request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234",
"ext": {
"directpay": true
}
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
},
"app": {
"bundle": "com.example",
"publisher": {
"id": "1234",
"ext": {
"directpay": false
}
}
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.directpay_once.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ DSA advertiser and payer names have a maximum of 100 Unicode characters. · openrtb.profile.equativ.dsa_name_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-dsa_name_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ DSA advertiser and payer names have a maximum of 100 Unicode characters.
openrtb.profile.equativ.dsa_name_length error Bid response
Equativ DSA advertiser and payer names have a maximum of 100 Unicode characters.
## What it means
Equativ DSA advertiser and payer names have a maximum of 100 Unicode characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "b",
"impid": "i",
"price": 1.2,
"adm": "Example
",
"w": 300,
"h": 250,
"ext": {
"dsa": {
"behalf": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé",
"paid": "payer"
}
}
}
]
}
]
}
Profile equativ, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.dsa_name_length at seatbid[0].bid[0].ext.dsa.behalf.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ accepts at most ten impression objects in a supplier request. · openrtb.profile.equativ.impression_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-impression_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ accepts at most ten impression objects in a supplier request.
openrtb.profile.equativ.impression_limit error Bid request
Equativ accepts at most ten impression objects in a supplier request.
## What it means
Equativ accepts at most ten impression objects in a supplier request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i0",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i1",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i2",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i3",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i4",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i5",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i6",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i7",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i8",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i9",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i10",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.impression_limit at imp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ prioritizes the mainline field when both mainline and legacy values are present. · openrtb.profile.equativ.mainline_precedence · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-mainline_precedence/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ prioritizes the mainline field when both mainline and legacy values are present.
openrtb.profile.equativ.mainline_precedence warning Bid request
Equativ prioritizes the mainline field when both mainline and legacy values are present.
## What it means
Equativ prioritizes the mainline field when both mainline and legacy values are present. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
},
"regs": {
"ext": {
"gdpr": 0
},
"gdpr": 0
}
}
Profile equativ, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.mainline_precedence at regs.ext.gdpr.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ processes only the first non-instream impression when placement tag IDs are missing or differ. Unified requests also require account activation. · openrtb.profile.equativ.mio_first_only · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-mio_first_only/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ processes only the first non-instream impression when placement tag IDs are missing or differ. Unified requests also require account activation.
openrtb.profile.equativ.mio_first_only warning Bid request
Equativ processes only the first non-instream impression when placement tag IDs are missing or differ. Unified requests also require account activation.
## What it means
Equativ processes only the first non-instream impression when placement tag IDs are missing or differ. Unified requests also require account activation. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"banner": {
"w": 300,
"h": 250
}
},
{
"id": "i2",
"banner": {
"w": 300,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.mio_first_only at imp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Supplier requests must provide the Equativ network identifier through publisher.id or the configured ext.network_id method. · openrtb.profile.equativ.network_id · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-network_id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Supplier requests must provide the Equativ network identifier through publisher.id or the configured ext.network_id method.
openrtb.profile.equativ.network_id error Bid request
Supplier requests must provide the Equativ network identifier through publisher.id or the configured ext.network_id method.
## What it means
Supplier requests must provide the Equativ network identifier through publisher.id or the configured ext.network_id method. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"banner": {
"w": 300,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page"
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.network_id at ext.network_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Equativ guide marks video.ext.rewarded obsolete and recommends imp.rwdd. Current 2.6 acceptance is not promised. · openrtb.profile.equativ.obsolete_rewarded · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-obsolete_rewarded/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Equativ guide marks video.ext.rewarded obsolete and recommends imp.rwdd. Current 2.6 acceptance is not promised.
openrtb.profile.equativ.obsolete_rewarded warning Bid request
The Equativ guide marks video.ext.rewarded obsolete and recommends imp.rwdd. Current 2.6 acceptance is not promised.
## What it means
The Equativ guide marks video.ext.rewarded obsolete and recommends imp.rwdd. Current 2.6 acceptance is not promised. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"video": {
"mimes": [
"video/mp4"
],
"plcmt": 1,
"protocols": [
6,
8
],
"ext": {
"rewarded": 1
}
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.obsolete_rewarded at imp[0].video.ext.rewarded.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ requires video placement information. Modern plcmt or documented legacy placement supplies it. · openrtb.profile.equativ.video_placement · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-video_placement/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ requires video placement information. Modern plcmt or documented legacy placement supplies it.
openrtb.profile.equativ.video_placement error Bid request
Equativ requires video placement information. Modern plcmt or documented legacy placement supplies it.
## What it means
Equativ requires video placement information. Modern plcmt or documented legacy placement supplies it. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"video": {
"mimes": [
"video/mp4"
],
"protocols": [
6,
8
]
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.video_placement at imp[0].video.plcmt.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Equativ ignores requests with an explicitly zero width or height. · openrtb.profile.equativ.zero_dimension · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-equativ-zero_dimension/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Equativ ignores requests with an explicitly zero width or height.
openrtb.profile.equativ.zero_dimension warning Bid request
Equativ ignores requests with an explicitly zero width or height.
## What it means
Equativ ignores requests with an explicitly zero width or height. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "r",
"imp": [
{
"id": "i",
"tagid": "placement",
"banner": {
"w": 0,
"h": 250
}
}
],
"site": {
"domain": "publisher.example",
"page": "https://publisher.example/page",
"publisher": {
"id": "1234"
}
},
"device": {
"ip": "203.0.113.2"
},
"user": {
"buyeruid": "matched-user"
}
}
Profile equativ-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.equativ.zero_dimension at imp[0].banner.w.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# DT DSP Dual End Card uses JSON true or false. · openrtb.profile.field_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-field_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## DT DSP Dual End Card uses JSON true or false.
openrtb.profile.field_type error Bid request
DT DSP Dual End Card uses JSON true or false.
## What it means
DT DSP Dual End Card uses JSON true or false. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
}
}
],
"ext": []
}
Profile pubmatic-openwrap, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.field_type at ext.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The selected Google billing ID is not offered by the referenced impression. With a sole ID and no active child seats Google may ignore this field; account configuration is unavailable. · openrtb.profile.google.billing_id_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-billing_id_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The selected Google billing ID is not offered by the referenced impression. With a sole ID and no active child seats Google may ignore this field; account configuration is unavailable.
openrtb.profile.google.billing_id_not_offered warning Request/response pair
The selected Google billing ID is not offered by the referenced impression. With a sole ID and no active child seats Google may ignore this field; account configuration is unavailable.
## What it means
The selected Google billing ID is not offered by the referenced impression. With a sole ID and no active child seats Google may ignore this field; account configuration is unavailable. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123"
]
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"billing_id": "999"
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.billing_id_not_offered at seatbid[0].bid[0].ext.billing_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# A Google bid must select ext.billing_id when its impression offers multiple billing IDs. · openrtb.profile.google.billing_id_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-billing_id_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A Google bid must select ext.billing_id when its impression offers multiple billing IDs.
openrtb.profile.google.billing_id_required error Request/response pair
A Google bid must select ext.billing_id when its impression offers multiple billing IDs.
## What it means
A Google bid must select ext.billing_id when its impression offers multiple billing IDs. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123",
"124"
]
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
]
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.billing_id_required at seatbid[0].bid[0].ext.billing_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The expanded Google collapsible-ad the field exceeds the impression's the field. · openrtb.profile.google.collapsible_size_exceeded · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-collapsible_size_exceeded/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The expanded Google collapsible-ad the field exceeds the impression's the field.
openrtb.profile.google.collapsible_size_exceeded error Request/response pair
The expanded Google collapsible-ad the field exceeds the impression's the field.
## What it means
The expanded Google collapsible-ad the field exceeds the impression's the field. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250,
"ext": {
"clpadslot": {
"wmax": 300,
"hmax": 250
}
}
},
"ext": {
"billing_id": [
"123",
"124"
]
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"billing_id": "123",
"clpad": {
"wexp": 301,
"hexp": 250
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.collapsible_size_exceeded at seatbid[0].bid[0].ext.clpad.wexp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Google deal's non-empty billing_id list does not offer the selected billing ID. · openrtb.profile.google.deal_billing_id_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-deal_billing_id_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Google deal's non-empty billing_id list does not offer the selected billing ID.
openrtb.profile.google.deal_billing_id_not_offered error Request/response pair
The Google deal's non-empty billing_id list does not offer the selected billing ID.
## What it means
The Google deal's non-empty billing_id list does not offer the selected billing ID. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123",
"124"
]
},
"pmp": {
"deals": [
{
"id": "d1",
"ext": {
"creative_constraints": {
"mtypes": [
1
]
},
"billing_id": [
"124"
]
}
}
]
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"dealid": "d1",
"mtype": 1,
"ext": {
"billing_id": "123"
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.deal_billing_id_not_offered at seatbid[0].bid[0].ext.billing_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The bid's mtype is excluded by the Google deal's creative_constraints.mtypes. · openrtb.profile.google.deal_media_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-deal_media_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The bid's mtype is excluded by the Google deal's creative_constraints.mtypes.
openrtb.profile.google.deal_media_not_offered error Request/response pair
The bid's mtype is excluded by the Google deal's creative_constraints.mtypes.
## What it means
The bid's mtype is excluded by the Google deal's creative_constraints.mtypes. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123",
"124"
]
},
"video": {
"mimes": [
"video/mp4"
]
},
"pmp": {
"deals": [
{
"id": "d1",
"ext": {
"creative_constraints": {
"mtypes": [
1
]
}
}
}
]
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"dealid": "d1",
"mtype": 2,
"ext": {
"billing_id": "123"
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.deal_media_not_offered at seatbid[0].bid[0].mtype.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google's DSA declaration requires paid, including when the payer and advertiser are the same. · openrtb.profile.google.dsa_paid_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-dsa_paid_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google's DSA declaration requires paid, including when the payer and advertiser are the same.
openrtb.profile.google.dsa_paid_required error Bid response
Google's DSA declaration requires paid, including when the payer and advertiser are the same.
## What it means
Google's DSA declaration requires paid, including when the payer and advertiser are the same. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"billing_id": "123",
"dsa": {
"behalf": "Advertiser"
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.dsa_paid_required at seatbid[0].bid[0].ext.dsa.paid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google ignores event notification token payloads longer than 128 UTF-8 bytes. · openrtb.profile.google.event_token_ignored · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-event_token_ignored/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google ignores event notification token payloads longer than 128 UTF-8 bytes.
openrtb.profile.google.event_token_ignored warning Bid response
Google ignores event notification token payloads longer than 128 UTF-8 bytes.
## What it means
Google ignores event notification token payloads longer than 128 UTF-8 bytes. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {
"html_snippet": "SDK ad
"
}
},
"event_notification_token": {
"payload": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.event_token_ignored at seatbid[0].bid[0].ext.event_notification_token.payload.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google's request explicitly declares fcap_scope=NONE (1), so frequency-capped bids are filtered. · openrtb.profile.google.frequency_caps_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-frequency_caps_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google's request explicitly declares fcap_scope=NONE (1), so frequency-capped bids are filtered.
openrtb.profile.google.frequency_caps_unsupported error Request/response pair
Google's request explicitly declares fcap_scope=NONE (1), so frequency-capped bids are filtered.
## What it means
Google's request explicitly declares fcap_scope=NONE (1), so frequency-capped bids are filtered. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123",
"124"
]
}
}
],
"ext": {
"fcap_scope": 1
}
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"billing_id": "123",
"fcap": [
{
"fcap_id": "cap",
"time_unit": 1,
"max_imp": 1
}
]
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.frequency_caps_unsupported at seatbid[0].bid[0].ext.fcap.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Authorized Buyers bids must declare a click URL in ext.clickurl, an advertiser domain in adomain, or both. · openrtb.profile.google.landing_page_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-landing_page_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Authorized Buyers bids must declare a click URL in ext.clickurl, an advertiser domain in adomain, or both.
openrtb.profile.google.landing_page_required error Bid response
Authorized Buyers bids must declare a click URL in ext.clickurl, an advertiser domain in adomain, or both.
## What it means
Authorized Buyers bids must declare a click URL in ext.clickurl, an advertiser domain in adomain, or both. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.landing_page_required at seatbid[0].bid[0].adomain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google's protobuf oneof permits at most one of these fields. · openrtb.profile.google.oneof_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-oneof_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google's protobuf oneof permits at most one of these fields.
openrtb.profile.google.oneof_conflict error Bid response
Google's protobuf oneof permits at most one of these fields.
## What it means
Google's protobuf oneof permits at most one of these fields. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"sdk_rendered_ad": {
"declared_ad": {
"html_snippet": "",
"video_url": "https://test.invalid/v"
},
"id": "com.example.SDK",
"rendering_data": "opaque"
},
"billing_id": "123"
},
"crid": "sdk-creative",
"w": 300,
"h": 250
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.oneof_conflict at seatbid[0].bid[0].ext.sdk_rendered_ad.declared_ad.video_url.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The SDK declared ad must specify one supported creative content field. · openrtb.profile.google.sdk_declared_creative_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_declared_creative_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The SDK declared ad must specify one supported creative content field.
openrtb.profile.google.sdk_declared_creative_required error Bid response
The SDK declared ad must specify one supported creative content field.
## What it means
The SDK declared ad must specify one supported creative content field. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {}
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_declared_creative_required at seatbid[0].bid[0].ext.sdk_rendered_ad.declared_ad.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google's selected buyer SDK ad contract requires this bid field, even when the general protocol marks it optional. · openrtb.profile.google.sdk_field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google's selected buyer SDK ad contract requires this bid field, even when the general protocol marks it optional.
openrtb.profile.google.sdk_field_required error Bid response
Google's selected buyer SDK ad contract requires this bid field, even when the general protocol marks it optional.
## What it means
Google's selected buyer SDK ad contract requires this bid field, even when the general protocol marks it optional. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque"
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_field_required at seatbid[0].bid[0].ext.sdk_rendered_ad.declared_ad.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-proto.txt. · openrtb.profile.google.sdk_native_field_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_native_field_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-proto.txt.
openrtb.profile.google.sdk_native_field_required error Bid response
https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-proto.txt.
## What it means
https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-proto.txt. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {
"native_response": {
"link": {}
}
}
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_native_field_required at seatbid[0].bid[0].ext.sdk_rendered_ad.declared_ad.native_response.link.url.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-adx-proto.txt. · openrtb.profile.google.sdk_native_image_type_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_native_image_type_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-adx-proto.txt.
openrtb.profile.google.sdk_native_image_type_required error Bid response
https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-adx-proto.txt.
## What it means
https://developers.google.com/static/authorized-buyers/rtb/downloads/openrtb-adx-proto.txt. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {
"native_response": {
"assets": [
{
"img": {
"url": "https://ads.example/image"
}
}
],
"link": {
"url": "https://advertiser.example"
}
}
}
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_native_image_type_required at seatbid[0].bid[0].ext.sdk_rendered_ad.declared_ad.native_response.assets[0].img.type.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google SDK-rendered ads require an installed_sdk submessage in the corresponding app request. · openrtb.profile.google.sdk_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google SDK-rendered ads require an installed_sdk submessage in the corresponding app request.
openrtb.profile.google.sdk_not_offered error Request/response pair
Google SDK-rendered ads require an installed_sdk submessage in the corresponding app request.
## What it means
Google SDK-rendered ads require an installed_sdk submessage in the corresponding app request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": [
"123",
"124"
]
}
}
],
"app": {
"id": "app1"
}
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "sdk1",
"rendering_data": "opaque",
"declared_ad": {
"html_snippet": "SDK representative ad
"
}
}
},
"crid": "sdk-creative",
"w": 300,
"h": 250
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_not_offered at seatbid[0].bid[0].ext.sdk_rendered_ad.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# openrtb.profile.google.sdk_native_image_type_required. · openrtb.profile.google.sdk_params_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_params_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## openrtb.profile.google.sdk_native_image_type_required.
openrtb.profile.google.sdk_params_not_offered error Request/response pair
openrtb.profile.google.sdk_native_image_type_required.
## What it means
openrtb.profile.google.sdk_native_image_type_required. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-sdk",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"ad_unit_mapping": [
{
"format": 1,
"keyvals": [
{
"key": "account",
"value": "A"
},
{
"key": "unit",
"value": "banner"
}
]
},
{
"format": 3,
"keyvals": [
{
"key": "account",
"value": "B"
},
{
"key": "unit",
"value": "native"
}
]
}
]
}
}
],
"app": {
"ext": {
"installed_sdk": [
{
"id": "com.example.SDK"
}
]
}
}
}
Response:
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {
"html_snippet": "SDK ad
"
},
"sdk_params": [
{
"key": "account",
"value": "A"
}
]
}
}
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_params_not_offered at seatbid[0].bid[0].ext.sdk_rendered_ad.sdk_params.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Google filters bids that select a buyer SDK creative and a separate ordinary or AMP creative. · openrtb.profile.google.sdk_renderer_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-sdk_renderer_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Google filters bids that select a buyer SDK creative and a separate ordinary or AMP creative.
openrtb.profile.google.sdk_renderer_conflict error Bid response
Google filters bids that select a buyer SDK creative and a separate ordinary or AMP creative.
## What it means
Google filters bids that select a buyer SDK creative and a separate ordinary or AMP creative. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req-sdk",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"adomain": [
"advertiser.example"
],
"crid": "sdk-creative",
"w": 300,
"h": 250,
"ext": {
"billing_id": "123",
"sdk_rendered_ad": {
"id": "com.example.SDK",
"rendering_data": "opaque",
"declared_ad": {
"html_snippet": "SDK ad
"
}
}
},
"adm": "Separate creative
"
}
]
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.sdk_renderer_conflict at seatbid[0].bid[0].ext.sdk_rendered_ad.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# the field the field. · openrtb.profile.google.value_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-google-value_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## the field the field.
openrtb.profile.google.value_invalid error Bid request
the field the field.
## What it means
the field the field. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"billing_id": {}
}
}
]
}
Profile google-ab, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.google.value_invalid at imp[0].ext.billing_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index expects adomain unless the impression is passed on; that exception needs integration context. · openrtb.profile.index.adomain_expected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-adomain_expected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index expects adomain unless the impression is passed on; that exception needs integration context.
openrtb.profile.index.adomain_expected warning Bid response
Index expects adomain unless the impression is passed on; that exception needs integration context.
## What it means
Index expects adomain unless the impression is passed on; that exception needs integration context. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "Ad
",
"adomain": [],
"mtype": 1
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.adomain_expected at seatbid[0].bid[0].adomain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index advertiser domains allow at most 128 characters. · openrtb.profile.index.adomain_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-adomain_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index advertiser domains allow at most 128 characters.
openrtb.profile.index.adomain_length error Bid response
Index advertiser domains allow at most 128 characters.
## What it means
Index advertiser domains allow at most 128 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "Ad
",
"adomain": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example"
],
"mtype": 1
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.adomain_length at seatbid[0].bid[0].adomain[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The banner creative dimensions must match an offered fixed format. · openrtb.profile.index.banner_size_unoffered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-banner_size_unoffered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The banner creative dimensions must match an offered fixed format.
openrtb.profile.index.banner_size_unoffered error Request/response pair
The banner creative dimensions must match an offered fixed format.
## What it means
The banner creative dimensions must match an offered fixed format. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req",
"tmax": 200,
"ext": {},
"device": {},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 320,
"h": 50,
"topframe": 0,
"format": [
{
"w": 320,
"h": 50
},
{
"w": 300,
"h": 250
}
]
}
}
]
}
Response:
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"mtype": 1,
"w": 728,
"h": 90,
"adomain": [
"advertiser.example"
],
"adm": "Banner
"
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.banner_size_unoffered at seatbid[0].bid[0].w.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index's published DSP requests use USD. · openrtb.profile.index.currency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index's published DSP requests use USD.
openrtb.profile.index.currency error Bid request
Index's published DSP requests use USD.
## What it means
Index's published DSP requests use USD. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 100,
"ext": {},
"device": {},
"site": {
"id": "site",
"publisher": {
"id": "pub"
}
},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 300,
"h": 250,
"topframe": 1
}
}
],
"cur": [
"EUR"
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.currency at cur[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index deal discounts are fractions from 0.01 through 1.0. · openrtb.profile.index.deal_discount · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-deal_discount/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index deal discounts are fractions from 0.01 through 1.0.
openrtb.profile.index.deal_discount error Bid request
Index deal discounts are fractions from 0.01 through 1.0.
## What it means
Index deal discounts are fractions from 0.01 through 1.0. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"tmax": 100,
"ext": {},
"device": {},
"site": {
"id": "site",
"publisher": {
"id": "pub"
}
},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 300,
"h": 250,
"topframe": 1
},
"pmp": {
"deals": [
{
"id": "deal",
"at": 1,
"ext": {
"disc": 0.0
}
}
]
}
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.deal_discount at imp[0].pmp.deals[0].ext.disc.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index DSA names allow at most 100 characters. · openrtb.profile.index.dsa_length · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-dsa_length/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index DSA names allow at most 100 characters.
openrtb.profile.index.dsa_length error Bid response
Index DSA names allow at most 100 characters.
## What it means
Index DSA names allow at most 100 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"mtype": 1,
"ext": {
"dsa": {
"paid": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"
}
}
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.dsa_length at seatbid[0].bid[0].ext.dsa.paid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index supplier requests require device.ip or device.ipv6. · openrtb.profile.index.ip_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-ip_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index supplier requests require device.ip or device.ipv6.
openrtb.profile.index.ip_required error Bid request
Index supplier requests require device.ip or device.ipv6.
## What it means
Index supplier requests require device.ip or device.ipv6. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req",
"tmax": 100,
"device": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.ip_required at device.ip.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index probability metrics must be from 0.0 through 1.0. · openrtb.profile.index.metric_probability · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-metric_probability/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index probability metrics must be from 0.0 through 1.0.
openrtb.profile.index.metric_probability error Bid request
Index probability metrics must be from 0.0 through 1.0.
## What it means
Index probability metrics must be from 0.0 through 1.0. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 200,
"ext": {},
"device": {},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 320,
"h": 50,
"topframe": 0,
"format": [
{
"w": 320,
"h": 50
},
{
"w": 300,
"h": 250
}
]
},
"metric": [
{
"type": "viewability",
"value": 3
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.metric_probability at imp[0].metric[0].value.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index native bid markup requires an outer native object. · openrtb.profile.index.native_wrapper · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-native_wrapper/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index native bid markup requires an outer native object.
openrtb.profile.index.native_wrapper error Bid response
Index native bid markup requires an outer native object.
## What it means
Index native bid markup requires an outer native object. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"title\": {\"text\": \"Example\"}}], \"link\": {\"url\": \"https://advertiser.example\"}}",
"adomain": [
"advertiser.example"
],
"mtype": 4
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.native_wrapper at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index supplier requests with multiple video impressions require the same podid for a single ad pod. · openrtb.profile.index.pod_id_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-pod_id_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index supplier requests with multiple video impressions require the same podid for a single ad pod.
openrtb.profile.index.pod_id_mismatch error Bid request
Index supplier requests with multiple video impressions require the same podid for a single ad pod.
## What it means
Index supplier requests with multiple video impressions require the same podid for a single ad pod. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "r",
"tmax": 100,
"device": {
"ip": "192.0.2.1"
},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"w": 640,
"h": 360,
"minduration": 1,
"maxduration": 30,
"protocols": [
2
],
"podid": "pod-1"
}
},
{
"id": "2",
"video": {
"mimes": [
"video/mp4"
],
"w": 640,
"h": 360,
"minduration": 1,
"maxduration": 30,
"protocols": [
2
],
"podid": "pod-2"
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.pod_id_mismatch at imp[1].video.podid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index normally requires seat, but can disable it per DSP; account configuration is unavailable. · openrtb.profile.index.seat_expected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-seat_expected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index normally requires seat, but can disable it per DSP; account configuration is unavailable.
openrtb.profile.index.seat_expected warning Bid response
Index normally requires seat, but can disable it per DSP; account configuration is unavailable.
## What it means
Index normally requires seat, but can disable it per DSP; account configuration is unavailable. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"mtype": 1
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.seat_expected at seatbid[0].seat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index supplier site requests require domain or page. · openrtb.profile.index.site_identity · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-site_identity/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index supplier site requests require domain or page.
openrtb.profile.index.site_identity error Bid request
Index supplier site requests require domain or page.
## What it means
Index supplier site requests require domain or page. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 100,
"device": {
"ip": "192.0.2.1"
},
"site": {},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.site_identity at site.domain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# SKAdNetwork itunesitem must match bid.bundle. · openrtb.profile.index.skad_bundle · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-skad_bundle/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## SKAdNetwork itunesitem must match bid.bundle.
openrtb.profile.index.skad_bundle error Request/response pair
SKAdNetwork itunesitem must match bid.bundle.
## What it means
SKAdNetwork itunesitem must match bid.bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "req",
"tmax": 100,
"ext": {},
"device": {},
"site": {
"id": "site",
"publisher": {
"id": "pub"
}
},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 300,
"h": 250,
"topframe": 1
}
}
]
}
Response:
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.0,
"adm": "Ad
",
"adomain": [
"advertiser.example"
],
"mtype": 1,
"bundle": "123",
"ext": {
"skadn": {
"version": "2.2",
"network": "abcd123456.skadnetwork",
"campaign": "1",
"itunesitem": "456",
"sourceapp": "789",
"nonce": "00000000-0000-4000-8000-000000000001",
"timestamp": "1700000000000",
"signature": "example"
}
}
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.skad_bundle at seatbid[0].bid[0].ext.skadn.itunesitem.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The SKAdNetwork response network must match an offered request ID. · openrtb.profile.index.skad_network · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-skad_network/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The SKAdNetwork response network must match an offered request ID.
openrtb.profile.index.skad_network error Request/response pair
The SKAdNetwork response network must match an offered request ID.
## What it means
The SKAdNetwork response network must match an offered request ID. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "req",
"tmax": 200,
"ext": {},
"device": {},
"imp": [
{
"id": "1",
"secure": 1,
"banner": {
"w": 320,
"h": 50,
"topframe": 0,
"format": [
{
"w": 320,
"h": 50
},
{
"w": 300,
"h": 250
}
]
},
"ext": {
"skadn": {
"version": "2.0",
"sourceapp": "123",
"skadnetids": [
"other.skadnetwork"
]
}
}
}
]
}
Response:
{
"id": "req",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1.2,
"mtype": 1,
"w": 320,
"h": 50,
"adomain": [
"advertiser.example"
],
"adm": "Banner
",
"ext": {
"skadn": {
"version": "2.0",
"network": "network.skadnetwork",
"campaign": "1",
"itunesitem": "456",
"sourceapp": "123",
"nonce": "nonce",
"timestamp": "1",
"signature": "opaque"
}
}
}
]
}
]
}
Profile index-exchange, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.skad_network at seatbid[0].bid[0].ext.skadn.network.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index supplier requests allow at least 100 milliseconds. · openrtb.profile.index.tmax_minimum · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-tmax_minimum/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index supplier requests allow at least 100 milliseconds.
openrtb.profile.index.tmax_minimum error Bid request
Index supplier requests allow at least 100 milliseconds.
## What it means
Index supplier requests allow at least 100 milliseconds. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 99,
"device": {
"ip": "192.0.2.1"
},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.tmax_minimum at tmax.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index requires at least one supported video protocol. · openrtb.profile.index.video_protocol · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-video_protocol/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index requires at least one supported video protocol.
openrtb.profile.index.video_protocol error Bid request
Index requires at least one supported video protocol.
## What it means
Index requires at least one supported video protocol. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 100,
"device": {
"ip": "192.0.2.1"
},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"protocols": [],
"minduration": 1,
"maxduration": 30,
"w": 300,
"h": 250
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.video_protocol at imp[0].video.protocols.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Index requires VPAID API 1 or 2 with application/javascript video. · openrtb.profile.index.vpaid_api · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-index-vpaid_api/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Index requires VPAID API 1 or 2 with application/javascript video.
openrtb.profile.index.vpaid_api error Bid request
Index requires VPAID API 1 or 2 with application/javascript video.
## What it means
Index requires VPAID API 1 or 2 with application/javascript video. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"tmax": 100,
"device": {
"ip": "192.0.2.1"
},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"video": {
"mimes": [
"application/javascript"
],
"protocols": [
6
],
"minduration": 1,
"maxduration": 30,
"w": 300,
"h": 250
}
}
]
}
Profile index-exchange-seller, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.index.vpaid_api at imp[0].video.api.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi supplier banners require positive w/h or a format with positive w/h. · openrtb.profile.inmobi.banner_size_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-banner_size_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi supplier banners require positive w/h or a format with positive w/h.
openrtb.profile.inmobi.banner_size_required error Bid request
InMobi supplier banners require positive w/h or a format with positive w/h.
## What it means
InMobi supplier banners require positive w/h or a format with positive w/h. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.banner_size_required at imp[0].banner.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi sends at most 30 blocked app bundles. · openrtb.profile.inmobi.bapp_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-bapp_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi sends at most 30 blocked app bundles.
openrtb.profile.inmobi.bapp_limit error Bid request
InMobi sends at most 30 blocked app bundles.
## What it means
InMobi sends at most 30 blocked app bundles. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
},
"bapp": [
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game",
"com.game"
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.bapp_limit at bapp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi requires the creative's IAB categories. · openrtb.profile.inmobi.category_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-category_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi requires the creative's IAB categories.
openrtb.profile.inmobi.category_required error Bid response
InMobi requires the creative's IAB categories.
## What it means
InMobi requires the creative's IAB categories. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "source-boundary",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"adm": "Ad
",
"burl": "https://buyer.example/bill",
"cat": [],
"crid": "creative",
"adomain": [
"advertiser.example"
],
"mtype": 1,
"w": 320,
"h": 50
}
]
}
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.category_required at seatbid[0].bid[0].cat.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi truncates creative IDs longer than 64 characters. · openrtb.profile.inmobi.creative_id_truncated · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-creative_id_truncated/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi truncates creative IDs longer than 64 characters.
openrtb.profile.inmobi.creative_id_truncated warning Bid response
InMobi truncates creative IDs longer than 64 characters.
## What it means
InMobi truncates creative IDs longer than 64 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
"adomain": [
"advertiser.example"
],
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 1
}
]
}
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.creative_id_truncated at seatbid[0].bid[0].crid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The supplier guide labels both IP families required but does not define the alternative or privacy redaction behavior. Confirm address availability for this integration. · openrtb.profile.inmobi.device_address · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-device_address/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The supplier guide labels both IP families required but does not define the alternative or privacy redaction behavior. Confirm address availability for this integration.
openrtb.profile.inmobi.device_address warning Bid request
The supplier guide labels both IP families required but does not define the alternative or privacy redaction behavior. Confirm address availability for this integration.
## What it means
The supplier guide labels both IP families required but does not define the alternative or privacy redaction behavior. Confirm address availability for this integration. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0
}
}
Profile inmobi-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.device_address at device.ip.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi histories contain at most five entries; purchase and advertiser histories are omitted when empty. · openrtb.profile.inmobi.history_count · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-history_count/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi histories contain at most five entries; purchase and advertiser histories are omitted when empty.
openrtb.profile.inmobi.history_count error Bid request
InMobi histories contain at most five entries; purchase and advertiser histories are omitted when empty.
## What it means
InMobi histories contain at most five entries; purchase and advertiser histories are omitted when empty. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1",
"ext": {
"iap": []
}
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.history_count at device.ext.iap.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi documents recent history first; its advertiser example conflicts with this ordering. · openrtb.profile.inmobi.history_order · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-history_order/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi documents recent history first; its advertiser example conflicts with this ordering.
openrtb.profile.inmobi.history_order warning Bid request
InMobi documents recent history first; its advertiser example conflicts with this ordering.
## What it means
InMobi documents recent history first; its advertiser example conflicts with this ordering. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1",
"ext": {
"advertiserrelevancy": [
{
"lastbidtime": 100
},
{
"lastbidtime": 200
}
]
}
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.history_order at device.ext.advertiserrelevancy.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi supplier ingest requires app or site inventory context; the current FAQ supports both directions. · openrtb.profile.inmobi.inventory_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-inventory_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi supplier ingest requires app or site inventory context; the current FAQ supports both directions.
openrtb.profile.inmobi.inventory_required error Bid request
InMobi supplier ingest requires app or site inventory context; the current FAQ supports both directions.
## What it means
InMobi supplier ingest requires app or site inventory context; the current FAQ supports both directions. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"banner": {
"w": 320,
"h": 50
}
}
],
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.inventory_required at app.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi percentage telemetry must be an integer from 0 to 100. · openrtb.profile.inmobi.percentage_range · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-percentage_range/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi percentage telemetry must be an integer from 0 to 100.
openrtb.profile.inmobi.percentage_range error Bid request
InMobi percentage telemetry must be an integer from 0 to 100.
## What it means
InMobi percentage telemetry must be an integer from 0 to 100. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1",
"ext": {
"volumelevel": -1
}
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.percentage_range at device.ext.volumelevel.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi supplier ingest requires tagid or ext.placementid. · openrtb.profile.inmobi.placement_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-placement_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi supplier ingest requires tagid or ext.placementid.
openrtb.profile.inmobi.placement_required error Bid request
InMobi supplier ingest requires tagid or ext.placementid.
## What it means
InMobi supplier ingest requires tagid or ext.placementid. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.placement_required at imp[0].tagid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi omits Play Store version when psdisable is 1. · openrtb.profile.inmobi.play_store_state · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-play_store_state/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi omits Play Store version when psdisable is 1.
openrtb.profile.inmobi.play_store_state error Bid request
InMobi omits Play Store version when psdisable is 1.
## What it means
InMobi omits Play Store version when psdisable is 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1",
"ext": {
"psdisable": 1,
"psv": "51.2.34"
}
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.play_store_state at device.ext.psv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi Getting Started requires this quality declaration; the current response table labels it recommended. Confirm the active integration contract. · openrtb.profile.inmobi.quality_declaration · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-quality_declaration/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi Getting Started requires this quality declaration; the current response table labels it recommended. Confirm the active integration contract.
openrtb.profile.inmobi.quality_declaration warning Bid response
InMobi Getting Started requires this quality declaration; the current response table labels it recommended. Confirm the active integration contract.
## What it means
InMobi Getting Started requires this quality declaration; the current response table labels it recommended. Confirm the active integration contract. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "creative-1",
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 1
}
]
}
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.quality_declaration at seatbid[0].bid[0].adomain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi's declared supply chain requires at least one node. · openrtb.profile.inmobi.schain_nodes · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-schain_nodes/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi's declared supply chain requires at least one node.
openrtb.profile.inmobi.schain_nodes error Bid request
InMobi's declared supply chain requires at least one node.
## What it means
InMobi's declared supply chain requires at least one node. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
},
"source": {
"ext": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [],
"ext": {}
}
}
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.schain_nodes at source.ext.schain.nodes.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The outgoing guide says this field is passed by the InMobi SDK; verify SDK version and producer configuration. · openrtb.profile.inmobi.sdk_expected · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-sdk_expected/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The outgoing guide says this field is passed by the InMobi SDK; verify SDK version and producer configuration.
openrtb.profile.inmobi.sdk_expected warning Bid request
The outgoing guide says this field is passed by the InMobi SDK; verify SDK version and producer configuration.
## What it means
The outgoing guide says this field is passed by the InMobi SDK; verify SDK version and producer configuration. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
},
"displaymanager": "inmobi"
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.sdk_expected at device.ext.locale.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi sends each format opportunity to DSPs in a separate request. · openrtb.profile.inmobi.single_format · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-single_format/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi sends each format opportunity to DSPs in a separate request.
openrtb.profile.inmobi.single_format error Bid request
InMobi sends each format opportunity to DSPs in a separate request.
## What it means
InMobi sends each format opportunity to DSPs in a separate request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
},
"video": {
"w": 320,
"h": 480,
"mimes": [
"video/mp4"
]
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.single_format at imp[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The response SKAdNetwork must match a requested skadnetids entry. · openrtb.profile.inmobi.skadnetwork_unoffered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-skadnetwork_unoffered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The response SKAdNetwork must match a requested skadnetids entry.
openrtb.profile.inmobi.skadnetwork_unoffered error Request/response pair
The response SKAdNetwork must match a requested skadnetids entry.
## What it means
The response SKAdNetwork must match a requested skadnetids entry. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"skadn": {
"versions": [
"4.0"
],
"sourceapp": "987654321",
"skadnetids": [
"example.skadnetwork"
]
}
}
}
],
"app": {
"bundle": "987654321"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Response:
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "creative-1",
"adomain": [
"advertiser.example"
],
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 1,
"ext": {
"skadn": {
"version": "4.0",
"network": "other.skadnetwork",
"sourceidentifier": "1234",
"itunesitem": "123456789",
"sourceapp": "987654321",
"fidelities": [
{
"fidelity": 0,
"nonce": "00000000-0000-0000-0000-000000000000",
"timestamp": "1775407039",
"signature": "signature-token"
}
]
}
}
}
]
}
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.skadnetwork_unoffered at seatbid[0].bid[0].ext.skadn.network.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The supplier request guide labels this object unsupported in its current version; negotiated integration support is not visible here. · openrtb.profile.inmobi.supplier_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-supplier_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The supplier request guide labels this object unsupported in its current version; negotiated integration support is not visible here.
openrtb.profile.inmobi.supplier_unsupported warning Bid request
The supplier request guide labels this object unsupported in its current version; negotiated integration support is not visible here.
## What it means
The supplier request guide labels this object unsupported in its current version; negotiated integration support is not visible here. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"banner": {
"w": 320,
"h": 50
},
"pmp": {}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.supplier_unsupported at imp[0].pmp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi video experience IDs are 1, 2 and 3. · openrtb.profile.inmobi.video_experience · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-video_experience/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi video experience IDs are 1, 2 and 3.
openrtb.profile.inmobi.video_experience error Bid request
InMobi video experience IDs are 1, 2 and 3.
## What it means
InMobi video experience IDs are 1, 2 and 3. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"video": {
"mimes": [
"video/mp4"
],
"minduration": 5,
"maxduration": 30,
"protocols": [
2
],
"w": 640,
"h": 360,
"linearity": 1,
"ext": {
"experiences": [
4
]
}
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.video_experience at imp[0].video.ext.experiences[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi portrait and vertical experiences must be explicitly offered in the request. · openrtb.profile.inmobi.video_experience_unoffered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-video_experience_unoffered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi portrait and vertical experiences must be explicitly offered in the request.
openrtb.profile.inmobi.video_experience_unoffered error Request/response pair
InMobi portrait and vertical experiences must be explicitly offered in the request.
## What it means
InMobi portrait and vertical experiences must be explicitly offered in the request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"video": {
"w": 320,
"h": 480,
"mimes": [
"video/mp4"
],
"plcmt": 3,
"ext": {
"experiences": [
1
]
}
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Response:
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "creative-1",
"adomain": [
"advertiser.example"
],
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 2,
"ext": {
"video": {
"experience": 2
}
}
}
]
}
]
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.video_experience_unoffered at seatbid[0].bid[0].ext.video.experience.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# InMobi outgoing video opportunities use linearity 1. · openrtb.profile.inmobi.video_linearity · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-inmobi-video_linearity/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## InMobi outgoing video opportunities use linearity 1.
openrtb.profile.inmobi.video_linearity error Bid request
InMobi outgoing video opportunities use linearity 1.
## What it means
InMobi outgoing video opportunities use linearity 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"video": {
"mimes": [
"video/mp4"
],
"minduration": 5,
"maxduration": 30,
"protocols": [
2
],
"w": 640,
"h": 360,
"linearity": 2,
"ext": {
"experiences": [
1,
2,
3
]
}
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile inmobi, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.inmobi.video_linearity at imp[0].video.linearity.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The referenced impression does not offer the Magnite creative API framework. · openrtb.profile.magnite.api_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-api_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The referenced impression does not offer the Magnite creative API framework.
openrtb.profile.magnite.api_not_offered error Request/response pair
The referenced impression does not offer the Magnite creative API framework.
## What it means
The referenced impression does not offer the Magnite creative API framework. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250,
"api": [
5
]
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"rp": {
"adtype": "banner",
"creativeapi": 7
}
}
}
]
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.api_not_offered at seatbid[0].bid[0].ext.rp.creativeapi.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Magnite xAPI the field permits at most the field entries. · openrtb.profile.magnite.array_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-array_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Magnite xAPI the field permits at most the field entries.
openrtb.profile.magnite.array_limit error Bid request
Magnite xAPI the field permits at most the field entries.
## What it means
Magnite xAPI the field permits at most the field entries. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
],
"ext": {
"rp": {
"badvid": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20
]
}
}
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.array_limit at ext.rp.badvid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The public Magnite xAPI model marks this extension field deprecated; no account-side behavior is inferred. · openrtb.profile.magnite.deprecated · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-deprecated/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The public Magnite xAPI model marks this extension field deprecated; no account-side behavior is inferred.
openrtb.profile.magnite.deprecated warning Bid request
The public Magnite xAPI model marks this extension field deprecated; no account-side behavior is inferred.
## What it means
The public Magnite xAPI model marks this extension field deprecated; no account-side behavior is inferred. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250,
"ext": {
"rp": {
"usenurl": true
}
}
}
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.deprecated at imp[0].banner.ext.rp.usenurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Magnite xAPI requires HTTPS impression trackers when the referenced impression is secure. · openrtb.profile.magnite.insecure_tracker · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-insecure_tracker/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Magnite xAPI requires HTTPS impression trackers when the referenced impression is secure.
openrtb.profile.magnite.insecure_tracker error Request/response pair
Magnite xAPI requires HTTPS impression trackers when the referenced impression is secure.
## What it means
Magnite xAPI requires HTTPS impression trackers when the referenced impression is secure. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
},
"secure": 1
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"rp": {
"imptrackers": [
"//tracker.example/i"
]
}
}
}
]
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.insecure_tracker at seatbid[0].bid[0].ext.rp.imptrackers[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Magnite xAPI creative format was not offered by the referenced impression. · openrtb.profile.magnite.media_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-media_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Magnite xAPI creative format was not offered by the referenced impression.
openrtb.profile.magnite.media_not_offered error Request/response pair
The Magnite xAPI creative format was not offered by the referenced impression.
## What it means
The Magnite xAPI creative format was not offered by the referenced impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"rp": {
"response_format": 2
}
}
}
]
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.media_not_offered at seatbid[0].bid[0].ext.rp.response_format.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Magnite banner response MIME type differs from the requested markup format. · openrtb.profile.magnite.mime_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-mime_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Magnite banner response MIME type differs from the requested markup format.
openrtb.profile.magnite.mime_mismatch error Request/response pair
The Magnite banner response MIME type differs from the requested markup format.
## What it means
The Magnite banner response MIME type differs from the requested markup format. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250,
"ext": {
"rp": {
"mime": "text/html"
}
}
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"rp": {
"response_format": 1,
"mime": "application/javascript"
}
}
}
]
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.mime_mismatch at seatbid[0].bid[0].ext.rp.mime.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Magnite banner size ID was not included in the explicit primary or alternate size IDs. · openrtb.profile.magnite.size_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-size_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Magnite banner size ID was not included in the explicit primary or alternate size IDs.
openrtb.profile.magnite.size_not_offered error Request/response pair
The Magnite banner size ID was not included in the explicit primary or alternate size IDs.
## What it means
The Magnite banner size ID was not included in the explicit primary or alternate size IDs. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250,
"ext": {
"rp": {
"size_id": 1,
"alt_size_ids": [
2
],
"mime": "text/html"
}
}
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"rp": {
"adtype": "banner",
"size_id": 3,
"mime": "text/html"
}
}
}
]
}
]
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.size_not_offered at seatbid[0].bid[0].ext.rp.size_id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The supplied Magnite xAPI extension does not match its public field type or integer width. · openrtb.profile.magnite.type_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-magnite-type_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The supplied Magnite xAPI extension does not match its public field type or integer width.
openrtb.profile.magnite.type_invalid error Bid request
The supplied Magnite xAPI extension does not match its public field type or integer width.
## What it means
The supplied Magnite xAPI extension does not match its public field type or integer width. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
],
"ext": {
"rp": []
}
}
Profile magnite, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.magnite.type_invalid at ext.rp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse supports at most 50 blocked advertiser domains. · openrtb.profile.mobilefuse.badv_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-badv_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse supports at most 50 blocked advertiser domains.
openrtb.profile.mobilefuse.badv_limit error Bid request
MobileFuse supports at most 50 blocked advertiser domains.
## What it means
MobileFuse supports at most 50 blocked advertiser domains. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
},
"badv": [
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example",
"advertiser.example"
]
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.badv_limit at badv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse documents processing only the first impression; this bid references a later impression. · openrtb.profile.mobilefuse.bid_for_ignored_imp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-bid_for_ignored_imp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse documents processing only the first impression; this bid references a later impression.
openrtb.profile.mobilefuse.bid_for_ignored_imp warning Request/response pair
MobileFuse documents processing only the first impression; this bid references a later impression.
## What it means
MobileFuse documents processing only the first impression; this bid references a later impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
Request:
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
},
{
"id": "2",
"tagid": "placement-2",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Response:
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "2",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "creative-1",
"adomain": [
"advertiser.example"
],
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 1
}
]
}
]
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.bid_for_ignored_imp at seatbid[0].bid[0].impid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse auctions use USD. · openrtb.profile.mobilefuse.currency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse auctions use USD.
openrtb.profile.mobilefuse.currency error Bid response
MobileFuse auctions use USD.
## What it means
MobileFuse auctions use USD. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"seatbid": [
{
"seat": "buyer-1",
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"burl": "https://buyer.example/bill",
"cat": [
"IAB1"
],
"crid": "creative-1",
"adomain": [
"advertiser.example"
],
"adm": "banner
",
"w": 320,
"h": 50,
"mtype": 1
}
]
}
],
"cur": "EUR"
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.currency at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The address must use the documented IP family. · openrtb.profile.mobilefuse.device_address_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-device_address_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The address must use the documented IP family.
openrtb.profile.mobilefuse.device_address_invalid error Bid request
The address must use the documented IP family.
## What it means
The address must use the documented IP family. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "2001:db8::1"
}
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.device_address_invalid at device.ip.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse requires ip or ipv6. · openrtb.profile.mobilefuse.device_address_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-device_address_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse requires ip or ipv6.
openrtb.profile.mobilefuse.device_address_required error Bid request
MobileFuse requires ip or ipv6.
## What it means
MobileFuse requires ip or ipv6. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0
}
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.device_address_required at device.ip.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse processes only the first impression; later impressions are ignored. · openrtb.profile.mobilefuse.impressions_ignored · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-impressions_ignored/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse processes only the first impression; later impressions are ignored.
openrtb.profile.mobilefuse.impressions_ignored warning Bid request
MobileFuse processes only the first impression; later impressions are ignored.
## What it means
MobileFuse processes only the first impression; later impressions are ignored. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
}
},
{
"id": "2",
"banner": {
"w": 320,
"h": 50
}
}
],
"user": {
"data": [
{
"segment": [
{
"signal": "opaque-sdk-token"
}
]
}
]
}
}
Profile mobilefuse-sdk, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.impressions_ignored at imp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse expects Native Ads 1.2. · openrtb.profile.mobilefuse.native_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-native_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse expects Native Ads 1.2.
openrtb.profile.mobilefuse.native_version warning Bid request
MobileFuse expects Native Ads 1.2.
## What it means
MobileFuse expects Native Ads 1.2. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"tagid": "placement",
"native": {
"ver": "1.1",
"request": "{\"ver\": \"1.1\", \"assets\": [{\"id\": 1, \"title\": {\"len\": 25}}]}"
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "ua",
"lmt": 0,
"ip": "192.0.2.1"
}
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.native_version at imp[0].native.ver.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse SDK bidding requires the SDK token in the first data segment. · openrtb.profile.mobilefuse.sdk_signal_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-sdk_signal_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse SDK bidding requires the SDK token in the first data segment.
openrtb.profile.mobilefuse.sdk_signal_required error Bid request
MobileFuse SDK bidding requires the SDK token in the first data segment.
## What it means
MobileFuse SDK bidding requires the SDK token in the first data segment. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"user": {
"data": [
{
"segment": [
{}
]
}
]
}
}
Profile mobilefuse-sdk, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.sdk_signal_required at user.data[0].segment[0].signal.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The SDK token may be at most 4000 UTF-8 bytes. · openrtb.profile.mobilefuse.sdk_signal_size · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-sdk_signal_size/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The SDK token may be at most 4000 UTF-8 bytes.
openrtb.profile.mobilefuse.sdk_signal_size error Bid request
The SDK token may be at most 4000 UTF-8 bytes.
## What it means
The SDK token may be at most 4000 UTF-8 bytes. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"user": {
"data": [
{
"segment": [
{
"signal": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"
}
]
}
]
}
}
Profile mobilefuse-sdk, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.sdk_signal_size at user.data[0].segment[0].signal.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# MobileFuse tmax must be at least 100 milliseconds. · openrtb.profile.mobilefuse.tmax_minimum · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-mobilefuse-tmax_minimum/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## MobileFuse tmax must be at least 100 milliseconds.
openrtb.profile.mobilefuse.tmax_minimum error Bid request
MobileFuse tmax must be at least 100 milliseconds.
## What it means
MobileFuse tmax must be at least 100 milliseconds. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "depth-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"bundle": "com.publisher.game"
},
"device": {
"ua": "Mozilla/5.0",
"lmt": 0,
"ip": "192.0.2.1"
},
"tmax": 99
}
Profile mobilefuse, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.mobilefuse.tmax_minimum at tmax.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# This exchange requires a Native request encoded as an object or a JSON object string. · openrtb.profile.native_encoding · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-native_encoding/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## This exchange requires a Native request encoded as an object or a JSON object string.
openrtb.profile.native_encoding error Bid response
This exchange requires a Native request encoded as an object or a JSON object string.
## What it means
This exchange requires a Native request encoded as an object or a JSON object string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.5,
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill?p=${AUCTION_PRICE}",
"cat": [
"IAB9"
],
"crid": "creative-1",
"adm_native": 1,
"ext": {
"crtype": "native"
}
}
]
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.native_encoding at seatbid[0].bid[0].adm_native.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# CTV ad counts must be positive after OpenWrap's zero defaults (minads 1, maxads 3). · openrtb.profile.openwrap.adpod_count · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-adpod_count/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## CTV ad counts must be positive after OpenWrap's zero defaults (minads 1, maxads 3).
openrtb.profile.openwrap.adpod_count error Bid request
CTV ad counts must be positive after OpenWrap's zero defaults (minads 1, maxads 3).
## What it means
CTV ad counts must be positive after OpenWrap's zero defaults (minads 1, maxads 3). This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"ext": {
"adpod": {
"adminduration": 1,
"admaxduration": 30,
"minads": -1
}
}
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.adpod_count at imp[0].video.ext.adpod.minads.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# CTV minads cannot exceed maxads after applying defaults. · openrtb.profile.openwrap.adpod_count_order · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-adpod_count_order/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## CTV minads cannot exceed maxads after applying defaults.
openrtb.profile.openwrap.adpod_count_order error Bid request
CTV minads cannot exceed maxads after applying defaults.
## What it means
CTV minads cannot exceed maxads after applying defaults. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"ext": {
"adpod": {
"adminduration": 1,
"admaxduration": 30,
"minads": 4
}
}
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.adpod_count_order at imp[0].video.ext.adpod.minads.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# An explicit CTV adpod requires positive adminduration and admaxduration. · openrtb.profile.openwrap.adpod_duration · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-adpod_duration/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## An explicit CTV adpod requires positive adminduration and admaxduration.
openrtb.profile.openwrap.adpod_duration error Bid request
An explicit CTV adpod requires positive adminduration and admaxduration.
## What it means
An explicit CTV adpod requires positive adminduration and admaxduration. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"ext": {
"adpod": {}
}
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.adpod_duration at imp[0].video.ext.adpod.adminduration.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# CTV adminduration cannot exceed admaxduration. · openrtb.profile.openwrap.adpod_duration_order · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-adpod_duration_order/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## CTV adminduration cannot exceed admaxduration.
openrtb.profile.openwrap.adpod_duration_order error Bid request
CTV adminduration cannot exceed admaxduration.
## What it means
CTV adminduration cannot exceed admaxduration. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"ext": {
"adpod": {
"adminduration": 31,
"admaxduration": 30
}
}
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.adpod_duration_order at imp[0].video.ext.adpod.adminduration.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# CTV exclusion percentages must be between 0 and 100. · openrtb.profile.openwrap.adpod_exclusion · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-adpod_exclusion/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## CTV exclusion percentages must be between 0 and 100.
openrtb.profile.openwrap.adpod_exclusion error Bid request
CTV exclusion percentages must be between 0 and 100.
## What it means
CTV exclusion percentages must be between 0 and 100. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
],
"ext": {
"adpod": {
"adminduration": 1,
"admaxduration": 30,
"excladv": -1
}
}
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.adpod_exclusion at imp[0].video.ext.adpod.excladv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The selected OpenWrap CTV endpoint requires at least one video impression. · openrtb.profile.openwrap.ctv_video_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-ctv_video_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The selected OpenWrap CTV endpoint requires at least one video impression.
openrtb.profile.openwrap.ctv_video_required error Bid request
The selected OpenWrap CTV endpoint requires at least one video impression.
## What it means
The selected OpenWrap CTV endpoint requires at least one video impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
}
}
]
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.ctv_video_required at imp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The CTV middleware removes this supply chain because its helper requires version 1.0, a complete flag, nonempty nodes, nonempty ASI/SID, SID at most 64 characters, and hp 1. · openrtb.profile.openwrap.schain_removed · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-openwrap-schain_removed/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The CTV middleware removes this supply chain because its helper requires version 1.0, a complete flag, nonempty nodes, nonempty ASI/SID, SID at most 64 characters, and hp 1.
openrtb.profile.openwrap.schain_removed warning Bid request
The CTV middleware removes this supply chain because its helper requires version 1.0, a complete flag, nonempty nodes, nonempty ASI/SID, SID at most 64 characters, and hp 1.
## What it means
The CTV middleware removes this supply chain because its helper requires version 1.0, a complete flag, nonempty nodes, nonempty ASI/SID, SID at most 64 characters, and hp 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req",
"imp": [
{
"id": "1",
"video": {
"mimes": [
"video/mp4"
]
}
}
],
"source": {
"schain": {
"ver": "1.0",
"complete": 1,
"nodes": [
{
"asi": "exchange.example",
"sid": "seller",
"hp": 0
}
]
}
}
}
Profile pubmatic-openwrap-ctv, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.openwrap.schain_removed at source.schain.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# PBS aliases must not map a bidder code to itself. · openrtb.profile.prebid.alias_noop · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-alias_noop/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## PBS aliases must not map a bidder code to itself.
openrtb.profile.prebid.alias_noop error Bid request
PBS aliases must not map a bidder code to itself.
## What it means
PBS aliases must not map a bidder code to itself. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
],
"ext": {
"prebid": {
"aliases": {
"testbidder": "testbidder"
}
}
}
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.alias_noop at ext.prebid.aliases.testbidder.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# A PBS alias GVL ID must reference a declared request alias. · openrtb.profile.prebid.alias_not_declared · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-alias_not_declared/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A PBS alias GVL ID must reference a declared request alias.
openrtb.profile.prebid.alias_not_declared error Bid request
A PBS alias GVL ID must reference a declared request alias.
## What it means
A PBS alias GVL ID must reference a declared request alias. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
],
"ext": {
"prebid": {
"aliases": {
"other": "testbidder"
},
"aliasgvlids": {
"undeclared": 1
}
}
}
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.alias_not_declared at ext.prebid.aliasgvlids.undeclared.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# PBS cache configuration requires bids or vastxml. · openrtb.profile.prebid.cache_type_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-cache_type_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## PBS cache configuration requires bids or vastxml.
openrtb.profile.prebid.cache_type_required error Bid request
PBS cache configuration requires bids or vastxml.
## What it means
PBS cache configuration requires bids or vastxml. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
],
"ext": {
"prebid": {
"cache": {}
}
}
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.cache_type_required at ext.prebid.cache.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# PBS-Go uses only the first request currency and drops subsequent entries. · openrtb.profile.prebid.currency_truncated · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-currency_truncated/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## PBS-Go uses only the first request currency and drops subsequent entries.
openrtb.profile.prebid.currency_truncated warning Bid request
PBS-Go uses only the first request currency and drops subsequent entries.
## What it means
PBS-Go uses only the first request currency and drops subsequent entries. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "source-boundary",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
],
"cur": [
"USD",
"EUR"
]
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.currency_truncated at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The PBS bid marker ext.prebid.type=the field references an impression without that media object. Stored-request media cannot be resolved locally. · openrtb.profile.prebid.media_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-media_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The PBS bid marker ext.prebid.type=the field references an impression without that media object. Stored-request media cannot be resolved locally.
openrtb.profile.prebid.media_not_offered error Request/response pair
The PBS bid marker ext.prebid.type=the field references an impression without that media object. Stored-request media cannot be resolved locally.
## What it means
The PBS bid marker ext.prebid.type=the field references an impression without that media object. Stored-request media cannot be resolved locally. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
]
}
Response:
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"ext": {
"prebid": {
"type": "video"
}
}
}
]
}
]
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.media_not_offered at seatbid[0].bid[0].ext.prebid.type.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The PBS ext.prebid.type marker contradicts the bid's mtype. · openrtb.profile.prebid.media_type_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-media_type_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The PBS ext.prebid.type marker contradicts the bid's mtype.
openrtb.profile.prebid.media_type_mismatch error Bid response
The PBS ext.prebid.type marker contradicts the bid's mtype.
## What it means
The PBS ext.prebid.type marker contradicts the bid's mtype. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "req-depth",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1,
"adomain": [
"test.invalid"
],
"mtype": 2,
"ext": {
"prebid": {
"type": "banner"
}
}
}
]
}
]
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.media_type_mismatch at seatbid[0].bid[0].ext.prebid.type.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# PBS-Go clamps maxbids to the supported range 1 through 9. · openrtb.profile.prebid.multibid_normalized · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-prebid-multibid_normalized/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## PBS-Go clamps maxbids to the supported range 1 through 9.
openrtb.profile.prebid.multibid_normalized warning Bid request
PBS-Go clamps maxbids to the supported range 1 through 9.
## What it means
PBS-Go clamps maxbids to the supported range 1 through 9. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "req-depth",
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
},
"ext": {
"prebid": {
"bidder": {
"testbidder": {
"placement": "example"
}
}
}
}
}
],
"ext": {
"prebid": {
"multibid": [
{
"maxbids": 2
}
]
}
}
}
Profile prebid-server, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.prebid.multibid_normalized.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# {} has no verified OpenRTB {} {} contract in this build. Canonical specification checks were applied. · openrtb.profile.scope.unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-scope-unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## {} has no verified OpenRTB {} {} contract in this build. Canonical specification checks were applied.
openrtb.profile.scope.unsupported warning Bid request
{} has no verified OpenRTB {} {} contract in this build. Canonical specification checks were applied.
## What it means
{} has no verified OpenRTB {} {} contract in this build. Canonical specification checks were applied. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Choose a profile with a verified contract for this payload direction and OpenRTB family. Specification validation remains available.
## Example that trips it
{
"id": "req",
"device": {
"ua": "browser",
"ip": "192.0.2.1"
},
"user": {},
"site": {
"domain": "publisher.example"
},
"imp": [
{
"id": "1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Profile applovin-alx, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.scope.unsupported.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Sovrn video requires supported protocols. · openrtb.profile.sovrn.protocols · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-sovrn-protocols/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Sovrn video requires supported protocols.
openrtb.profile.sovrn.protocols error Bid request
Sovrn video requires supported protocols.
## What it means
Sovrn video requires supported protocols. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "sovrn-request",
"site": {
"publisher": {
"id": "onboarded-publisher"
}
},
"imp": [
{
"id": "1",
"tagid": "onboarded-tag",
"video": {
"mimes": [
"video/mp4"
],
"maxduration": 30,
"w": 640,
"h": 360,
"protocols": []
}
}
]
}
Profile sovrn, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.sovrn.protocols at imp[0].video.protocols.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Native assetsurl requires request aurlsupport=1; omission means unsupported. · openrtb.profile.triplelift.assetsurl_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-assetsurl_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native assetsurl requires request aurlsupport=1; omission means unsupported.
openrtb.profile.triplelift.assetsurl_unsupported error Request/response pair
Native assetsurl requires request aurlsupport=1; omission means unsupported.
## What it means
Native assetsurl requires request aurlsupport=1; omission means unsupported. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
Request:
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"native": {
"ver": "1.2",
"request": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1, \"title\": {\"len\": 25}}], \"eventtrackers\": [{\"event\": 1, \"methods\": [1, 2]}]}"
}
}
]
}
Response:
{
"id": "tl-request",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"mtype": 4,
"adm": "{\"link\": {\"url\": \"https://advertiser.example\"}, \"assetsurl\": \"https://assets.example/creative\"}"
}
]
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.assetsurl_unsupported at seatbid[0].bid[0].adm.assetsurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# TripleLift's required format array must describe at least one banner size. · openrtb.profile.triplelift.banner_format_empty · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-banner_format_empty/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TripleLift's required format array must describe at least one banner size.
openrtb.profile.triplelift.banner_format_empty error Bid request
TripleLift's required format array must describe at least one banner size.
## What it means
TripleLift's required format array must describe at least one banner size. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"format": []
}
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.banner_format_empty at imp[0].banner.format.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# TripleLift labels format required but recommends w/h when it is absent. This request uses that documented fallback. · openrtb.profile.triplelift.banner_format_fallback · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-banner_format_fallback/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TripleLift labels format required but recommends w/h when it is absent. This request uses that documented fallback.
openrtb.profile.triplelift.banner_format_fallback warning Bid request
TripleLift labels format required but recommends w/h when it is absent. This request uses that documented fallback.
## What it means
TripleLift labels format required but recommends w/h when it is absent. This request uses that documented fallback. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"w": 320,
"h": 50
}
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.banner_format_fallback at imp[0].banner.format.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# TripleLift's app table requires bundle while its prose says an app ID or bundle is not strictly required. Confirm the active supplier contract. · openrtb.profile.triplelift.bundle_contract_conflict · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-bundle_contract_conflict/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TripleLift's app table requires bundle while its prose says an app ID or bundle is not strictly required. Confirm the active supplier contract.
openrtb.profile.triplelift.bundle_contract_conflict warning Bid request
TripleLift's app table requires bundle while its prose says an app ID or bundle is not strictly required. Confirm the active supplier contract.
## What it means
TripleLift's app table requires bundle while its prose says an app ID or bundle is not strictly required. Confirm the active supplier contract. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"banner": {
"format": [
{
"w": 320,
"h": 50
}
]
}
}
],
"app": {
"id": "app-1"
}
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.bundle_contract_conflict at app.bundle.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Native event and method IDs must be standard IDs or exchange-specific values of at least 500. · openrtb.profile.triplelift.event_enum · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-event_enum/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Native event and method IDs must be standard IDs or exchange-specific values of at least 500.
openrtb.profile.triplelift.event_enum error Bid response
Native event and method IDs must be standard IDs or exchange-specific values of at least 500.
## What it means
Native event and method IDs must be standard IDs or exchange-specific values of at least 500. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "tl-request",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"mtype": 4,
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"title\": {\"text\": \"Native title\"}}], \"link\": {\"url\": \"https://advertiser.example\"}, \"eventtrackers\": [{\"event\": 0, \"method\": 1}]}"
}
]
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.event_enum at seatbid[0].bid[0].adm.eventtrackers[0].event.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The returned Native event and tracking method must be among the request's declared options. · openrtb.profile.triplelift.event_unoffered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-event_unoffered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The returned Native event and tracking method must be among the request's declared options.
openrtb.profile.triplelift.event_unoffered error Request/response pair
The returned Native event and tracking method must be among the request's declared options.
## What it means
The returned Native event and tracking method must be among the request's declared options. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"native": {
"ver": "1.2",
"request": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1, \"title\": {\"len\": 25}}], \"eventtrackers\": [{\"event\": 1, \"methods\": [1, 2]}]}"
}
}
]
}
Response:
{
"id": "tl-request",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"mtype": 4,
"adm": "{\"native\": {\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"title\": {\"text\": \"Native title\"}}], \"link\": {\"url\": \"https://advertiser.example\"}, \"eventtrackers\": [{\"event\": 2, \"method\": 1}]}}"
}
]
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.event_unoffered at seatbid[0].bid[0].adm.native.eventtrackers[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# TripleLift recommends an exact or minimum native image dimension. · openrtb.profile.triplelift.image_size_recommended · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-image_size_recommended/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TripleLift recommends an exact or minimum native image dimension.
openrtb.profile.triplelift.image_size_recommended warning Bid request
TripleLift recommends an exact or minimum native image dimension.
## What it means
TripleLift recommends an exact or minimum native image dimension. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "tl-request",
"imp": [
{
"id": "1",
"tagid": "placement-1",
"native": {
"ver": "1.2",
"request": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"img\": {\"type\": 3}}], \"eventtrackers\": [{\"event\": 1, \"methods\": [1, 2]}]}"
}
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.image_size_recommended at imp[0].native.request.assets[0].img.wmin.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# TripleLift Native 1.2 jstracker contains HTML with script tags. · openrtb.profile.triplelift.jstracker_markup · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-triplelift-jstracker_markup/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## TripleLift Native 1.2 jstracker contains HTML with script tags.
openrtb.profile.triplelift.jstracker_markup error Bid response
TripleLift Native 1.2 jstracker contains HTML with script tags.
## What it means
TripleLift Native 1.2 jstracker contains HTML with script tags. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "tl-request",
"seatbid": [
{
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 1.2,
"mtype": 4,
"adm": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"title\": {\"text\": \"Native title\"}}], \"link\": {\"url\": \"https://advertiser.example\"}, \"jstracker\": \"track()\"}"
}
]
}
]
}
Profile triplelift-supplier, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.triplelift.jstracker_markup at seatbid[0].bid[0].adm.jstracker.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity accepts exactly one advertiser domain. · openrtb.profile.unity.advertiser_domain · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-advertiser_domain/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity accepts exactly one advertiser domain.
openrtb.profile.unity.advertiser_domain error Bid response
Unity accepts exactly one advertiser domain.
## What it means
Unity accepts exactly one advertiser domain. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1.234,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
1
],
"burl": "https://bidder.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML"
}
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.advertiser_domain at seatbid[0].bid[0].adomain[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity ext.crtype must be a documented creative type (case-insensitive). · openrtb.profile.unity.creative_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-creative_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity ext.crtype must be a documented creative type (case-insensitive).
openrtb.profile.unity.creative_type error Bid response
Unity ext.crtype must be a documented creative type (case-insensitive).
## What it means
Unity ext.crtype must be a documented creative type (case-insensitive). This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1.234,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "unknown"
}
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.creative_type at seatbid[0].bid[0].ext.crtype.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity response dealid must match a deal ID offered by the referenced impression. · openrtb.profile.unity.deal_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-deal_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity response dealid must match a deal ID offered by the referenced impression.
openrtb.profile.unity.deal_not_offered error Request/response pair
Unity response dealid must match a deal ID offered by the referenced impression.
## What it means
Unity response dealid must match a deal ID offered by the referenced impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "unity-final-control",
"at": 1,
"app": {
"id": "publisher"
},
"imp": [
{
"id": "1",
"secure": 1,
"instl": 0,
"banner": {
"w": 320,
"h": 50
},
"pmp": {
"deals": []
}
}
]
}
Response:
{
"id": "unity-final-control",
"cur": "USD",
"seatbid": [
{
"seat": "dsp",
"bid": [
{
"id": "creative",
"impid": "1",
"price": 0.75,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://dsp.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML"
},
"dealid": "offer-a"
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.deal_not_offered at seatbid[0].bid[0].dealid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity emits exactly one impression per request. · openrtb.profile.unity.impression_count · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-impression_count/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity emits exactly one impression per request.
openrtb.profile.unity.impression_count error Bid request
Unity emits exactly one impression per request.
## What it means
Unity emits exactly one impression per request. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "unity-request",
"at": 1,
"imp": [
{
"id": "1",
"secure": 1,
"instl": 0,
"banner": {
"w": 320,
"h": 50
}
},
{
"id": "1",
"secure": 1,
"instl": 0,
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"id": "publisher",
"bundle": "123456789"
}
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.impression_count at imp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity's sole impression has the string id 1. · openrtb.profile.unity.impression_id · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-impression_id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity's sole impression has the string id 1.
openrtb.profile.unity.impression_id error Bid request
Unity's sole impression has the string id 1.
## What it means
Unity's sole impression has the string id 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"at": 1,
"imp": [
{
"id": "2",
"secure": 1,
"instl": 0,
"banner": {
"w": 320,
"h": 50
}
}
],
"app": {
"id": "publisher",
"bundle": "123456789"
}
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.impression_id at imp[0].id.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity bid price must be greater than zero. · openrtb.profile.unity.price_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-price_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity bid price must be greater than zero.
openrtb.profile.unity.price_invalid error Bid response
Unity bid price must be greater than zero.
## What it means
Unity bid price must be greater than zero. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 0,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML"
}
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.price_invalid at seatbid[0].bid[0].price.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity accepts at most three decimal places in bid price. · openrtb.profile.unity.price_precision · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-price_precision/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity accepts at most three decimal places in bid price.
openrtb.profile.unity.price_precision error Bid response
Unity accepts at most three decimal places in bid price.
## What it means
Unity accepts at most three decimal places in bid price. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"cur": "USD",
"seatbid": [
{
"seat": "buyer",
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1.2345,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://bidder.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML"
}
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.price_precision at seatbid[0].bid[0].price.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity SKAdNetwork 2.x and 3.x campaign is an integer string from 1 through 100. · openrtb.profile.unity.skadn_campaign · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-skadn_campaign/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity SKAdNetwork 2.x and 3.x campaign is an integer string from 1 through 100.
openrtb.profile.unity.skadn_campaign error Bid response
Unity SKAdNetwork 2.x and 3.x campaign is an integer string from 1 through 100.
## What it means
Unity SKAdNetwork 2.x and 3.x campaign is an integer string from 1 through 100. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-final-control",
"cur": "USD",
"seatbid": [
{
"seat": "dsp",
"bid": [
{
"id": "creative",
"impid": "1",
"price": 0.75,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://dsp.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML",
"storeurl": "https://apps.apple.com/app/id123456789",
"skadn": {
"version": "2.2",
"network": "abcd123456.skadnetwork",
"campaign": "0",
"itunesitem": "123456789",
"sourceapp": "987654321",
"signature": "signature",
"nonce": "00000000-0000-4000-8000-000000000001",
"timestamp": "1700000000000"
}
},
"dealid": "offer-a",
"bundle": "123456789"
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.skadn_campaign at seatbid[0].bid[0].ext.skadn.campaign.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity SKAdNetwork sourceapp must identify the publisher app.bundle. · openrtb.profile.unity.skadn_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-skadn_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity SKAdNetwork sourceapp must identify the publisher app.bundle.
openrtb.profile.unity.skadn_mismatch error Bid request
Unity SKAdNetwork sourceapp must identify the publisher app.bundle.
## What it means
Unity SKAdNetwork sourceapp must identify the publisher app.bundle. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "unity-request",
"at": 1,
"imp": [
{
"id": "1",
"secure": 1,
"instl": 0,
"banner": {
"w": 320,
"h": 50
},
"ext": {
"skadn": {
"sourceapp": "other",
"versions": [
"2.0",
"2.2",
"3.0",
"4.0"
],
"skadnetids": [
"network.skadnetwork"
],
"skoverlay": 1,
"productpage": 1,
"ext": {
"ask": 1
}
}
}
}
],
"app": {
"id": "publisher",
"bundle": "123456789"
}
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.skadn_mismatch at imp[0].ext.skadn.sourceapp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity SKAdNetwork sourceidentifier is a four-digit string. · openrtb.profile.unity.skadn_sourceidentifier · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-skadn_sourceidentifier/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity SKAdNetwork sourceidentifier is a four-digit string.
openrtb.profile.unity.skadn_sourceidentifier error Bid response
Unity SKAdNetwork sourceidentifier is a four-digit string.
## What it means
Unity SKAdNetwork sourceidentifier is a four-digit string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-final-control",
"cur": "USD",
"seatbid": [
{
"seat": "dsp",
"bid": [
{
"id": "creative",
"impid": "1",
"price": 0.75,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://dsp.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML",
"storeurl": "https://apps.apple.com/app/id123456789",
"skadn": {
"version": "4.0",
"network": "abcd123456.skadnetwork",
"itunesitem": "123456789",
"sourceapp": "987654321",
"signature": "signature",
"nonce": "00000000-0000-4000-8000-000000000001",
"timestamp": "1700000000000",
"sourceidentifier": "123"
}
},
"dealid": "offer-a",
"bundle": "123456789"
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.skadn_sourceidentifier at seatbid[0].bid[0].ext.skadn.sourceidentifier.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity SKAdNetwork timestamp must be a Unix-milliseconds integer string. · openrtb.profile.unity.skadn_timestamp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-skadn_timestamp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity SKAdNetwork timestamp must be a Unix-milliseconds integer string.
openrtb.profile.unity.skadn_timestamp error Bid response
Unity SKAdNetwork timestamp must be a Unix-milliseconds integer string.
## What it means
Unity SKAdNetwork timestamp must be a Unix-milliseconds integer string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-final-control",
"cur": "USD",
"seatbid": [
{
"seat": "dsp",
"bid": [
{
"id": "creative",
"impid": "1",
"price": 0.75,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://dsp.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML",
"storeurl": "https://apps.apple.com/app/id123456789",
"skadn": {
"version": "2.2",
"network": "abcd123456.skadnetwork",
"campaign": "1",
"itunesitem": "123456789",
"sourceapp": "987654321",
"signature": "signature",
"nonce": "00000000-0000-4000-8000-000000000001",
"timestamp": "later"
}
},
"dealid": "offer-a",
"bundle": "123456789"
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.skadn_timestamp at seatbid[0].bid[0].ext.skadn.timestamp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity SKAdNetwork fidelities entries must be objects. · openrtb.profile.unity.type_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-type_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity SKAdNetwork fidelities entries must be objects.
openrtb.profile.unity.type_invalid error Bid response
Unity SKAdNetwork fidelities entries must be objects.
## What it means
Unity SKAdNetwork fidelities entries must be objects. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-final-control",
"cur": "USD",
"seatbid": [
{
"seat": "dsp",
"bid": [
{
"id": "creative",
"impid": "1",
"price": 0.75,
"adm": "Creative
",
"cat": [
"IAB9"
],
"adomain": [
"advertiser.example"
],
"burl": "https://dsp.example/bill",
"w": 320,
"h": 50,
"ext": {
"crtype": "HTML",
"appname": 7
},
"dealid": "offer-a"
}
]
}
]
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.type_invalid at seatbid[0].bid[0].ext.appname.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Unity video placement is 1 or 5. · openrtb.profile.unity.value_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-unity-value_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Unity video placement is 1 or 5.
openrtb.profile.unity.value_invalid error Bid request
Unity video placement is 1 or 5.
## What it means
Unity video placement is 1 or 5. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "unity-request",
"at": 1,
"imp": [
{
"id": "1",
"secure": 1,
"instl": 1,
"video": {
"mimes": [
"video/mp4"
],
"minduration": 5,
"maxduration": 30,
"protocols": [
2,
3,
5,
6
],
"w": 320,
"h": 480,
"pos": 7,
"placement": 3
}
}
],
"app": {
"id": "publisher",
"bundle": "123456789"
}
}
Profile unity, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.unity.value_invalid at imp[0].video.placement.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle treats the response currency as USD, including a supplied non-USD value. · openrtb.profile.vungle.currency_ignored · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-currency_ignored/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle treats the response currency as USD, including a supplied non-USD value.
openrtb.profile.vungle.currency_ignored warning Bid response
Vungle treats the response currency as USD, including a supplied non-USD value.
## What it means
Vungle treats the response currency as USD, including a supplied non-USD value. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "vungle-final-control",
"cur": "EUR",
"seatbid": [
{
"bid": [
{
"id": "creative",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.currency_ignored at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle IDFV extensions are emitted only for iOS devices. · openrtb.profile.vungle.idfv_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-idfv_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle IDFV extensions are emitted only for iOS devices.
openrtb.profile.vungle.idfv_context error Bid request
Vungle IDFV extensions are emitted only for iOS devices.
## What it means
Vungle IDFV extensions are emitted only for iOS devices. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "publisher-app",
"bundle": "123456789",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone)",
"ip": "203.0.113.2",
"w": 1080,
"h": 1920,
"connectiontype": 2,
"os": "iOS",
"ext": {
"ifv": "idfv",
"idfv": "idfv",
"atts": 2
},
"ifa": "12345678-1234-1234-1234-123456789012"
},
"imp": [
{
"id": "1",
"displaymanager": "Vungle",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0
},
"banner": {
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"id": "1",
"mimes": [
"text/html"
]
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.idfv_context at device.ext.ifv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle ext.ifv and ext.idfv must contain the same IDFV. · openrtb.profile.vungle.idfv_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-idfv_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle ext.ifv and ext.idfv must contain the same IDFV.
openrtb.profile.vungle.idfv_mismatch error Bid request
Vungle ext.ifv and ext.idfv must contain the same IDFV.
## What it means
Vungle ext.ifv and ext.idfv must contain the same IDFV. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "vungle-request",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "publisher-app",
"bundle": "123456789",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone)",
"ip": "203.0.113.2",
"w": 1080,
"h": 1920,
"connectiontype": 2,
"os": "iOS",
"ext": {
"ifv": "idfv",
"idfv": "other",
"atts": 2
}
},
"imp": [
{
"id": "1",
"displaymanager": "Vungle",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0
},
"banner": {
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"id": "1",
"mimes": [
"text/html"
]
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.idfv_mismatch at device.ext.idfv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle minimum-bid-to-win macros are supported only in lurl. · openrtb.profile.vungle.macro_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-macro_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle minimum-bid-to-win macros are supported only in lurl.
openrtb.profile.vungle.macro_context error Bid response
Vungle minimum-bid-to-win macros are supported only in lurl.
## What it means
Vungle minimum-bid-to-win macros are supported only in lurl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"nurl": "https://bidder.example/win?p=${MIN_BID_TO_WIN}"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.macro_context at seatbid[0].bid[0].nurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle Native app icons must be at least 80 by 80 pixels when supplied. · openrtb.profile.vungle.native_icon_size · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-native_icon_size/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle Native app icons must be at least 80 by 80 pixels when supplied.
openrtb.profile.vungle.native_icon_size error Bid response
Vungle Native app icons must be at least 80 by 80 pixels when supplied.
## What it means
Vungle Native app icons must be at least 80 by 80 pixels when supplied. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "{\"native\": {\"ver\": \"1.2\", \"link\": {\"url\": \"https://advertiser.example/app\"}, \"assets\": [{\"id\": 1, \"img\": {\"url\": \"https://cdn.example/main.png?cache=1\", \"w\": 1200, \"h\": 600}}, {\"id\": 5, \"img\": {\"url\": \"https://cdn.example/icon.jpg\", \"w\": 79, \"h\": 80}}]}}",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.native_icon_size at seatbid[0].bid[0].adm.native.assets[1].img.w.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle Native image URL must have a supported image file extension before its query or fragment. · openrtb.profile.vungle.native_image_extension · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-native_image_extension/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle Native image URL must have a supported image file extension before its query or fragment.
openrtb.profile.vungle.native_image_extension error Bid response
Vungle Native image URL must have a supported image file extension before its query or fragment.
## What it means
Vungle Native image URL must have a supported image file extension before its query or fragment. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "{\"native\": {\"ver\": \"1.2\", \"link\": {\"url\": \"https://advertiser.example/app\"}, \"assets\": [{\"id\": 1, \"img\": {\"url\": \"https://cdn.example/image?name=.png\", \"w\": 1200, \"h\": 600}}]}}",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.native_image_extension at seatbid[0].bid[0].adm.native.assets[0].img.url.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle Native requires main-image asset id 1. · openrtb.profile.vungle.native_main_image · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-native_main_image/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle Native requires main-image asset id 1.
openrtb.profile.vungle.native_main_image error Bid response
Vungle Native requires main-image asset id 1.
## What it means
Vungle Native requires main-image asset id 1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "{\"native\": {\"ver\": \"1.2\", \"link\": {\"url\": \"https://advertiser.example/app\"}, \"assets\": []}}",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.native_main_image at seatbid[0].bid[0].adm.native.assets.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle does not support Native the field. · openrtb.profile.vungle.native_unsupported · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-native_unsupported/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle does not support Native the field.
openrtb.profile.vungle.native_unsupported warning Bid response
Vungle does not support Native the field.
## What it means
Vungle does not support Native the field. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "vungle-final-control",
"cur": "USD",
"seatbid": [
{
"bid": [
{
"id": "creative",
"impid": "1",
"price": 1,
"adm": "{\"native\": {\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"img\": {\"url\": \"https://cdn.example/main.jpg\", \"w\": 1200, \"h\": 627}}], \"link\": {\"url\": \"https://advertiser.example\"}, \"jstracker\": \"\"}}",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.native_unsupported at seatbid[0].bid[0].adm.native.jstracker.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle supports Native Ads version 1.2. · openrtb.profile.vungle.native_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-native_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle supports Native Ads version 1.2.
openrtb.profile.vungle.native_version error Bid request
Vungle supports Native Ads version 1.2.
## What it means
Vungle supports Native Ads version 1.2. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-final-control",
"at": 1,
"tmax": 200,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "app",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Android SDK",
"ip": "192.0.2.1",
"w": 1080,
"h": 1920,
"connectiontype": 2
},
"imp": [
{
"id": "1",
"displaymanager": "VungleDroid",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0
},
"native": {
"ver": "1.1",
"request": "{\"ver\": \"1.2\", \"assets\": [{\"id\": 1, \"required\": 1, \"img\": {\"type\": 3, \"w\": 1200, \"h\": 627}}]}"
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.native_version at imp[0].native.ver.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle SKAdNetwork campaign must be an integer string in the version-specific range (1 through 100 before 4.0, 0 through 9999 in 4.0 and later). · openrtb.profile.vungle.skadn_campaign · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_campaign/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle SKAdNetwork campaign must be an integer string in the version-specific range (1 through 100 before 4.0, 0 through 9999 in 4.0 and later).
openrtb.profile.vungle.skadn_campaign error Bid response
Vungle SKAdNetwork campaign must be an integer string in the version-specific range (1 through 100 before 4.0, 0 through 9999 in 4.0 and later).
## What it means
Vungle SKAdNetwork campaign must be an integer string in the version-specific range (1 through 100 before 4.0, 0 through 9999 in 4.0 and later). This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"ext": {
"skadn": {
"version": "3.0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"network": "network.skadnetwork",
"campaign": "101",
"fidelities": [
{
"fidelity": 1,
"nonce": "44f6469a-5be4-4679-abb8-03af9b497b12",
"timestamp": "1648110176239",
"signature": "illustrative-signature"
}
]
}
},
"bundle": "987654321"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_campaign at seatbid[0].bid[0].ext.skadn.campaign.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle SKAdNetwork itunesitem must match the advertised bid.bundle when supplied. · openrtb.profile.vungle.skadn_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle SKAdNetwork itunesitem must match the advertised bid.bundle when supplied.
openrtb.profile.vungle.skadn_mismatch error Bid request
Vungle SKAdNetwork itunesitem must match the advertised bid.bundle when supplied.
## What it means
Vungle SKAdNetwork itunesitem must match the advertised bid.bundle when supplied. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
{
"id": "vungle-request",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "publisher-app",
"bundle": "123456789",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone)",
"ip": "203.0.113.2",
"w": 1080,
"h": 1920,
"connectiontype": 2,
"os": "iOS"
},
"imp": [
{
"id": "1",
"displaymanager": "Vungle",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0,
"skadn": {
"version": "3.0",
"versions": [
"2.0",
"2.2",
"3.0",
"4.0"
],
"sourceapp": "other",
"skadnetids": [
"network.skadnetwork"
],
"ext": {
"sko": 1
}
}
},
"banner": {
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"id": "1",
"mimes": [
"text/html"
]
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_mismatch at imp[0].ext.skadn.sourceapp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle SKAdNetwork fidelity nonce must use UUID syntax. · openrtb.profile.vungle.skadn_nonce · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_nonce/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle SKAdNetwork fidelity nonce must use UUID syntax.
openrtb.profile.vungle.skadn_nonce error Bid response
Vungle SKAdNetwork fidelity nonce must use UUID syntax.
## What it means
Vungle SKAdNetwork fidelity nonce must use UUID syntax. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"ext": {
"skadn": {
"version": "3.0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"network": "network.skadnetwork",
"campaign": "100",
"fidelities": [
{
"fidelity": 1,
"nonce": "not-uuid",
"timestamp": "1648110176239",
"signature": "illustrative-signature"
}
]
}
},
"bundle": "987654321"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_nonce at seatbid[0].bid[0].ext.skadn.fidelities[0].nonce.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle sourceidentifier is a four-digit integer string for SKAdNetwork 4.0 and later. · openrtb.profile.vungle.skadn_sourceidentifier · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_sourceidentifier/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle sourceidentifier is a four-digit integer string for SKAdNetwork 4.0 and later.
openrtb.profile.vungle.skadn_sourceidentifier error Bid response
Vungle sourceidentifier is a four-digit integer string for SKAdNetwork 4.0 and later.
## What it means
Vungle sourceidentifier is a four-digit integer string for SKAdNetwork 4.0 and later. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"ext": {
"skadn": {
"version": "4.0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"network": "network.skadnetwork",
"fidelities": [
{
"fidelity": 1,
"nonce": "44f6469a-5be4-4679-abb8-03af9b497b12",
"timestamp": "1648110176239",
"signature": "illustrative-signature"
}
],
"sourceidentifier": "123"
}
},
"bundle": "987654321"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_sourceidentifier at seatbid[0].bid[0].ext.skadn.sourceidentifier.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle SKAdNetwork timestamp is a Unix-milliseconds integer string. · openrtb.profile.vungle.skadn_timestamp · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_timestamp/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle SKAdNetwork timestamp is a Unix-milliseconds integer string.
openrtb.profile.vungle.skadn_timestamp error Bid response
Vungle SKAdNetwork timestamp is a Unix-milliseconds integer string.
## What it means
Vungle SKAdNetwork timestamp is a Unix-milliseconds integer string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"ext": {
"skadn": {
"version": "3.0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"network": "network.skadnetwork",
"campaign": "100",
"fidelities": [
{
"fidelity": 1,
"nonce": "44f6469a-5be4-4679-abb8-03af9b497b12",
"timestamp": "1.2",
"signature": "illustrative-signature"
}
]
}
},
"bundle": "987654321"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_timestamp at seatbid[0].bid[0].ext.skadn.fidelities[0].timestamp.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle request SKAdNetwork versions must be 2.0 or later; Vungle does not advertise 2.1. · openrtb.profile.vungle.skadn_version · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skadn_version/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle request SKAdNetwork versions must be 2.0 or later; Vungle does not advertise 2.1.
openrtb.profile.vungle.skadn_version error Bid request
Vungle request SKAdNetwork versions must be 2.0 or later; Vungle does not advertise 2.1.
## What it means
Vungle request SKAdNetwork versions must be 2.0 or later; Vungle does not advertise 2.1. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"at": 1,
"tmax": 300,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "publisher-app",
"bundle": "123456789",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone)",
"ip": "203.0.113.2",
"w": 1080,
"h": 1920,
"connectiontype": 2,
"os": "iOS"
},
"imp": [
{
"id": "1",
"displaymanager": "Vungle",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0,
"skadn": {
"version": "3.0",
"versions": [
"2.1"
],
"sourceapp": "123456789",
"skadnetids": [
"network.skadnetwork"
],
"ext": {
"sko": 1
}
}
},
"banner": {
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"id": "1",
"mimes": [
"text/html"
]
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skadn_version at imp[0].ext.skadn.versions[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle disallows other SKOverlay attributes when show is 0. · openrtb.profile.vungle.skoverlay_disabled · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-skoverlay_disabled/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle disallows other SKOverlay attributes when show is 0.
openrtb.profile.vungle.skoverlay_disabled error Bid response
Vungle disallows other SKOverlay attributes when show is 0.
## What it means
Vungle disallows other SKOverlay attributes when show is 0. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": "Creative
",
"adomain": [
"advertiser.example"
],
"ext": {
"skadn": {
"version": "3.0",
"itunesitem": "987654321",
"sourceapp": "123456789",
"network": "network.skadnetwork",
"campaign": "100",
"fidelities": [
{
"fidelity": 1,
"nonce": "44f6469a-5be4-4679-abb8-03af9b497b12",
"timestamp": "1648110176239",
"signature": "illustrative-signature"
}
],
"ext": {
"skoverlay": {
"show": 0,
"delay": 0,
"pos": 1
}
}
}
},
"bundle": "987654321"
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.skoverlay_disabled at seatbid[0].bid[0].ext.skadn.ext.skoverlay.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle user.ext.consent is an integer 0 or 1, or a configured TCF consent string. · openrtb.profile.vungle.type_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-type_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle user.ext.consent is an integer 0 or 1, or a configured TCF consent string.
openrtb.profile.vungle.type_invalid error Bid request
Vungle user.ext.consent is an integer 0 or 1, or a configured TCF consent string.
## What it means
Vungle user.ext.consent is an integer 0 or 1, or a configured TCF consent string. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-final-control",
"at": 1,
"tmax": 200,
"cur": [
"USD"
],
"source": {},
"app": {
"id": "app",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Android SDK",
"ip": "192.0.2.1",
"w": 1080,
"h": 1920,
"connectiontype": 2
},
"imp": [
{
"id": "1",
"displaymanager": "VungleDroid",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0
},
"banner": {
"id": "1",
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"mimes": [
"text/html"
]
}
}
],
"regs": {
"ext": null
}
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.type_invalid at regs.ext.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle source.ext.omidpn is vungle when supplied. · openrtb.profile.vungle.value_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-value_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle source.ext.omidpn is vungle when supplied.
openrtb.profile.vungle.value_invalid error Bid request
Vungle source.ext.omidpn is vungle when supplied.
## What it means
Vungle source.ext.omidpn is vungle when supplied. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"at": 1,
"tmax": 300,
"cur": [
"CNY"
],
"source": {},
"app": {
"id": "publisher-app",
"bundle": "123456789",
"cat": [
"IAB9"
],
"publisher": {
"id": "publisher"
}
},
"device": {
"ua": "Mozilla/5.0 (iPhone)",
"ip": "203.0.113.2",
"w": 1080,
"h": 1920,
"connectiontype": 2,
"os": "iOS"
},
"imp": [
{
"id": "1",
"displaymanager": "Vungle",
"displaymanagerver": "7.4.1",
"tagid": "placement",
"bidfloor": 0,
"bidfloorcur": "USD",
"secure": 1,
"clickbrowser": 0,
"ext": {
"pcta": 0
},
"banner": {
"w": 320,
"h": 50,
"format": [
{
"w": 320,
"h": 50
}
],
"id": "1",
"mimes": [
"text/html"
]
}
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.value_invalid at cur[0].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Vungle VAST markup must start its VAST element within the first 100 bytes. · openrtb.profile.vungle.vast_prefix · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-vungle-vast_prefix/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Vungle VAST markup must start its VAST element within the first 100 bytes.
openrtb.profile.vungle.vast_prefix error Bid response
Vungle VAST markup must start its VAST element within the first 100 bytes.
## What it means
Vungle VAST markup must start its VAST element within the first 100 bytes. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "vungle-request",
"seatbid": [
{
"bid": [
{
"id": "buyer-bid",
"impid": "1",
"price": 1,
"adm": " ",
"adomain": [
"advertiser.example"
]
}
]
}
]
}
Profile vungle, OpenRTB 2.5. The fixture asserts openrtb.profile.vungle.vast_prefix at seatbid[0].bid[0].adm.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr sends at most 64 blocked advertiser domains. · openrtb.profile.xandr.array_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-array_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr sends at most 64 blocked advertiser domains.
openrtb.profile.xandr.array_limit error Bid request
Xandr sends at most 64 blocked advertiser domains.
## What it means
Xandr sends at most 64 blocked advertiser domains. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
],
"badv": [
"advertiser-0.example",
"advertiser-1.example",
"advertiser-2.example",
"advertiser-3.example",
"advertiser-4.example",
"advertiser-5.example",
"advertiser-6.example",
"advertiser-7.example",
"advertiser-8.example",
"advertiser-9.example",
"advertiser-10.example",
"advertiser-11.example",
"advertiser-12.example",
"advertiser-13.example",
"advertiser-14.example",
"advertiser-15.example",
"advertiser-16.example",
"advertiser-17.example",
"advertiser-18.example",
"advertiser-19.example",
"advertiser-20.example",
"advertiser-21.example",
"advertiser-22.example",
"advertiser-23.example",
"advertiser-24.example",
"advertiser-25.example",
"advertiser-26.example",
"advertiser-27.example",
"advertiser-28.example",
"advertiser-29.example",
"advertiser-30.example",
"advertiser-31.example",
"advertiser-32.example",
"advertiser-33.example",
"advertiser-34.example",
"advertiser-35.example",
"advertiser-36.example",
"advertiser-37.example",
"advertiser-38.example",
"advertiser-39.example",
"advertiser-40.example",
"advertiser-41.example",
"advertiser-42.example",
"advertiser-43.example",
"advertiser-44.example",
"advertiser-45.example",
"advertiser-46.example",
"advertiser-47.example",
"advertiser-48.example",
"advertiser-49.example",
"advertiser-50.example",
"advertiser-51.example",
"advertiser-52.example",
"advertiser-53.example",
"advertiser-54.example",
"advertiser-55.example",
"advertiser-56.example",
"advertiser-57.example",
"advertiser-58.example",
"advertiser-59.example",
"advertiser-60.example",
"advertiser-61.example",
"advertiser-62.example",
"advertiser-63.example",
"advertiser-64.example"
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.array_limit at badv.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr non-impression payment bids require a billing notify URL in bid.burl. · openrtb.profile.xandr.billing_url_required · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-billing_url_required/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr non-impression payment bids require a billing notify URL in bid.burl.
openrtb.profile.xandr.billing_url_required error Bid response
Xandr non-impression payment bids require a billing notify URL in bid.burl.
## What it means
Xandr non-impression payment bids require a billing notify URL in bid.burl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Supply the missing information through the documented field or permitted alternative for this direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"appnexus": {
"bid_payment_type": [
{
"payment_type": 8
}
]
}
}
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.billing_url_required at seatbid[0].bid[0].burl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr does not document $the field}} in bid.the field. · openrtb.profile.xandr.notify_macro · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-notify_macro/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr does not document $the field}} in bid.the field.
openrtb.profile.xandr.notify_macro error Bid response
Xandr does not document $the field}} in bid.the field.
## What it means
Xandr does not document $the field}} in bid.the field. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"nurl": "https://notify.example/?value=${AUCTION_LOSS}"
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.notify_macro at seatbid[0].bid[0].nurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr viewable-impression payment bids support USD only. · openrtb.profile.xandr.payment_currency · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-payment_currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr viewable-impression payment bids support USD only.
openrtb.profile.xandr.payment_currency error Bid response
Xandr viewable-impression payment bids support USD only.
## What it means
Xandr viewable-impression payment bids support USD only. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"appnexus": {
"bid_payment_type": [
{
"payment_type": 8
}
]
}
},
"burl": "https://notify.example/bill"
}
]
}
],
"cur": "EUR"
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.payment_currency at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# The Xandr request does not offer this payment type for the referenced impression. · openrtb.profile.xandr.payment_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-payment_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## The Xandr request does not offer this payment type for the referenced impression.
openrtb.profile.xandr.payment_not_offered error Request/response pair
The Xandr request does not offer this payment type for the referenced impression.
## What it means
The Xandr request does not offer this payment type for the referenced impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"appnexus": {
"bid_payment_type": [
{
"payment_type": 8
}
]
}
},
"burl": "https://notify.example/bill"
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.payment_not_offered at seatbid[0].bid[0].ext.appnexus.bid_payment_type[0].payment_type.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# This Xandr creative is longer than the entire offered dynamic pod. · openrtb.profile.xandr.pod_duration · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-pod_duration/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## This Xandr creative is longer than the entire offered dynamic pod.
openrtb.profile.xandr.pod_duration error Request/response pair
This Xandr creative is longer than the entire offered dynamic pod.
## What it means
This Xandr creative is longer than the entire offered dynamic pod. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"video": {
"mimes": [
"video/mp4"
],
"protocols": [
2
],
"poddur": 60,
"maxseq": 1
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"dur": 61
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.pod_duration at seatbid[0].bid[0].dur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr bid.slotinpod may identify a guaranteed position only when the seller offered one. · openrtb.profile.xandr.slot_not_offered · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-slot_not_offered/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr bid.slotinpod may identify a guaranteed position only when the seller offered one.
openrtb.profile.xandr.slot_not_offered error Request/response pair
Xandr bid.slotinpod may identify a guaranteed position only when the seller offered one.
## What it means
Xandr bid.slotinpod may identify a guaranteed position only when the seller offered one. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"video": {
"mimes": [
"video/mp4"
],
"protocols": [
2
]
}
}
]
}
Response:
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"slotinpod": 1
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.slot_not_offered at seatbid[0].bid[0].slotinpod.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr custom macro values have a maximum length of 550 characters. · openrtb.profile.xandr.string_limit · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-string_limit/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr custom macro values have a maximum length of 550 characters.
openrtb.profile.xandr.string_limit error Bid response
Xandr custom macro values have a maximum length of 550 characters.
## What it means
Xandr custom macro values have a maximum length of 550 characters. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "request-1",
"seatbid": [
{
"seat": "buyer-code",
"bid": [
{
"id": "bid-1",
"impid": "imp-1",
"price": 1.5,
"ext": {
"dsa": {
"behalf": "ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé",
"paid": "Advertiser"
}
}
}
]
}
]
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.string_limit at seatbid[0].bid[0].ext.dsa.behalf.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Xandr the field has an invalid documented JSON type. · openrtb.profile.xandr.type_invalid · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-xandr-type_invalid/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Xandr the field has an invalid documented JSON type.
openrtb.profile.xandr.type_invalid error Bid request
Xandr the field has an invalid documented JSON type.
## What it means
Xandr the field has an invalid documented JSON type. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "request-1",
"imp": [
{
"id": "imp-1",
"banner": {
"w": 300,
"h": 250
}
}
],
"ext": {
"appnexus": []
}
}
Profile xandr, OpenRTB 2.6-202606. The fixture asserts openrtb.profile.xandr.type_invalid at ext.appnexus.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex SDK ad type must be banner, interstitial, rewarded, appopenad, or native. · openrtb.profile.yandex.ad_type · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-ad_type/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex SDK ad type must be banner, interstitial, rewarded, appopenad, or native.
openrtb.profile.yandex.ad_type error Bid request
Yandex SDK ad type must be banner, interstitial, rewarded, appopenad, or native.
## What it means
Yandex SDK ad type must be banner, interstitial, rewarded, appopenad, or native. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "yandex-request",
"tmax": 3000,
"cur": [
"USD"
],
"app": {
"bundle": "test.bundle"
},
"device": {
"ua": "SDK device",
"ip": "203.0.113.2"
},
"user": {
"data": [
{
"segment": [
{
"signal": "opaque-sdk-token"
}
]
}
]
},
"imp": [
{
"id": "1",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "video"
}
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.ad_type at imp[0].ext.ad_type.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex SDK Open Bidding requires the SDK bidder token in user.data[].segment[].signal. · openrtb.profile.yandex.bidder_token · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-bidder_token/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex SDK Open Bidding requires the SDK bidder token in user.data[].segment[].signal.
openrtb.profile.yandex.bidder_token error Bid request
Yandex SDK Open Bidding requires the SDK bidder token in user.data[].segment[].signal.
## What it means
Yandex SDK Open Bidding requires the SDK bidder token in user.data[].segment[].signal. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "yandex-request",
"tmax": 3000,
"cur": [
"USD"
],
"app": {
"bundle": "test.bundle"
},
"device": {
"ua": "SDK device",
"ip": "203.0.113.2"
},
"user": {
"data": []
},
"imp": [
{
"id": "1",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.bidder_token at user.data.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex SDK Open Bidding needs a supported request currency. · openrtb.profile.yandex.currency_offer · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-currency_offer/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex SDK Open Bidding needs a supported request currency.
openrtb.profile.yandex.currency_offer error Bid request
Yandex SDK Open Bidding needs a supported request currency.
## What it means
Yandex SDK Open Bidding needs a supported request currency. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented field type, value and representation at the reported path for this integration direction.
## Example that trips it
{
"id": "yandex-request",
"tmax": 3000,
"cur": [],
"app": {
"bundle": "test.bundle"
},
"device": {
"ua": "SDK device",
"ip": "203.0.113.2"
},
"user": {
"data": [
{
"segment": [
{
"signal": "opaque-sdk-token"
}
]
}
]
},
"imp": [
{
"id": "1",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.currency_offer at cur.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex SDK Open Bidding considers only the first impression. · openrtb.profile.yandex.ignored_impressions · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-ignored_impressions/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex SDK Open Bidding considers only the first impression.
openrtb.profile.yandex.ignored_impressions warning Bid request
Yandex SDK Open Bidding considers only the first impression.
## What it means
Yandex SDK Open Bidding considers only the first impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Review the documented processing behavior or source ambiguity before changing the payload. Confirm account-dependent exceptions with the destination.
## Example that trips it
{
"id": "yandex-request",
"tmax": 3000,
"cur": [
"USD"
],
"app": {
"bundle": "test.bundle"
},
"device": {
"ua": "SDK device",
"ip": "203.0.113.2"
},
"user": {
"data": [
{
"segment": [
{
"signal": "opaque-sdk-token"
}
]
}
]
},
"imp": [
{
"id": "1",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
},
{
"id": "2",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.ignored_impressions at imp[1].
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex SDK Open Bidding responses must reference the first offered impression. · openrtb.profile.yandex.impression_mismatch · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-impression_mismatch/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex SDK Open Bidding responses must reference the first offered impression.
openrtb.profile.yandex.impression_mismatch error Request/response pair
Yandex SDK Open Bidding responses must reference the first offered impression.
## What it means
Yandex SDK Open Bidding responses must reference the first offered impression. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use an option offered by the matching request. Check the request and response together at the reported path.
## Example that trips it
Request:
{
"id": "yandex-request",
"tmax": 3000,
"cur": [
"USD"
],
"app": {
"bundle": "test.bundle"
},
"device": {
"ua": "SDK device",
"ip": "203.0.113.2"
},
"user": {
"data": [
{
"segment": [
{
"signal": "opaque-sdk-token"
}
]
}
]
},
"imp": [
{
"id": "1",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
},
{
"id": "2",
"tagid": "configured-unit",
"banner": {
"w": 320,
"h": 50
},
"ext": {
"ad_type": "banner"
}
}
]
}
Response:
{
"id": "yandex-request",
"cur": "USD",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "2",
"price": 1,
"ext": {
"signaldata": "{\"cache_id\":\"opaque-ad\"}"
}
}
]
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.impression_mismatch at seatbid[0].bid[0].impid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# Yandex substitutes AUCTION_LOSS only in lurl and AUCTION_MIN_TO_WIN only in nurl or lurl. · openrtb.profile.yandex.macro_context · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-macro_context/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## Yandex substitutes AUCTION_LOSS only in lurl and AUCTION_MIN_TO_WIN only in nurl or lurl.
openrtb.profile.yandex.macro_context error Bid response
Yandex substitutes AUCTION_LOSS only in lurl and AUCTION_MIN_TO_WIN only in nurl or lurl.
## What it means
Yandex substitutes AUCTION_LOSS only in lurl and AUCTION_MIN_TO_WIN only in nurl or lurl. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Use the documented macro spelling and placement for this endpoint. Remove extra occurrences or unsupported contexts.
## Example that trips it
{
"id": "yandex-request",
"cur": "USD",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"ext": {
"signaldata": "{\"cache_id\":\"opaque-ad\"}"
},
"nurl": "https://events.example/?loss=${AUCTION_LOSS}"
}
]
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.macro_context at seatbid[0].bid[0].nurl.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# A Yandex SDK Open Bidding response contains one SeatBid and one bid. · openrtb.profile.yandex.response_count · RTBlint
URL: https://rtblint.org/docs/rule-reference/openrtb-profile-yandex-response_count/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Rule reference + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Rule reference
## A Yandex SDK Open Bidding response contains one SeatBid and one bid.
openrtb.profile.yandex.response_count error Bid response
A Yandex SDK Open Bidding response contains one SeatBid and one bid.
## What it means
A Yandex SDK Open Bidding response contains one SeatBid and one bid. This check applies to the selected vendor contract and integration direction.
## Why it matters
The declared profile checks the published partner contract alongside canonical OpenRTB. It does not verify runtime approval or account configuration.
## How to fix it
Keep the value within the published boundary described above. Check Unicode character counts where the contract counts characters.
## Example that trips it
{
"id": "yandex-request",
"cur": "USD",
"seatbid": [
{
"bid": [
{
"id": "bid",
"impid": "1",
"price": 1,
"ext": {
"signaldata": "{\"cache_id\":\"opaque-ad\"}"
}
},
{
"id": "bid",
"impid": "1",
"price": 1,
"ext": {
"signaldata": "{\"cache_id\":\"opaque-ad\"}"
}
}
]
}
]
}
Profile yandex-sdk-bidding, OpenRTB 2.5. The fixture asserts openrtb.profile.yandex.response_count at seatbid[0].bid.
## Check your payload
Paste a bid request or response into the tester to see whether this code fires against it, or gate on the id in CI with the CLI : the id is stable, wording is not.
Primary protocol documentation
Replayable source fixture
Back to the full diagnostic code reference .
---
# OpenRTB 2.0 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.0
Released 2012-01 4 cataloged changes
## What this release is
OpenRTB 2.0 is the release that made real-time bidding a shared protocol rather than a pile of exchange-specific APIs. It consolidated the earlier mobile and display efforts into one object model: BidRequest and BidResponse, imp, banner, video, site, app, device, and user. Every later 2.x version is an extension of this shape, which is why 2.0-era payloads still parse recognizably today.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.0
Change Kind Summary
device.geo Added behavior OpenRTB 2.0 improved geographic data handling across mobile and desktop transactions.
device.ifa Added field OpenRTB 2.0 added mobile device ID support for attribution and audience handling.
imp.video Added object OpenRTB 2.0 unified display, mobile, and video bidding around the shared Video object and VAST ad-unit support.
user.data Added field OpenRTB 2.0 expanded support for third-party audience data segments.
## Validate against 2.0
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.0 actually says. The same pin works in the CLI: rtblint validate --version 2.0 request.json .
Bid request JSON Schema for 2.0
Bid response JSON Schema for 2.0
## Adjacent versions
Next: OpenRTB 2.1
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.1 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.1
Released 2012-10 3 cataloged changes
## What this release is
OpenRTB 2.1 was a consolidation release: it clarified how VAST video rides in RTB transactions (including impressions that can sell as either banner or video), added IAB Tier-2 content categories, and introduced location-source provenance so a buyer can tell GPS-derived coordinates from ZIP-derived ones.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.1
Change Kind Summary
enum.content_category.tier2 Added list OpenRTB 2.1 added support for IAB Tier-2 content categories.
geo.type Added field OpenRTB 2.1 differentiated location-source provenance, such as GPS versus ZIP-derived targeting.
imp.video Added behavior OpenRTB 2.1 clarified VAST video support in RTB transactions, including mixed banner-or-video impressions.
## Validate against 2.1
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.1 actually says. The same pin works in the CLI: rtblint validate --version 2.1 request.json .
Bid request JSON Schema for 2.1
Bid response JSON Schema for 2.1
## Adjacent versions
Previous: OpenRTB 2.0
Next: OpenRTB 2.2
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.2 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.2
Released 2014-04 4 cataloged changes
## What this release is
OpenRTB 2.2 is where private marketplaces became first-class: expanded deal handling under imp.pmp, plus imp.secure for HTTPS inventory signaling and regs.coppa for child-directed traffic. It also sketched a feedback path for suspected bot traffic, an early acknowledgment that the bid stream needed quality signals.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.2
Change Kind Summary
imp.secure Added field OpenRTB 2.2 added secure versus non-secure inventory signaling.
imp.pmp.deals Added behavior OpenRTB 2.2 expanded private-marketplace deal handling.
regs.coppa Added field OpenRTB 2.2 added COPPA regulation signaling.
traffic.feedback.bot Added guidance OpenRTB 2.2 introduced a path for real-time feedback on suspected bot traffic between buyers and sellers.
## Validate against 2.2
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.2 actually says. The same pin works in the CLI: rtblint validate --version 2.2 request.json .
Bid request JSON Schema for 2.2
Bid response JSON Schema for 2.2
## Adjacent versions
Previous: OpenRTB 2.1
Next: OpenRTB 2.3
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.3 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.3
Released 2015-01 3 cataloged changes
## What this release is
OpenRTB 2.3 brought native advertising into the protocol: imp.native, the JSON-encoded native request payload, and the asset negotiation model between supply and demand. The native request's string-in-string encoding decision made here is still the source of the double-encoding bugs validators catch a decade later.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.3
Change Kind Summary
imp.native Added object OpenRTB 2.3 introduced native ad placements directly on the impression object.
imp.native.request Added field OpenRTB 2.3 added the native request payload for declaring required assets and fields.
native.assets Added behavior OpenRTB 2.3 allowed supply and demand to negotiate native asset availability and requirements in the bidstream.
## Validate against 2.3
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.3 actually says. The same pin works in the CLI: rtblint validate --version 2.3 request.json .
Bid request JSON Schema for 2.3
Bid response JSON Schema for 2.3
## Adjacent versions
Previous: OpenRTB 2.2
Next: OpenRTB 2.3.1
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.3.1 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-3-1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.3.1
Released 2015-06 2 cataloged changes
## What this release is
OpenRTB 2.3.1 is an errata release. It corrected the buyeruid attribute spelling and fixed the ${AUCTION_BID_ID} macro to substitute BidResponse.bidid. Small on paper, but exactly the class of correction that separates implementations that read the spec from implementations that copied an older SDK.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.3.1
Change Kind Summary
macro.${AUCTION_BID_ID} Added behavior OpenRTB 2.3.1 corrected the ${AUCTION_BID_ID} substitution target to BidResponse.bidid.
user.buyuid Corrected field OpenRTB 2.3.1 corrected the buyer-specific user ID attribute spelling to buyeruid.
## Validate against 2.3.1
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.3.1 actually says. The same pin works in the CLI: rtblint validate --version 2.3.1 request.json .
Bid request JSON Schema for 2.3.1
Bid response JSON Schema for 2.3.1
## Adjacent versions
Previous: OpenRTB 2.3
Next: OpenRTB 2.4
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.4 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.4
Released 2016-03 4 cataloged changes
## What this release is
OpenRTB 2.4 introduced the Audio object, making audio inventory biddable alongside banner, video, and native. It also added video skippability signaling (skip, skipmin, skipafter), broadened secure-asset expectations as the web moved to HTTPS, and increased geographic detail.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.4
Change Kind Summary
geo Added behavior OpenRTB 2.4 increased location support and geographic detail.
imp.audio Added object OpenRTB 2.4 introduced the Audio object for audio inventory.
imp.secure Added behavior OpenRTB 2.4 broadened SSL and secure-asset expectations for creatives.
imp.video.skip Added field OpenRTB 2.4 added video skippability support.
## Validate against 2.4
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.4 actually says. The same pin works in the CLI: rtblint validate --version 2.4 request.json .
Bid request JSON Schema for 2.4
Bid response JSON Schema for 2.4
## Adjacent versions
Previous: OpenRTB 2.3.1
Next: OpenRTB 2.5
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.5 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.5
Released 2016-12 6 cataloged changes
## What this release is
OpenRTB 2.5 was the workhorse version of the header-bidding era and remained the most common declared version for years. It added the Source object for upstream decisioning context, the Metric object for viewability signals, video placement-type signaling, seat blocking (bseat), creative language allow-listing, loss-notice macros, and the expanded response notice URLs (burl and friends).
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.5
Change Kind Summary
bid.burl Added field OpenRTB 2.5 expanded bid response notice URLs and creative metadata fields.
bidrequest.bseat Added field OpenRTB 2.5 added buyer seat blocking and creative language allow-listing on the bid request.
bidrequest.source Added field OpenRTB 2.5 added the Source object to model upstream decisioning and header bidding context.
imp.metric Added field OpenRTB 2.5 introduced the Metric object for historical viewability, CTR, and similar signals.
imp.video.placement Added field OpenRTB 2.5 added video placement-type and playback-cessation signaling.
macro.${AUCTION_MBR} Added macro OpenRTB 2.5 added auction minimum-bid and loss-notice macros.
## Validate against 2.5
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.5 actually says. The same pin works in the CLI: rtblint validate --version 2.5 request.json .
Bid request JSON Schema for 2.5
Bid response JSON Schema for 2.5
## Adjacent versions
Previous: OpenRTB 2.4
Next: OpenRTB 2.6-202204
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202204 archive: changes and validation limits · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202204
Released 2022-04 14 cataloged changes
## What this release is
The base OpenRTB 2.6 release was the largest single update in the protocol's history: CTV ad-pod bidding (pod controls and exact-duration rqddurs), rewarded and SSAI signaling, structured user-agent objects, cattax taxonomy selection, BCP 47 language fields, the AUCTION_MIN_TO_WIN macro, and the promotion of GDPR consent and the supply chain out of ext into core objects, alongside a sweep of removals of long-deprecated fields.
Validation note: The published 2.6-202204 archive has no machine-readable object tables, so RTBlint has no extracted catalog, generated JSON Schema, or exact-snapshot validation for it. Use 2.6-202210 as the earliest supported 2.6 baseline. That checks the October revision, not the exact April archive; verify any April-specific requirements against the original specification.
## Available coverage Release documentation Available Extracted object catalog Unavailable JSON Schemas Unavailable Exact-snapshot validation Unsupported
## What changed in 2.6-202204
Change Kind Summary
bid.apis Added field OpenRTB 2.6 added the multi-valued bid.apis field.
bid.mtype Added field OpenRTB 2.6 added bid-level markup-type signaling.
bidrequest.cattax Added field OpenRTB 2.6 standardized taxonomy selection with cattax across request and bid objects.
imp.video.sequence Deprecated field OpenRTB 2.6 deprecated legacy sequence, device-ID hash, demographic, and single-api fields.
imp.rwdd Added field OpenRTB 2.6 added rewarded-inventory and SSAI signaling on impressions.
imp.video.maxseq Added field OpenRTB 2.6 added pod-bidding controls for video and audio inventory.
imp.video.rqddurs Added field OpenRTB 2.6 added exact-duration requirements for video and audio creatives.
language.bcp47 Added behavior OpenRTB 2.6 added BCP 47-oriented language signaling, including wlangb-style fields for more precise locale handling.
macro.${AUCTION_MIN_TO_WIN} Added macro OpenRTB 2.6 added the AUCTION_MIN_TO_WIN substitution macro.
network Added object OpenRTB 2.6 added network, channel, supply-chain, and extended-ID object families.
regs.ext.gdpr Moved field OpenRTB 2.6 moved GDPR signaling out of regs.ext into the core regs object.
banner.wmax Removed field OpenRTB 2.6 removed fields that had already been deprecated in earlier revisions.
device.sua Added object OpenRTB 2.6 added structured user-agent and brand-version objects.
user.ext.consent Moved field OpenRTB 2.6 moved the TCF consent string from user.ext into the core user object.
## Choose a supported baseline
Exact validation for 2.6-202204 is unavailable. Open the tester against 2.6-202210 or run rtblint validate --version 2.6-202210 request.json . These check the October revision. Consult the April specification for requirements specific to that archive.
## Adjacent versions
Previous: OpenRTB 2.5
Next: OpenRTB 2.6-202210
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202210 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202210
Released 2022-10 Format republication
## What this release is
The October 2022 snapshot republished OpenRTB 2.6 in the repository-based format that made dated snapshots possible, and it is the earliest 2.6 snapshot RTBlint can fully validate against. If you target "2.6" without caring about a specific monthly update, this is the baseline to validate on.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202210
This snapshot introduced no new field-level rules; it republished the specification in the repository format that later dated snapshots build on. Payloads valid against the previous revision remain valid here.
## Validate against 2.6-202210
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202210 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202210 request.json .
Bid request JSON Schema for 2.6-202210
Bid response JSON Schema for 2.6-202210
## Adjacent versions
Previous: OpenRTB 2.6-202204
Next: OpenRTB 2.6-202211
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202211 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202211/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202211
Released 2022-11 3 cataloged changes
## What this release is
The November 2022 snapshot added the Global Privacy Platform to the protocol: regs.gpp and regs.gpp_sid, which have since become the primary consent channel for US state privacy law. It also added Qty and DOOH support for digital out-of-home inventory and moved inventorypartnerdomain into the core Site and App objects. This snapshot also marks the start of the current versioning policy: version numbers only move on breaking changes, and everything else ships as a dated snapshot.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202211
Change Kind Summary
imp.qty Added object OpenRTB 2.6-202211 added Qty and DOOH support for digital out-of-home inventory.
site.ext.inventorypartnerdomain Moved field OpenRTB 2.6-202211 moved inventorypartnerdomain from ext into the Site and App objects.
regs.gpp Added field OpenRTB 2.6-202211 added GPP consent signaling to the regs object.
## Validate against 2.6-202211
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202211 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202211 request.json .
Bid request JSON Schema for 2.6-202211
Bid response JSON Schema for 2.6-202211
## Adjacent versions
Previous: OpenRTB 2.6-202210
Next: OpenRTB 2.6-202303
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202303 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202303/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202303
Released 2023-04 4 cataloged changes
## What this release is
The March 2023 snapshot is the plcmt release: it added imp.video.plcmt with the AdCOM video placement subtypes and deprecated the legacy placement field. The two enums do not map one to one, which is why this migration is still generating validator findings three years later. It also added ad refresh signaling and an impression-fulfillment timestamp macro.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202303
Change Kind Summary
imp.refresh Added object OpenRTB 2.6-202303 added refresh signaling and refsettings guidance.
imp.video.placement Deprecated field OpenRTB 2.6-202303 deprecated the legacy placement field in favor of plcmt.
imp.video.plcmt Added field OpenRTB 2.6-202303 added plcmt for modern video placement semantics.
macro.${AUCTION_IMP_TS} Added macro OpenRTB 2.6-202303 added an impression-fulfillment timestamp substitution macro.
## Validate against 2.6-202303
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202303 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202303 request.json .
Bid request JSON Schema for 2.6-202303
Bid response JSON Schema for 2.6-202303
## Adjacent versions
Previous: OpenRTB 2.6-202211
Next: OpenRTB 2.6-202309
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202309 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202309/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202309
Released 2023-09 3 cataloged changes
## What this release is
The September 2023 snapshot deepened CTV economics: duration-aware floor objects (durfloors) for video, audio, and deals, guaranteed and CPM-per-second deal fields, and acat, the allowed advertiser category list that complements bcat.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202309
Change Kind Summary
bidrequest.acat Added field OpenRTB 2.6-202309 added allowed advertiser categories on the bid request.
deal.guaranteed Added field OpenRTB 2.6-202309 added guaranteed and CPM-per-second deal fields.
imp.video.durfloors Added object OpenRTB 2.6-202309 added duration-aware floor objects for video, audio, and deals.
## Validate against 2.6-202309
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202309 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202309 request.json .
Bid request JSON Schema for 2.6-202309
Bid response JSON Schema for 2.6-202309
## Adjacent versions
Previous: OpenRTB 2.6-202303
Next: OpenRTB 2.6-202402
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202402 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202402/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202402
Released 2024-02 1 cataloged change
## What this release is
The February 2024 snapshot is a single-purpose update: poddedupe, pod deduplication signaling so buyers can avoid the same creative appearing twice in one CTV ad pod, a direct response to competitive-separation complaints in streaming.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202402
Change Kind Summary
imp.video.poddedupe Added field OpenRTB 2.6-202402 added pod deduplication signaling for video pods.
## Validate against 2.6-202402
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202402 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202402 request.json .
Bid request JSON Schema for 2.6-202402
Bid response JSON Schema for 2.6-202402
## Adjacent versions
Previous: OpenRTB 2.6-202309
Next: OpenRTB 2.6-202409
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202409 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202409/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202409
Released 2024-09 2 cataloged changes
## What this release is
The September 2024 snapshot focused on identity: EID insertion, matcher, and match-method fields that let buyers evaluate how an extended ID was derived, plus cookie-based ID syncing guidance in the specification itself.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202409
Change Kind Summary
appendix.cookie_sync Added guidance OpenRTB 2.6-202409 added cookie-based ID syncing guidance to the specification.
eid.inserter Added field OpenRTB 2.6-202409 added EID insertion, matcher, and match-method fields.
## Validate against 2.6-202409
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202409 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202409 request.json .
Bid request JSON Schema for 2.6-202409
Bid response JSON Schema for 2.6-202409
## Adjacent versions
Previous: OpenRTB 2.6-202402
Next: OpenRTB 2.6-202501
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202501 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202501/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202501
Released 2025-01 1 cataloged change
## What this release is
The January 2025 snapshot added content.gtax and content.genres, giving CTV sellers a standardized genre taxonomy on the Content object instead of free-text genre strings.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202501
Change Kind Summary
content.gtax Added field OpenRTB 2.6-202501 added genre taxonomy and genres fields on content.
## Validate against 2.6-202501
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202501 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202501 request.json .
Bid request JSON Schema for 2.6-202501
Bid response JSON Schema for 2.6-202501
## Adjacent versions
Previous: OpenRTB 2.6-202409
Next: OpenRTB 2.6-202505
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202505 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202505/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202505
Released 2025-05 1 cataloged change
## What this release is
The May 2025 snapshot added data.cids, extended content identifiers on Data objects, extending the content-metadata channel that curation and contextual providers transact on.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202505
Change Kind Summary
data.cids Added field OpenRTB 2.6-202505 added extended content identifiers on Data objects.
## Validate against 2.6-202505
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202505 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202505 request.json .
Bid request JSON Schema for 2.6-202505
Bid response JSON Schema for 2.6-202505
## Adjacent versions
Previous: OpenRTB 2.6-202501
Next: OpenRTB 2.6-202606
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 2.6-202606 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/2-6-202606/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 2.6-202606
Released 2026-06 2 cataloged changes
## What this release is
The June 2026 snapshot sharpened live-content signaling: content.realtime and content.firstbroadcast, plus a redefinition of livestream semantics, aimed at live sports CTV. It also added seller discount macros and revised the ${AUCTION_PRICE} definition to account for them.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 2.6-202606
Change Kind Summary
content.realtime Added field OpenRTB 2.6-202606 added realtime and firstbroadcast attributes for signaling the liveness of programming on the Content object.
macro.${AUCTION_DISCOUNT_PCT} Added macro OpenRTB 2.6-202606 added seller discount substitution macros and revised the ${AUCTION_PRICE} definition.
## Validate against 2.6-202606
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 2.6-202606 actually says. The same pin works in the CLI: rtblint validate --version 2.6-202606 request.json .
Bid request JSON Schema for 2.6-202606
Bid response JSON Schema for 2.6-202606
## Adjacent versions
Previous: OpenRTB 2.6-202505
Next: OpenRTB 3.0
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# OpenRTB 3.0 spec: what changed, schema, validation · RTBlint
URL: https://rtblint.org/docs/openrtb-versions/3-0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · OpenRTB versions + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB versions
## OpenRTB 3.0
Released 2022-03 7 cataloged changes
## What this release is
OpenRTB 3.0 is not an upgrade of 2.x but a layered redesign: an Openrtb envelope carrying Request and Response transport objects, with all domain objects (what is for sale, what the ad is) delegated to AdCOM. It formalized billing and loss event notifications and specified ads.cert signed requests. Adoption remains narrow; most production traffic still runs 2.6.
Validation note: RTBlint validates the full 3.0 transport layer (envelope, Request, Item, Deal, Source, Response, Seatbid, Bid) and the AdCOM 1.0 domain objects under item.spec, bid.media, and request.context.
## Available coverage Release documentation Available Extracted object catalog Available JSON Schemas Available Exact-snapshot validation Supported
## What changed in 3.0
Change Kind Summary
inventory_authentication.ads.cert Added behavior OpenRTB 3.0 added signed bid request and inventory-authentication guidance via ads.cert.
event.pending Added object OpenRTB 3.0 formalized pending, billing, and loss event notifications.
request.item Structural shift OpenRTB 3.0 replaced the 2.x impression-centric payload shape with Item objects inside the request.
response.macro Added object OpenRTB 3.0 introduced a Macro object within the response model.
openrtb Structural shift OpenRTB 3.0 introduced the Openrtb root object as the container for transport and payload metadata.
request Structural shift OpenRTB 3.0 split the transaction into Request and Response payload objects under the layered architecture.
header.x-openrtb-version Added header OpenRTB 3.0 retained explicit version headers as part of the transport layer.
## Validate against 3.0
The tester can pin validation to this exact revision, so deprecated, moved, and not-yet-available findings reflect what 3.0 actually says. The same pin works in the CLI: rtblint validate --version 3.0 request.json .
Bid request JSON Schema for 3.0
Bid response JSON Schema for 3.0
## Adjacent versions
Previous: OpenRTB 2.6-202606
All versions: version index
Migrating across the big steps: 2.5 vs 2.6 and 2.6 vs 3.0
---
# ${AUCTION_ID} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_ID}
Available since 2.x core
## What it expands to
ID of the bid request, from BidRequest.id.
Expands in win (nurl), billing (burl), and loss (lurl) notice URLs and in adm markup. It carries BidRequest.id, the one identifier every party in the transaction logged.
## What to watch for
This is the fastest discrepancy-debugging key there is: when exchange and DSP counts disagree, joining logs on the expanded auction id shows exactly which impressions diverged.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_ID:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
${AUCTION_PRICE}
---
# ${AUCTION_BID_ID} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-bid-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_BID_ID}
Available since 2.x core
## What it expands to
ID of the bid, from BidResponse.bidid.
Expands in notice URLs and adm. It carries BidResponse.bidid, the bidder's own response identifier, so the buyer can tie a notice back to internal bid state.
## What to watch for
bidid is optional on the response. If you rely on this macro for reconciliation, set bidid on every response; an empty substitution means the response never carried one.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_BID_ID:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
${AUCTION_PRICE}
---
# ${AUCTION_IMP_ID} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-imp-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_IMP_ID}
Available since 2.x core
## What it expands to
ID of the impression just won, from imp.id.
Expands in notice URLs and adm with the imp.id of the impression the bid won.
## What to watch for
On multi-impression requests this is the only macro that says which slot cleared. Bidders that assume one imp per request tend to drop it and then cannot attribute wins per slot.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_IMP_ID:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
${AUCTION_PRICE}
---
# ${AUCTION_SEAT_ID} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-seat-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_SEAT_ID}
Available since 2.x core
## What it expands to
ID of the bidder seat for whom the bid was made.
Expands in notice URLs and adm with the seat id the bid was submitted under.
## What to watch for
Useful when one bidder endpoint serves many seats: without it, win notices cannot be attributed to the right buyer account.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_SEAT_ID:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_AD_ID}
${AUCTION_PRICE}
---
# ${AUCTION_AD_ID} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-ad-id/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_AD_ID}
Available since 2.x core
## What it expands to
ID of the ad markup the bidder wishes to serve, from bid.adid.
Expands in notice URLs and adm with bid.adid, the id of the ad markup the bidder chose.
## What to watch for
If your creatives rotate under one bid id, adid is what distinguishes them in delivery logs. Leave bid.adid unset and the macro expands empty.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_AD_ID:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_PRICE}
---
# ${AUCTION_PRICE} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-price/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_PRICE}
Available since 2.x core
## What it expands to
Clearing price in the same currency and units as the bid; the final price after discount.
Expands in nurl, burl, lurl, and adm with the clearing price, in the same currency and units as the bid. Since 2.6-202606 it is defined as the final price after any seller discount.
## What to watch for
This is the money macro. Two traps: exchanges may require it encrypted (agree on the scheme out of band), and in first-price auctions the clearing price is the bid, so a bidder that hardcodes second-price assumptions misreads its own win data. Pair it with the discount macros where the exchange applies seller discounts.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_PRICE:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_CURRENCY} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-currency/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_CURRENCY}
Available since 2.x core
## What it expands to
Currency of the bid, explicit or implied; confirmation only.
Expands with the currency of the bid, explicit or implied. Confirmation only; it does not convert anything.
## What to watch for
If you bid multi-currency, log this next to AUCTION_PRICE. A price without its currency is how JPY wins get booked as USD wins.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_CURRENCY:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_MBR} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-mbr/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_MBR}
Available since 2.5
## What it expands to
Market Bid Ratio: clearing price divided by bid price.
Market Bid Ratio: the clearing price divided by the bid price, added in 2.5. Some exchanges expand it instead of a cleartext price.
## What to watch for
MBR is the price-transparency compromise: you learn proportionally how much you paid without the exchange exposing absolute clearing prices. Your bidder must multiply by its own bid to recover the price.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_MBR:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_LOSS} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-loss/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_LOSS}
Available since 2.5
## What it expands to
Loss reason code; the code list lives in OpenRTB 3.0.
Expands only in the loss notice URL (lurl) with the loss reason code, added in 2.5. The code list itself is maintained in the OpenRTB 3.0 / shared documentation.
## What to watch for
Outside lurl it has no defined value. Every loss code has its own page here; start from the loss reason reference to decode what the exchange is telling you.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_LOSS:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_MIN_TO_WIN} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-min-to-win/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_MIN_TO_WIN}
Available since 2.6
## What it expands to
Minimum bid needed to win (or to tie the winner), same currency and units as the bid.
Expands in win and loss notices with the minimum bid that would have won (or tied) the auction, in bid currency and units. Added in 2.6.
## What to watch for
This is the input bid-shading models are built on. In a win notice it tells you how much you overpaid; in a loss notice, how far off you were. Treat an exchange that sends it as giving you free price discovery.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_MIN_TO_WIN:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_MULTIPLIER} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-multiplier/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_MULTIPLIER}
Available since 2.6 updates
## What it expands to
Total quantity of impressions won, for DOOH-style multi-viewer inventory; float, may be below 1.
Expands with the quantity of impressions won for multi-viewer inventory such as DOOH, a float that may be below 1. Added in the 2.6 updates.
## What to watch for
Billing for DOOH is price times multiplier. Ignore it and every DOOH win is booked as exactly one impression, which is wrong in both directions.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_MULTIPLIER:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_IMP_TS} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-imp-ts/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_IMP_TS}
Available since 2.6 updates
## What it expands to
Unix timestamp in milliseconds of when the impression was fulfilled.
Expands with the Unix timestamp in milliseconds of when the impression was fulfilled. Added in 2.6-202303.
## What to watch for
Fulfillment time is not auction time: for long CTV pods or delayed rendering the gap matters for attribution windows and billing disputes.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_IMP_TS:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_DISCOUNT_PCT} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-discount-pct/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_DISCOUNT_PCT}
Available since 2.6 updates
## What it expands to
Seller discount as a percentage of the bid price.
Expands with the seller discount as a percentage of the bid price. Added in 2.6-202606 alongside the revised AUCTION_PRICE definition.
## What to watch for
AUCTION_PRICE is now the post-discount price, so this macro is how you recover the pre-discount economics. Log both or your yield math silently changes when an exchange starts discounting.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_DISCOUNT_PCT:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# ${AUCTION_DISCOUNT_CPM} · OpenRTB substitution macro · RTBlint
URL: https://rtblint.org/docs/openrtb/macros/auction-discount-cpm/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Substitution macros + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Substitution macros
## ${AUCTION_DISCOUNT_CPM}
Available since 2.6 updates
## What it expands to
Seller discount expressed as a CPM.
Expands with the seller discount expressed as a CPM. Added in 2.6-202606 as the absolute-value twin of AUCTION_DISCOUNT_PCT.
## What to watch for
Same warning as the percentage form: post-202606, price plus discount macros together describe the transaction; the price alone no longer does.
## Encoding
When a macro rides inside another URL as a query parameter, the expanded value must survive URL parsing: exchanges support suffixed forms like ${AUCTION_DISCOUNT_CPM:B64} (base64) where documented, and values containing reserved characters must be percent-encoded. An unencoded expansion is the most common reason a notice URL truncates at the first ampersand.
## Related
All substitution macros
Where nurl, burl, and lurl fire in the delivery flow
Loss reason codes
${AUCTION_ID}
${AUCTION_BID_ID}
${AUCTION_IMP_ID}
${AUCTION_SEAT_ID}
${AUCTION_AD_ID}
---
# OpenRTB nbr 0: Unknown Error · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 0 : Unknown Error
Bidder-side error BidResponse.nbr
## What it means
Something failed and the bidder cannot say what.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 0 is unknown error .
## What to do about it
These codes mean the bidder could not process the request at all. If you are the seller receiving them, first validate the requests you send: a request that fails a bidder's parser produces exactly this family. If you are the bidder emitting them, your own logs, not the exchange's, hold the cause.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 1: Technical Error · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 1 : Technical Error
Bidder-side error BidResponse.nbr
## What it means
An internal failure on the bidder side (timeout, crash, dependency down).
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 1 is technical error .
## What to do about it
These codes mean the bidder could not process the request at all. If you are the seller receiving them, first validate the requests you send: a request that fails a bidder's parser produces exactly this family. If you are the bidder emitting them, your own logs, not the exchange's, hold the cause.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 2: Invalid Request · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 2 : Invalid Request
Bidder-side error BidResponse.nbr
## What it means
The bid request itself was malformed or failed the bidder's validation.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 2 is invalid request .
## What to do about it
These codes mean the bidder could not process the request at all. If you are the seller receiving them, first validate the requests you send: a request that fails a bidder's parser produces exactly this family. If you are the bidder emitting them, your own logs, not the exchange's, hold the cause.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 3: Known Web Crawler · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 3 : Known Web Crawler
Traffic quality BidResponse.nbr
## What it means
The user agent matched a known spider or bot list.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 3 is known web crawler .
## What to do about it
The bidder's invalid-traffic filters rejected the request source: crawler user agents, suspected non-human traffic, or data-center IPs. Persistent volume here is a supply-quality conversation, not a protocol bug; check what your device, ip, and user-agent fields actually carry.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 4: Suspected Non-Human Traffic · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 4 : Suspected Non-Human Traffic
Traffic quality BidResponse.nbr
## What it means
IVT filters flagged the request as likely bot traffic.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 4 is suspected non-human traffic .
## What to do about it
The bidder's invalid-traffic filters rejected the request source: crawler user agents, suspected non-human traffic, or data-center IPs. Persistent volume here is a supply-quality conversation, not a protocol bug; check what your device, ip, and user-agent fields actually carry.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 5: Cloud, Data Center, or Proxy IP · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 5 : Cloud, Data Center, or Proxy IP
Traffic quality BidResponse.nbr
## What it means
The IP resolved to hosting infrastructure, not an end user.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 5 is cloud, data center, or proxy ip .
## What to do about it
The bidder's invalid-traffic filters rejected the request source: crawler user agents, suspected non-human traffic, or data-center IPs. Persistent volume here is a supply-quality conversation, not a protocol bug; check what your device, ip, and user-agent fields actually carry.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 6: Unsupported Device · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 6 : Unsupported Device
Business rules and caps BidResponse.nbr
## What it means
The bidder does not buy on this device or OS.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 6 is unsupported device .
## What to do about it
The request was fine; the bidder chose not to buy. Unsupported devices, blocked publishers, unmatched users, and frequency caps are demand-side policy. The only sender-side lever is signal quality: complete device and app/site objects and usable identity signals reduce unmatched-user passes.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 7: Blocked Publisher or Site · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 7 : Blocked Publisher or Site
Business rules and caps BidResponse.nbr
## What it means
The site, app, or publisher is on the bidder's block list.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 7 is blocked publisher or site .
## What to do about it
The request was fine; the bidder chose not to buy. Unsupported devices, blocked publishers, unmatched users, and frequency caps are demand-side policy. The only sender-side lever is signal quality: complete device and app/site objects and usable identity signals reduce unmatched-user passes.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 8: Unmatched User · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/8/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 8 : Unmatched User
Business rules and caps BidResponse.nbr
## What it means
No usable user ID or cookie match, so the bidder cannot target.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 8 is unmatched user .
## What to do about it
The request was fine; the bidder chose not to buy. Unsupported devices, blocked publishers, unmatched users, and frequency caps are demand-side policy. The only sender-side lever is signal quality: complete device and app/site objects and usable identity signals reduce unmatched-user passes.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 9: Daily User Cap Met · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 9 : Daily User Cap Met
Business rules and caps BidResponse.nbr
## What it means
Frequency cap for this user already reached today.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 9 is daily user cap met .
## What to do about it
The request was fine; the bidder chose not to buy. Unsupported devices, blocked publishers, unmatched users, and frequency caps are demand-side policy. The only sender-side lever is signal quality: complete device and app/site objects and usable identity signals reduce unmatched-user passes.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 10: Daily Domain Cap Met · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/10/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 10 : Daily Domain Cap Met
Business rules and caps BidResponse.nbr
## What it means
Spend or impression cap for this domain already reached today.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 10 is daily domain cap met .
## What to do about it
The request was fine; the bidder chose not to buy. Unsupported devices, blocked publishers, unmatched users, and frequency caps are demand-side policy. The only sender-side lever is signal quality: complete device and app/site objects and usable identity signals reduce unmatched-user passes.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 11: Ads.txt Authorization Unavailable · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/11/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 11 : Ads.txt Authorization Unavailable
Supply authentication BidResponse.nbr
## What it means
The bidder could not retrieve an ads.txt file to verify the seller.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 11 is ads.txt authorization unavailable .
## What to do about it
The bidder could not verify the seller through ads.txt or ads.cert. Check that your ads.txt is reachable and lists the seller account exactly as the request declares it, and that the sellers.json entries the schain references resolve. These codes are the buyer telling you your trust chain does not check out.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 12: Ads.txt Authorization Violation · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/12/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 12 : Ads.txt Authorization Violation
Supply authentication BidResponse.nbr
## What it means
The seller is not authorized in the publisher's ads.txt.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 12 is ads.txt authorization violation .
## What to do about it
The bidder could not verify the seller through ads.txt or ads.cert. Check that your ads.txt is reachable and lists the seller account exactly as the request declares it, and that the sellers.json entries the schain references resolve. These codes are the buyer telling you your trust chain does not check out.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 13: Ads.cert Authentication Unavailable · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/13/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 13 : Ads.cert Authentication Unavailable
Supply authentication BidResponse.nbr
## What it means
No ads.cert signature was available to authenticate the request.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 13 is ads.cert authentication unavailable .
## What to do about it
The bidder could not verify the seller through ads.txt or ads.cert. Check that your ads.txt is reachable and lists the seller account exactly as the request declares it, and that the sellers.json entries the schain references resolve. These codes are the buyer telling you your trust chain does not check out.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 14: Ads.cert Authentication Violation · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/14/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 14 : Ads.cert Authentication Violation
Supply authentication BidResponse.nbr
## What it means
The ads.cert signature failed verification.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 14 is ads.cert authentication violation .
## What to do about it
The bidder could not verify the seller through ads.txt or ads.cert. Check that your ads.txt is reachable and lists the seller account exactly as the request declares it, and that the sellers.json entries the schain references resolve. These codes are the buyer telling you your trust chain does not check out.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 15: Insufficient Auction Time · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/15/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 15 : Insufficient Auction Time
Timing BidResponse.nbr
## What it means
Not enough time left inside tmax to run the bidder's own auction.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 15 is insufficient auction time .
## What to do about it
Insufficient auction time means the tmax budget left after network transit was too small for the bidder's own auction. Audit the tmax you send (the validator flags non-positive and implausible values) and where your latency to this bidder is going.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 16: Incomplete SupplyChain · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/16/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 16 : Incomplete SupplyChain
Supply chain BidResponse.nbr
## What it means
The SupplyChain object is missing nodes (complete != 1).
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 16 is incomplete supplychain .
## What to do about it
The SupplyChain object failed the bidder's policy: incomplete chains (complete != 1) or a blocked intermediary node. Validate the schain you send; duplicate nodes, missing hp flags, and empty identifiers all make a chain unverifiable.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 17: Blocked SupplyChain Node · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/17/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 17 : Blocked SupplyChain Node
Supply chain BidResponse.nbr
## What it means
A node in the SupplyChain object is on the bidder's block list.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 17 is blocked supplychain node .
## What to do about it
The SupplyChain object failed the bidder's policy: incomplete chains (complete != 1) or a blocked intermediary node. Validate the schain you send; duplicate nodes, missing hp flags, and empty identifiers all make a chain unverifiable.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB nbr 500+: Exchange-specific · RTBlint
URL: https://rtblint.org/docs/openrtb/nbr/exchange-specific/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
No-bid reason codes
## nbr 500+ : Exchange-specific
Exchange-specific BidResponse.nbr
## What it means
Private values; the spec says to communicate them with buyers beforehand.
A bidder returns nbr on an otherwise empty BidResponse to say why it is not bidding, instead of (or alongside) an HTTP 204. Code 500+ is exchange-specific .
## What to do about it
Values of 500 and above are private to the exchange. The spec expects them to be communicated to buyers out of band, so the integration docs of the exchange sending it are the only authoritative source.
## Related
The full nbr code table and how to debug a bidder that stops bidding
Loss reason codes: the other half of bid feedback
The validator rule for responses missing both seatbid and nbr
---
# OpenRTB loss reason 0: Bid Won · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 0 : Bid Won
Win Expanded via ${AUCTION_LOSS} in lurl
## What it means
Not a loss at all; exists so one notice pipeline can report every bid outcome.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
Code 0 is not a loss: it exists so one notice pipeline can report every bid outcome through the same lurl mechanism. If you see it in loss dashboards, your pipeline is misfiling wins.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 1 : Internal Error
Loss reason 2 : Impression Opportunity Expired
---
# OpenRTB loss reason 1: Internal Error · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 1 : Internal Error
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
Something failed inside the exchange while handling the bid.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 0 : Bid Won
Loss reason 2 : Impression Opportunity Expired
Loss reason 3 : Invalid Bid Response
---
# OpenRTB loss reason 2: Impression Opportunity Expired · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 2 : Impression Opportunity Expired
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The auction or impression window closed before the bid could be used.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 0 : Bid Won
Loss reason 1 : Internal Error
Loss reason 3 : Invalid Bid Response
Loss reason 4 : Invalid Deal ID
---
# OpenRTB loss reason 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 3 : Invalid Bid Response
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The response failed the exchange's parsing or validation.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 1 : Internal Error
Loss reason 2 : Impression Opportunity Expired
Loss reason 4 : Invalid Deal ID
Loss reason 5 : Invalid Auction ID
---
# OpenRTB loss reason 4: Invalid Deal ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 4 : Invalid Deal ID
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The dealid on the bid did not match any deal known to the exchange.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 2 : Impression Opportunity Expired
Loss reason 3 : Invalid Bid Response
Loss reason 5 : Invalid Auction ID
Loss reason 6 : Invalid Advertiser Domain
---
# OpenRTB loss reason 5: Invalid Auction ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 5 : Invalid Auction ID
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The bid's id did not match the request id of a live auction.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 3 : Invalid Bid Response
Loss reason 4 : Invalid Deal ID
Loss reason 6 : Invalid Advertiser Domain
Loss reason 7 : Missing Markup
---
# OpenRTB loss reason 6: Invalid Advertiser Domain · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 6 : Invalid Advertiser Domain
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The adomain was missing, malformed, or not allowed.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 4 : Invalid Deal ID
Loss reason 5 : Invalid Auction ID
Loss reason 7 : Missing Markup
Loss reason 8 : Missing Creative ID
---
# OpenRTB loss reason 7: Missing Markup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 7 : Missing Markup
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
No adm and no way to resolve markup for a bid that needed it.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 5 : Invalid Auction ID
Loss reason 6 : Invalid Advertiser Domain
Loss reason 8 : Missing Creative ID
Loss reason 9 : Missing Bid Price
---
# OpenRTB loss reason 8: Missing Creative ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/8/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 8 : Missing Creative ID
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The crid was absent and the exchange requires it.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 6 : Invalid Advertiser Domain
Loss reason 7 : Missing Markup
Loss reason 9 : Missing Bid Price
Loss reason 10 : Missing Minimum Creative Approval Data
---
# OpenRTB loss reason 9: Missing Bid Price · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 9 : Missing Bid Price
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
No price on the bid object.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 7 : Missing Markup
Loss reason 8 : Missing Creative ID
Loss reason 10 : Missing Minimum Creative Approval Data
Loss reason 100 : Bid was Below Auction Floor
---
# OpenRTB loss reason 10: Missing Minimum Creative Approval Data · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/10/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 10 : Missing Minimum Creative Approval Data
Invalid or incomplete response Expanded via ${AUCTION_LOSS} in lurl
## What it means
The exchange needed creative approval attributes that were not supplied.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The exchange discarded the bid before the auction: unparseable responses, unknown deal or auction ids, missing markup, creative id, or price. This family is entirely preventable at build time. Validate responses (against the originating request where possible) before they ship; the cross-validation rules catch unknown impids, unknown dealids, and missing markup exactly.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 8 : Missing Creative ID
Loss reason 9 : Missing Bid Price
Loss reason 100 : Bid was Below Auction Floor
Loss reason 101 : Bid was Below Deal Floor
---
# OpenRTB loss reason 100: Bid was Below Auction Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 100 : Bid was Below Auction Floor
Auction economics Expanded via ${AUCTION_LOSS} in lurl
## What it means
The bid did not clear bidfloor for the impression.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange compared bid.price with imp.bidfloor . The floor's currency is imp.bidfloorcur , which defaults to USD. A currency listed in the request cur array does not set the floor currency.
## What to change
Bid at or above that floor, or skip the impression. When the floor looks impossible, read imp.bidfloorcur before you change the price. A floor of 120 that you meant as yen, sent without JPY , is a 120 USD floor, and every bid under it returns 100. The floor signals page covers where each floor lives on the impression and on a deal.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 9 : Missing Bid Price
Loss reason 10 : Missing Minimum Creative Approval Data
Loss reason 101 : Bid was Below Deal Floor
Loss reason 102 : Lost to Higher Bid
---
# OpenRTB loss reason 101: Bid was Below Deal Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/101/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 101 : Bid was Below Deal Floor
Auction economics Expanded via ${AUCTION_LOSS} in lurl
## What it means
The bid referenced a deal but came in under that deal's floor.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The bid was valid and lost on price or eligibility: below a floor, outbid, beaten by a deal, or seat-blocked. The response side is fine; the lever is bidding strategy. Log AUCTION_MIN_TO_WIN wherever the exchange expands it, and check floors and deal terms in the request before pricing.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 10 : Missing Minimum Creative Approval Data
Loss reason 100 : Bid was Below Auction Floor
Loss reason 102 : Lost to Higher Bid
Loss reason 103 : Lost to a Bid for a Deal
---
# OpenRTB loss reason 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 102 : Lost to Higher Bid
Auction economics Expanded via ${AUCTION_LOSS} in lurl
## What it means
Straight economic loss; someone paid more.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
Read ${AUCTION_MIN_TO_WIN} on the loss notice when the exchange fills it. That value is the price that would have won. In a first-price auction, where at is 1, you pay what you bid, so this macro is the calibration point for bid shading. A run of 102, with no response or creative codes beside it, means the bidding price is the lever. The min-to-win macro is the substitution reference.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 100 : Bid was Below Auction Floor
Loss reason 101 : Bid was Below Deal Floor
Loss reason 103 : Lost to a Bid for a Deal
Loss reason 104 : Buyer Seat Blocked
---
# OpenRTB loss reason 103: Lost to a Bid for a Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 103 : Lost to a Bid for a Deal
Auction economics Expanded via ${AUCTION_LOSS} in lurl
## What it means
A deal-backed bid took priority over this open-auction bid.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The bid was valid and lost on price or eligibility: below a floor, outbid, beaten by a deal, or seat-blocked. The response side is fine; the lever is bidding strategy. Log AUCTION_MIN_TO_WIN wherever the exchange expands it, and check floors and deal terms in the request before pricing.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 101 : Bid was Below Deal Floor
Loss reason 102 : Lost to Higher Bid
Loss reason 104 : Buyer Seat Blocked
Loss reason 200 : Creative Filtered - General; Reason Unknown
---
# OpenRTB loss reason 104: Buyer Seat Blocked · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/104/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 104 : Buyer Seat Blocked
Auction economics Expanded via ${AUCTION_LOSS} in lurl
## What it means
The publisher or exchange blocks this seat on this inventory.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The bid was valid and lost on price or eligibility: below a floor, outbid, beaten by a deal, or seat-blocked. The response side is fine; the lever is bidding strategy. Log AUCTION_MIN_TO_WIN wherever the exchange expands it, and check floors and deal terms in the request before pricing.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 102 : Lost to Higher Bid
Loss reason 103 : Lost to a Bid for a Deal
Loss reason 200 : Creative Filtered - General; Reason Unknown
Loss reason 201 : Creative Filtered - Pending Processing by Exchange
---
# OpenRTB loss reason 200: Creative Filtered - General; Reason Unknown · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/200/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 200 : Creative Filtered - General; Reason Unknown
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative was filtered and the exchange is not saying why.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 103 : Lost to a Bid for a Deal
Loss reason 104 : Buyer Seat Blocked
Loss reason 201 : Creative Filtered - Pending Processing by Exchange
Loss reason 202 : Creative Filtered - Disapproved by Exchange
---
# OpenRTB loss reason 201: Creative Filtered - Pending Processing by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/201/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 201 : Creative Filtered - Pending Processing by Exchange
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative is still in scanning or approval and cannot serve yet.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 104 : Buyer Seat Blocked
Loss reason 200 : Creative Filtered - General; Reason Unknown
Loss reason 202 : Creative Filtered - Disapproved by Exchange
Loss reason 203 : Creative Filtered - Size Not Allowed
---
# OpenRTB loss reason 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 202 : Creative Filtered - Disapproved by Exchange
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative was reviewed and rejected.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
This creative was reviewed and rejected. Replace the crid , or clear the disapproval in the exchange's creative tool, before the next auction. Sending the same crid returns 202 again.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 200 : Creative Filtered - General; Reason Unknown
Loss reason 201 : Creative Filtered - Pending Processing by Exchange
Loss reason 203 : Creative Filtered - Size Not Allowed
Loss reason 204 : Creative Filtered - Incorrect Creative Format
---
# OpenRTB loss reason 203: Creative Filtered - Size Not Allowed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/203/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 203 : Creative Filtered - Size Not Allowed
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
Creative dimensions did not fit the impression.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange compared the creative's pixel size with the sizes on the impression. For a banner that is banner.w and banner.h , or any pair in banner.format . Video uses video.w and video.h .
## What to change
Send a size the impression listed. When banner.format is present, any listed pair is eligible. A single w and h , with no format array, means that size.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 201 : Creative Filtered - Pending Processing by Exchange
Loss reason 202 : Creative Filtered - Disapproved by Exchange
Loss reason 204 : Creative Filtered - Incorrect Creative Format
Loss reason 205 : Creative Filtered - Advertiser Exclusions
---
# OpenRTB loss reason 204: Creative Filtered - Incorrect Creative Format · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 204 : Creative Filtered - Incorrect Creative Format
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
Wrong media type or format for the slot (for example, video markup in a banner slot).
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 202 : Creative Filtered - Disapproved by Exchange
Loss reason 203 : Creative Filtered - Size Not Allowed
Loss reason 205 : Creative Filtered - Advertiser Exclusions
Loss reason 206 : Creative Filtered - App Store ID Exclusions
---
# OpenRTB loss reason 205: Creative Filtered - Advertiser Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 205 : Creative Filtered - Advertiser Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The advertiser is on a publisher or deal block list.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 203 : Creative Filtered - Size Not Allowed
Loss reason 204 : Creative Filtered - Incorrect Creative Format
Loss reason 206 : Creative Filtered - App Store ID Exclusions
Loss reason 207 : Creative Filtered - Not Secure
---
# OpenRTB loss reason 206: Creative Filtered - App Store ID Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 206 : Creative Filtered - App Store ID Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The promoted app's store ID is excluded.
OpenRTB 2.5 section 5.25 prints 206 as Creative Filtered - App Bundle Exclusions, and that list ends at 213. In September 2021 the current list renamed 206 from Bundle to App Store ID Exclusions and added 215 for App Bundle Exclusions. OpenRTB 2.6 does not print its own loss list: ${AUCTION_LOSS} points at the current table. The name in the heading above is the current one.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
On the current list, the exchange compared the promoted app's store id, carried on bid.bundle , with bapp and with any publisher or deal app block. Play ids are package names such as com.example.game . Apple ids are numeric.
## What to change
Drop that store id from the campaign on this inventory, and check the id format before you treat the loss as a policy block. An exchange that still implements the 2.5 table uses this same integer for a blocked bundle, which the current list reports as 215 .
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 204 : Creative Filtered - Incorrect Creative Format
Loss reason 205 : Creative Filtered - Advertiser Exclusions
Loss reason 207 : Creative Filtered - Not Secure
Loss reason 208 : Creative Filtered - Language Exclusions
---
# OpenRTB loss reason 207: Creative Filtered - Not Secure · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/207/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 207 : Creative Filtered - Not Secure
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative loads http resources into an https context.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange looked for an insecure URL in a creative served to an impression with imp.secure set to 1.
## What to change
Serve the markup, the media file, and every tracker on https. One http pixel inside an otherwise https adm is enough for the exchange to return 207.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 205 : Creative Filtered - Advertiser Exclusions
Loss reason 206 : Creative Filtered - App Store ID Exclusions
Loss reason 208 : Creative Filtered - Language Exclusions
Loss reason 209 : Creative Filtered - Category Exclusions
---
# OpenRTB loss reason 208: Creative Filtered - Language Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/208/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 208 : Creative Filtered - Language Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
Creative language is excluded for this inventory.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 206 : Creative Filtered - App Store ID Exclusions
Loss reason 207 : Creative Filtered - Not Secure
Loss reason 209 : Creative Filtered - Category Exclusions
Loss reason 210 : Creative Filtered - Creative Attribute Exclusions
---
# OpenRTB loss reason 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 209 : Creative Filtered - Category Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative's category hits bcat or a deal's category blocks.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 207 : Creative Filtered - Not Secure
Loss reason 208 : Creative Filtered - Language Exclusions
Loss reason 210 : Creative Filtered - Creative Attribute Exclusions
Loss reason 211 : Creative Filtered - Ad Type Exclusions
---
# OpenRTB loss reason 210: Creative Filtered - Creative Attribute Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 210 : Creative Filtered - Creative Attribute Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
A creative attribute (battr) is blocked, such as auto-play or expandable.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 208 : Creative Filtered - Language Exclusions
Loss reason 209 : Creative Filtered - Category Exclusions
Loss reason 211 : Creative Filtered - Ad Type Exclusions
Loss reason 212 : Creative Filtered - Animation Too Long
---
# OpenRTB loss reason 211: Creative Filtered - Ad Type Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/211/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 211 : Creative Filtered - Ad Type Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The ad type is not accepted on this placement.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 209 : Creative Filtered - Category Exclusions
Loss reason 210 : Creative Filtered - Creative Attribute Exclusions
Loss reason 212 : Creative Filtered - Animation Too Long
Loss reason 213 : Creative Filtered - Not Allowed in Deal
---
# OpenRTB loss reason 212: Creative Filtered - Animation Too Long · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/212/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 212 : Creative Filtered - Animation Too Long
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
Animation exceeds the publisher's duration limit.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange compared the creative's animation length with the limit on that placement. The OpenRTB request does not carry the limit as its own field. It lives in the publisher's or the exchange's creative policy.
## What to change
Shorten the animation, or stop the loop. A banner that loops with no finite duration keeps drawing 212 on every auction until the creative changes. A static frame, or an animation that ends inside the published limit, clears it.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 210 : Creative Filtered - Creative Attribute Exclusions
Loss reason 211 : Creative Filtered - Ad Type Exclusions
Loss reason 213 : Creative Filtered - Not Allowed in Deal
Loss reason 214 : Creative Filtered - Invalid SKAdNetwork
---
# OpenRTB loss reason 213: Creative Filtered - Not Allowed in Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/213/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 213 : Creative Filtered - Not Allowed in Deal
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The creative violates the terms of the deal it bid into.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 211 : Creative Filtered - Ad Type Exclusions
Loss reason 212 : Creative Filtered - Animation Too Long
Loss reason 214 : Creative Filtered - Invalid SKAdNetwork
Loss reason 215 : Creative Filtered - App Bundle Exclusions
---
# OpenRTB loss reason 214: Creative Filtered - Invalid SKAdNetwork · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/214/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 214 : Creative Filtered - Invalid SKAdNetwork
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The SKAdNetwork signature or fields failed validation.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
The 200-series means the exchange's creative policy rejected the ad after the auction logic: size, format, security, category, attribute, or store exclusions, or a creative still pending review. Compare what your adm actually contains against what the imp offered (the validator's markup-vs-mtype and markup-vs-imp checks catch format mismatches), and pre-sync creative approvals with exchanges that require review.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 212 : Creative Filtered - Animation Too Long
Loss reason 213 : Creative Filtered - Not Allowed in Deal
Loss reason 215 : Creative Filtered - App Bundle Exclusions
Loss reason 500+ : Exchange-specific
---
# OpenRTB loss reason 215: Creative Filtered - App Bundle Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/215/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 215 : Creative Filtered - App Bundle Exclusions
Creative filtered Expanded via ${AUCTION_LOSS} in lurl
## What it means
The promoted app bundle is excluded.
215 is on the current list and is absent from OpenRTB 2.5. That older list reported a blocked app bundle as 206 and stopped at 213. OpenRTB 2.6 points ${AUCTION_LOSS} at the current list, where 215 is the bundle exclusion and 206 is the store-id exclusion.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What the exchange checked
The exchange compared the promoted app bundle with the publisher's bundle exclusions.
## What to change
Remove the bundle from this inventory. An exchange that still speaks the 2.5 table sends 206 for this condition and does not send 215.
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 213 : Creative Filtered - Not Allowed in Deal
Loss reason 214 : Creative Filtered - Invalid SKAdNetwork
Loss reason 500+ : Exchange-specific
---
# OpenRTB loss reason 500+: Exchange-specific · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange-specific/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
Loss reason codes
## Loss reason 500+ : Exchange-specific
Exchange-specific Expanded via ${AUCTION_LOSS} in lurl
## What it means
Private values; the spec says to communicate them with buyers beforehand.
The exchange reports this code by expanding the ${AUCTION_LOSS} macro in the bid's loss notice URL ( lurl ). A bidder that does not set lurl never sees it, and never learns why it lost.
## What to do about it
Values of 500 and above are private to the exchange. Only that exchange's integration docs can decode them; ask your partner manager for the mapping.
These exchanges publish a numbered loss list:
Unity Exchange
Equativ
Google Authorized Buyers
Chartboost
Digital Turbine
Verve
Xandr
Google also publishes creative status codes , returned in ${CREATIVE_STATUS_CODE} rather than in ${AUCTION_LOSS} .
## Related
The full loss reason table
${AUCTION_MIN_TO_WIN} : the price-discovery companion macro
Loss reason 214 : Creative Filtered - Invalid SKAdNetwork
Loss reason 215 : Creative Filtered - App Bundle Exclusions
---
# Unity Exchange loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity Exchange loss reason codes
Unity publishes these integers in ${AUCTION_LOSS} . Codes 1000 and above are Unity's own list. They are not in the OpenRTB table. A bidder usually looks one up as a Unity RTB error plus the number.
## Published codes
Value Name Meaning
1000 Failed Unity validator The bid failed validation due to compliance with Unity's OpenRTB standards described in the request-response integration guides.
1001 Invalid JSON format The bid response is a malformed JSON.
1002 General marketplace rule block A catch-all error for marketplace blocks that occur in Unity Exchange.
1003 Max age rating exceeded The publisher blocked the bid due to the advertised app's age rating.
1004 Missing crtype in bid extension The bid extension did not include a crtype when responding to a consolidated bid request.
1005 Invalid crtype in bid extension The crtype ID was invalid or did not match any of the ad types sent in the consolidated bid request.
1006 Region block Publisher region block.
1007 Platform block Publisher platform block (iOS or Android).
1008 Sensitive attribute block Publisher block on demand containing sensitive attributes (for example: real money gambling).
1009 Unity subcategory block Publisher block on specified Unity subcategory.
1010 IAB category block Publisher block on specified IAB category.
1011 invalidBURLorImpTracking Bid is missing burl or ext.imptrackers .
1012 Bid Request Timeout Bid request has timed out.
1200 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1201 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1202 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1203 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1204 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1205 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1206 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1207 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1208 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user security-related issue.
1209 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to the creative only containing a blank image or serving a 1x1 pixel image (blanks).
1210 Creative filtered (approval denied - performance issue) The creative was disapproved by Unity's exchange review due to a performance issue.
1211 Creative filtered (approval denied - performance issue) The creative was disapproved by Unity's exchange review due to a performance issue.
1212 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a missing media file.
1213 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1214 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1215 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1216 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1217 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1218 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1219 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1220 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1221 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1222 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1223 Creative filtered (approval denied - performance issue) The creative was disapproved by Unity's exchange review due to a performance issue.
1224 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1225 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1226 Creative filtered (approval denied - offensive content) The creative was disapproved by Unity's exchange review due to offensive content.
1227 Creative filtered (approval denied - user security) The creative was disapproved by Unity's exchange review due to a user-security related issue.
1228 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1229 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1230 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1231 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1232 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1233 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
1234 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue.This decision was made with the use of automation. For more information on how Unity Ads uses automation, refer to the Unity Advertising Services Content Policy. If you have further questions about how Unity uses automation in moderation decisions, contact your Unity Ads representative.As noted by the code in the preceding table, restrictions might be due to an asset containing content that violates the Unity content policy. For additional information, contact your Unity Ads representative. You can find your additional redress options in the Unity Advertising Services Content Policy.
1235 Creative filtered (approval denied - creative quality) The creative was disapproved by Unity's exchange review due to a creative quality-related issue. The creative was moderated by Unity's review. For more information, contact your Unity Ads representative.
Published in the Unity Exchange loss notifications . The OpenRTB list these sit beside is the loss reason code table .
---
# Unity RTB error 1000: Failed Unity validator · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1000/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1000: Failed Unity validator
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The bid failed validation due to compliance with Unity's OpenRTB standards described in the request-response integration guides.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1000 is this code.
## What to change
Validate the bid response against the OpenRTB version Unity sent before it leaves your bidder. Unity's validator rejected the payload.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1001 : Invalid JSON format
Unity RTB error 1002 : General marketplace rule block
---
# Unity RTB error 1001: Invalid JSON format · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1001/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1001: Invalid JSON format
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The bid response is a malformed JSON.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1001 is this code.
## What to change
The body was not valid JSON. Fix the serializer. A trailing comma, or a string where Unity expects a number, is enough to return 1001.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1000 : Failed Unity validator
Unity RTB error 1002 : General marketplace rule block
Unity RTB error 1003 : Max age rating exceeded
---
# Unity RTB error 1002: General marketplace rule block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1002/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1002: General marketplace rule block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
A catch-all error for marketplace blocks that occur in Unity Exchange.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1002 is this code.
## What to change
Unity blocked the bid under a marketplace rule and did not use a narrower code. Check the publisher blocks Unity also reports as 1003 through 1010: age rating, region, platform, sensitive attributes, and category.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1000 : Failed Unity validator
Unity RTB error 1001 : Invalid JSON format
Unity RTB error 1003 : Max age rating exceeded
Unity RTB error 1004 : Missing crtype in bid extension
---
# Unity RTB error 1003: Max age rating exceeded · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1003/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1003: Max age rating exceeded
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The publisher blocked the bid due to the advertised app's age rating.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1003 is this code.
## What to change
The advertised app's age rating is above the publisher's maximum. Stop bidding that app on this inventory.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1001 : Invalid JSON format
Unity RTB error 1002 : General marketplace rule block
Unity RTB error 1004 : Missing crtype in bid extension
Unity RTB error 1005 : Invalid crtype in bid extension
---
# Unity RTB error 1004: Missing crtype in bid extension · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1004/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1004: Missing crtype in bid extension
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The bid extension did not include a crtype when responding to a consolidated bid request.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1004 is this code.
## What was checked
Unity checked crtype on the bid extension against the ad types on a consolidated request.
## What to change
A consolidated Unity request expects crtype on the bid extension. Add it, using one of the ad types Unity listed on the request.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1002 : General marketplace rule block
Unity RTB error 1003 : Max age rating exceeded
Unity RTB error 1005 : Invalid crtype in bid extension
Unity RTB error 1006 : Region block
---
# Unity RTB error 1005: Invalid crtype in bid extension · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1005/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1005: Invalid crtype in bid extension
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The crtype ID was invalid or did not match any of the ad types sent in the consolidated bid request.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1005 is this code.
## What was checked
Unity checked crtype on the bid extension against the ad types on a consolidated request.
## What to change
crtype has to be one of the ad types Unity sent on the consolidated request. An id outside that list returns 1005.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1003 : Max age rating exceeded
Unity RTB error 1004 : Missing crtype in bid extension
Unity RTB error 1006 : Region block
Unity RTB error 1007 : Platform block
---
# Unity RTB error 1006: Region block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1006/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1006: Region block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Publisher region block.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1006 is this code.
## What was checked
Unity checked the request region against the publisher's region block.
## What to change
The publisher blocked this region. Drop the campaign from that region.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1004 : Missing crtype in bid extension
Unity RTB error 1005 : Invalid crtype in bid extension
Unity RTB error 1007 : Platform block
Unity RTB error 1008 : Sensitive attribute block
---
# Unity RTB error 1007: Platform block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1007/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1007: Platform block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Publisher platform block (iOS or Android).
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1007 is this code.
## What was checked
Unity checked the request platform, iOS or Android, against the publisher's platform block.
## What to change
The publisher blocked this platform, iOS or Android. Bid the platform the request allows, or skip it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1005 : Invalid crtype in bid extension
Unity RTB error 1006 : Region block
Unity RTB error 1008 : Sensitive attribute block
Unity RTB error 1009 : Unity subcategory block
---
# Unity RTB error 1008: Sensitive attribute block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1008/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1008: Sensitive attribute block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Publisher block on demand containing sensitive attributes (for example: real money gambling).
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1008 is this code.
## What to change
The publisher blocked a sensitive attribute on the demand, for example real-money gambling. Remove that attribute from the bid.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1006 : Region block
Unity RTB error 1007 : Platform block
Unity RTB error 1009 : Unity subcategory block
Unity RTB error 1010 : IAB category block
---
# Unity RTB error 1009: Unity subcategory block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1009/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1009: Unity subcategory block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Publisher block on specified Unity subcategory.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1009 is this code.
## What to change
The publisher blocked this Unity subcategory. Take the campaign off that subcategory.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1007 : Platform block
Unity RTB error 1008 : Sensitive attribute block
Unity RTB error 1010 : IAB category block
Unity RTB error 1011 : invalidBURLorImpTracking
---
# Unity RTB error 1010: IAB category block · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1010/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1010: IAB category block
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Publisher block on specified IAB category.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1010 is this code.
## What was checked
Unity checked the bid's IAB category against the publisher's category block.
## What to change
The publisher blocked this IAB category. It is the same class of block as OpenRTB loss reason 209, reported with Unity's integer.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1008 : Sensitive attribute block
Unity RTB error 1009 : Unity subcategory block
Unity RTB error 1011 : invalidBURLorImpTracking
Unity RTB error 1012 : Bid Request Timeout
---
# Unity RTB error 1011: invalidBURLorImpTracking · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1011/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1011: invalidBURLorImpTracking
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Bid is missing burl or ext.imptrackers .
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1011 is this code.
## What was checked
Unity checked the bid for a billing notice on burl or impression trackers on ext.imptrackers .
## What to change
Put a billing notice URL on burl , or impression trackers on ext.imptrackers . Unity rejects the bid when both are missing.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1009 : Unity subcategory block
Unity RTB error 1010 : IAB category block
Unity RTB error 1012 : Bid Request Timeout
Unity RTB error 1200 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1012: Bid Request Timeout · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1012/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1012: Bid Request Timeout
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
Bid request has timed out.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1012 is this code.
## What to change
Unity timed the bid request out. The response arrived after the auction window. Shorten the work inside tmax , or stop bidding requests you cannot answer in time.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1010 : IAB category block
Unity RTB error 1011 : invalidBURLorImpTracking
Unity RTB error 1200 : Creative filtered (approval denied - user security)
Unity RTB error 1201 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1200: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1200/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1200: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1200 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1200. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1011 : invalidBURLorImpTracking
Unity RTB error 1012 : Bid Request Timeout
Unity RTB error 1201 : Creative filtered (approval denied - user security)
Unity RTB error 1202 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1201: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1201/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1201: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1201 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1201. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1012 : Bid Request Timeout
Unity RTB error 1200 : Creative filtered (approval denied - user security)
Unity RTB error 1202 : Creative filtered (approval denied - user security)
Unity RTB error 1203 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1202: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1202: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1202 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1202. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1200 : Creative filtered (approval denied - user security)
Unity RTB error 1201 : Creative filtered (approval denied - user security)
Unity RTB error 1203 : Creative filtered (approval denied - user security)
Unity RTB error 1204 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1203: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1203/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1203: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1203 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1203. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1201 : Creative filtered (approval denied - user security)
Unity RTB error 1202 : Creative filtered (approval denied - user security)
Unity RTB error 1204 : Creative filtered (approval denied - user security)
Unity RTB error 1205 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1204: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1204: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1204 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1204. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1202 : Creative filtered (approval denied - user security)
Unity RTB error 1203 : Creative filtered (approval denied - user security)
Unity RTB error 1205 : Creative filtered (approval denied - user security)
Unity RTB error 1206 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1205: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1205: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1205 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1205. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1203 : Creative filtered (approval denied - user security)
Unity RTB error 1204 : Creative filtered (approval denied - user security)
Unity RTB error 1206 : Creative filtered (approval denied - user security)
Unity RTB error 1207 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1206: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1206: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1206 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1206. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1204 : Creative filtered (approval denied - user security)
Unity RTB error 1205 : Creative filtered (approval denied - user security)
Unity RTB error 1207 : Creative filtered (approval denied - user security)
Unity RTB error 1208 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1207: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1207/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1207: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1207 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1207. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1205 : Creative filtered (approval denied - user security)
Unity RTB error 1206 : Creative filtered (approval denied - user security)
Unity RTB error 1208 : Creative filtered (approval denied - user security)
Unity RTB error 1209 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1208: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1208/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1208: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user security-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1208 is this code.
## What was checked
Unity's public table gives 1200 through 1208 one review reason: user security. This page is 1208. Unity does not publish a separate cause for each integer in that run. The creative on the bid failed that review.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1206 : Creative filtered (approval denied - user security)
Unity RTB error 1207 : Creative filtered (approval denied - user security)
Unity RTB error 1209 : Creative filtered (approval denied - creative quality)
Unity RTB error 1210 : Creative filtered (approval denied - performance issue)
---
# Unity RTB error 1209: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1209: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to the creative only containing a blank image or serving a 1x1 pixel image (blanks).
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1209 is this code.
## What to change
Unity rejected a blank creative or a 1x1 pixel. Send a real asset. A tracking pixel in the creative slot returns 1209.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1207 : Creative filtered (approval denied - user security)
Unity RTB error 1208 : Creative filtered (approval denied - user security)
Unity RTB error 1210 : Creative filtered (approval denied - performance issue)
Unity RTB error 1211 : Creative filtered (approval denied - performance issue)
---
# Unity RTB error 1210: Creative filtered (approval denied - performance issue) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1210: Creative filtered (approval denied - performance issue)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a performance issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1210 is this code.
## What was checked
Unity groups 1210 with its other performance disapprovals (1210, 1211, and 1223). The public table does not name the metric that failed.
## What to change
Unity's review rejected the creative for a performance problem. Lighten the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1208 : Creative filtered (approval denied - user security)
Unity RTB error 1209 : Creative filtered (approval denied - creative quality)
Unity RTB error 1211 : Creative filtered (approval denied - performance issue)
Unity RTB error 1212 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1211: Creative filtered (approval denied - performance issue) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1211/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1211: Creative filtered (approval denied - performance issue)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a performance issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1211 is this code.
## What was checked
Unity groups 1211 with its other performance disapprovals (1210, 1211, and 1223). The public table does not name the metric that failed.
## What to change
Unity's review rejected the creative for a performance problem. Lighten the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1209 : Creative filtered (approval denied - creative quality)
Unity RTB error 1210 : Creative filtered (approval denied - performance issue)
Unity RTB error 1212 : Creative filtered (approval denied - creative quality)
Unity RTB error 1213 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1212: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1212/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1212: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a missing media file.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1212 is this code.
## What to change
The creative Unity reviewed had no media file. Attach the asset and resubmit.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1210 : Creative filtered (approval denied - performance issue)
Unity RTB error 1211 : Creative filtered (approval denied - performance issue)
Unity RTB error 1213 : Creative filtered (approval denied - offensive content)
Unity RTB error 1214 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1213: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1213/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1213: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1213 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1213. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1211 : Creative filtered (approval denied - performance issue)
Unity RTB error 1212 : Creative filtered (approval denied - creative quality)
Unity RTB error 1214 : Creative filtered (approval denied - offensive content)
Unity RTB error 1215 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1214: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1214/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1214: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1214 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1214. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1212 : Creative filtered (approval denied - creative quality)
Unity RTB error 1213 : Creative filtered (approval denied - offensive content)
Unity RTB error 1215 : Creative filtered (approval denied - offensive content)
Unity RTB error 1216 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1215: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1215/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1215: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1215 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1215. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1213 : Creative filtered (approval denied - offensive content)
Unity RTB error 1214 : Creative filtered (approval denied - offensive content)
Unity RTB error 1216 : Creative filtered (approval denied - offensive content)
Unity RTB error 1217 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1216: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1216/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1216: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1216 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1216. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1214 : Creative filtered (approval denied - offensive content)
Unity RTB error 1215 : Creative filtered (approval denied - offensive content)
Unity RTB error 1217 : Creative filtered (approval denied - offensive content)
Unity RTB error 1218 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1217: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1217/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1217: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1217 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1217. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1215 : Creative filtered (approval denied - offensive content)
Unity RTB error 1216 : Creative filtered (approval denied - offensive content)
Unity RTB error 1218 : Creative filtered (approval denied - offensive content)
Unity RTB error 1219 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1218: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1218/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1218: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1218 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1218. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1216 : Creative filtered (approval denied - offensive content)
Unity RTB error 1217 : Creative filtered (approval denied - offensive content)
Unity RTB error 1219 : Creative filtered (approval denied - offensive content)
Unity RTB error 1220 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1219: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1219/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1219: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1219 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1219. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1217 : Creative filtered (approval denied - offensive content)
Unity RTB error 1218 : Creative filtered (approval denied - offensive content)
Unity RTB error 1220 : Creative filtered (approval denied - offensive content)
Unity RTB error 1221 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1220: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1220/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1220: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1220 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1220. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1218 : Creative filtered (approval denied - offensive content)
Unity RTB error 1219 : Creative filtered (approval denied - offensive content)
Unity RTB error 1221 : Creative filtered (approval denied - offensive content)
Unity RTB error 1222 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1221: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1221/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1221: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1221 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1221. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1219 : Creative filtered (approval denied - offensive content)
Unity RTB error 1220 : Creative filtered (approval denied - offensive content)
Unity RTB error 1222 : Creative filtered (approval denied - offensive content)
Unity RTB error 1223 : Creative filtered (approval denied - performance issue)
---
# Unity RTB error 1222: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1222/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1222: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1222 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1222. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1220 : Creative filtered (approval denied - offensive content)
Unity RTB error 1221 : Creative filtered (approval denied - offensive content)
Unity RTB error 1223 : Creative filtered (approval denied - performance issue)
Unity RTB error 1224 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1223: Creative filtered (approval denied - performance issue) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1223/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1223: Creative filtered (approval denied - performance issue)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a performance issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1223 is this code.
## What was checked
Unity groups 1223 with its other performance disapprovals (1210, 1211, and 1223). The public table does not name the metric that failed.
## What to change
Unity's review rejected the creative for a performance problem. Lighten the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1221 : Creative filtered (approval denied - offensive content)
Unity RTB error 1222 : Creative filtered (approval denied - offensive content)
Unity RTB error 1224 : Creative filtered (approval denied - offensive content)
Unity RTB error 1225 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1224: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1224/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1224: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1224 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1224. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1222 : Creative filtered (approval denied - offensive content)
Unity RTB error 1223 : Creative filtered (approval denied - performance issue)
Unity RTB error 1225 : Creative filtered (approval denied - offensive content)
Unity RTB error 1226 : Creative filtered (approval denied - offensive content)
---
# Unity RTB error 1225: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1225/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1225: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1225 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1225. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1223 : Creative filtered (approval denied - performance issue)
Unity RTB error 1224 : Creative filtered (approval denied - offensive content)
Unity RTB error 1226 : Creative filtered (approval denied - offensive content)
Unity RTB error 1227 : Creative filtered (approval denied - user security)
---
# Unity RTB error 1226: Creative filtered (approval denied - offensive content) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1226/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1226: Creative filtered (approval denied - offensive content)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to offensive content.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1226 is this code.
## What was checked
Unity publishes 1213 through 1222, and 1224 through 1226, as offensive content. This page is 1226. The table does not split that bucket into a different reason per integer.
## What to change
Unity's review rejected the creative as offensive content. Replace the creative. The same asset will keep drawing this code.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1224 : Creative filtered (approval denied - offensive content)
Unity RTB error 1225 : Creative filtered (approval denied - offensive content)
Unity RTB error 1227 : Creative filtered (approval denied - user security)
Unity RTB error 1228 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1227: Creative filtered (approval denied - user security) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1227/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1227: Creative filtered (approval denied - user security)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a user-security related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1227 is this code.
## What to change
Unity's review rejected the creative for a user-security issue. Replace the creative and resubmit it. Sending the same creative returns this code again.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1225 : Creative filtered (approval denied - offensive content)
Unity RTB error 1226 : Creative filtered (approval denied - offensive content)
Unity RTB error 1228 : Creative filtered (approval denied - creative quality)
Unity RTB error 1229 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1228: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1228/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1228: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1228 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1228. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1226 : Creative filtered (approval denied - offensive content)
Unity RTB error 1227 : Creative filtered (approval denied - user security)
Unity RTB error 1229 : Creative filtered (approval denied - creative quality)
Unity RTB error 1230 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1229: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1229/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1229: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1229 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1229. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1227 : Creative filtered (approval denied - user security)
Unity RTB error 1228 : Creative filtered (approval denied - creative quality)
Unity RTB error 1230 : Creative filtered (approval denied - creative quality)
Unity RTB error 1231 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1230: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1230/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1230: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1230 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1230. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1228 : Creative filtered (approval denied - creative quality)
Unity RTB error 1229 : Creative filtered (approval denied - creative quality)
Unity RTB error 1231 : Creative filtered (approval denied - creative quality)
Unity RTB error 1232 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1231: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1231/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1231: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1231 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1231. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1229 : Creative filtered (approval denied - creative quality)
Unity RTB error 1230 : Creative filtered (approval denied - creative quality)
Unity RTB error 1232 : Creative filtered (approval denied - creative quality)
Unity RTB error 1233 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1232: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1232/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1232: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1232 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1232. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1230 : Creative filtered (approval denied - creative quality)
Unity RTB error 1231 : Creative filtered (approval denied - creative quality)
Unity RTB error 1233 : Creative filtered (approval denied - creative quality)
Unity RTB error 1234 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1233: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1233/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1233: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1233 is this code.
## What was checked
Unity publishes 1228 through 1233 as creative quality. This page is 1233. The table does not name a separate defect for each integer.
## What to change
Unity's review rejected the creative for quality. Replace the creative and resubmit it.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1231 : Creative filtered (approval denied - creative quality)
Unity RTB error 1232 : Creative filtered (approval denied - creative quality)
Unity RTB error 1234 : Creative filtered (approval denied - creative quality)
Unity RTB error 1235 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1234: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1234/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1234: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue.This decision was made with the use of automation. For more information on how Unity Ads uses automation, refer to the Unity Advertising Services Content Policy. If you have further questions about how Unity uses automation in moderation decisions, contact your Unity Ads representative.As noted by the code in the preceding table, restrictions might be due to an asset containing content that violates the Unity content policy. For additional information, contact your Unity Ads representative. You can find your additional redress options in the Unity Advertising Services Content Policy.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1234 is this code.
## What to change
Unity's automated review rejected the creative for quality. Replace it or appeal through your Unity Ads contact. Resending the same creative returns 1234.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1232 : Creative filtered (approval denied - creative quality)
Unity RTB error 1233 : Creative filtered (approval denied - creative quality)
Unity RTB error 1235 : Creative filtered (approval denied - creative quality)
---
# Unity RTB error 1235: Creative filtered (approval denied - creative quality) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/unity/1235/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Unity RTB error 1235: Creative filtered (approval denied - creative quality)
Unity Exchange Expanded via ${AUCTION_LOSS} in lurl
## What Unity Exchange says
The creative was disapproved by Unity's exchange review due to a creative quality-related issue. The creative was moderated by Unity's review. For more information, contact your Unity Ads representative.
Unity Exchange reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Unity RTB error 1235 is this code.
## What to change
A Unity reviewer rejected the creative for quality. Replace it, or contact your Unity Ads representative about this creative. Resending it returns 1235.
## Related
All Unity Exchange loss reason codes
The OpenRTB loss reason table
Unity Exchange loss notifications
Unity RTB error 1233 : Creative filtered (approval denied - creative quality)
Unity RTB error 1234 : Creative filtered (approval denied - creative quality)
---
# Equativ loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ loss reason codes
Equativ publishes 1001 through 1007 on top of a subset of the OpenRTB 2.5 loss list. Loss notices stay off until Equativ's demand team enables them for the seat.
## Published codes
Value Name Meaning
3 Invalid Bid Response The impression id in the bid was wrong or was missing.
6 Invalid Advertiser Domain The advertiser domain (adomain) was null, missing, or malformed.
7 Missing Markup The ad markup was missing or malformed.
100 Bid was Below Auction Floor The bid price was below the bid floor Equativ sent on the request.
101 Bid was Below Deal Floor The bid price was below the deal floor Equativ sent on the request.
102 Lost to Higher Bid Another bid had a higher price.
103 Lost to a Bid for a PMP Deal The auction was private and the partner sent an open-auction bid.
104 Buyer Seat Blocked Equativ treats this buyer as sensitive and blocked the seat.
202 Creative Filtered - Disapproved by Exchange Equativ's quality mechanisms rejected the creative.
209 Creative Filtered - Category Exclusions Equativ blocked the creative, or the advertiser category, as sensitive. The public table lists both checks under 209.
1001 Invalid Currency The currency of the bid response was incorrect.
1002 Invalid Native Ad The bid response for a native ad was invalid.
1003 SKAdNetworkInvalidResponse The bid set BidResponse.seatbid.bid.ext.skadn, and its SKAdNetwork ID was not in the plist on BidRequest.imp.ext.skadn.
1004 SKAdNetworkEmptyResponse The bid set ext.skadn, and ext.skadn.network was empty or null.
1005 CreativeBlockedByErrorRate Equativ blocked the bid because this creative has produced a large number of rendering errors.
1006 Blocked Bid Response on Publisher Level The publisher blocked the partner, DSP, buyer, RTB advertiser, or advertiser category.
1007 Creative Size Blocked on Publisher level The publisher blocked this creative size.
Published in the Equativ loss notifications . The OpenRTB list these sit beside is the loss reason code table .
---
# Equativ RTB error 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 3: Invalid Bid Response
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The impression id in the bid was wrong or was missing.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 3 is this code.
## What was checked
Equativ rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Set impid to the imp.id Equativ sent on the request.
## The same number in OpenRTB
OpenRTB loss reason 3 is Invalid Bid Response . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 6 : Invalid Advertiser Domain
Equativ RTB error 7 : Missing Markup
---
# Equativ RTB error 6: Invalid Advertiser Domain · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 6: Invalid Advertiser Domain
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The advertiser domain (adomain) was null, missing, or malformed.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 6 is this code.
## What was checked
Equativ rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Send adomain as a hostname, with no scheme and no path.
## The same number in OpenRTB
OpenRTB loss reason 6 is Invalid Advertiser Domain . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 3 : Invalid Bid Response
Equativ RTB error 7 : Missing Markup
Equativ RTB error 100 : Bid was Below Auction Floor
---
# Equativ RTB error 7: Missing Markup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 7: Missing Markup
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The ad markup was missing or malformed.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 7 is this code.
## What was checked
Equativ rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Put the creative markup on adm .
## The same number in OpenRTB
OpenRTB loss reason 7 is Missing Markup . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 3 : Invalid Bid Response
Equativ RTB error 6 : Invalid Advertiser Domain
Equativ RTB error 100 : Bid was Below Auction Floor
Equativ RTB error 101 : Bid was Below Deal Floor
---
# Equativ RTB error 100: Bid was Below Auction Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 100: Bid was Below Auction Floor
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The bid price was below the bid floor Equativ sent on the request.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 100 is this code.
## What was checked
Equativ uses this OpenRTB number. The exchange compared bid.price with imp.bidfloor . The floor's currency is imp.bidfloorcur , which defaults to USD. A currency listed in the request cur array does not set the floor currency.
## What to change
Bid at or above that floor, or skip the impression.
## The same number in OpenRTB
OpenRTB loss reason 100 is Bid was Below Auction Floor . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 6 : Invalid Advertiser Domain
Equativ RTB error 7 : Missing Markup
Equativ RTB error 101 : Bid was Below Deal Floor
Equativ RTB error 102 : Lost to Higher Bid
---
# Equativ RTB error 101: Bid was Below Deal Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/101/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 101: Bid was Below Deal Floor
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The bid price was below the deal floor Equativ sent on the request.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 101 is this code.
## What was checked
Equativ accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid at or above that deal's floor.
## The same number in OpenRTB
OpenRTB loss reason 101 is Bid was Below Deal Floor . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 7 : Missing Markup
Equativ RTB error 100 : Bid was Below Auction Floor
Equativ RTB error 102 : Lost to Higher Bid
Equativ RTB error 103 : Lost to a Bid for a PMP Deal
---
# Equativ RTB error 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 102: Lost to Higher Bid
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
Another bid had a higher price.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 102 is this code.
## What was checked
Equativ uses this OpenRTB number. The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
This is price. Equativ uses the OpenRTB integer for it.
## The same number in OpenRTB
OpenRTB loss reason 102 is Lost to Higher Bid . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 100 : Bid was Below Auction Floor
Equativ RTB error 101 : Bid was Below Deal Floor
Equativ RTB error 103 : Lost to a Bid for a PMP Deal
Equativ RTB error 104 : Buyer Seat Blocked
---
# Equativ RTB error 103: Lost to a Bid for a PMP Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 103: Lost to a Bid for a PMP Deal
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The auction was private and the partner sent an open-auction bid.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 103 is this code.
## What to change
Bid with the deal id when Equativ marks the auction private.
## The same number in OpenRTB
OpenRTB loss reason 103 is Lost to a Bid for a Deal . Equativ publishes a different reading of this integer. Use the wording above when the loss came from Equativ.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 101 : Bid was Below Deal Floor
Equativ RTB error 102 : Lost to Higher Bid
Equativ RTB error 104 : Buyer Seat Blocked
Equativ RTB error 202 : Creative Filtered - Disapproved by Exchange
---
# Equativ RTB error 104: Buyer Seat Blocked · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/104/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 104: Buyer Seat Blocked
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
Equativ treats this buyer as sensitive and blocked the seat.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 104 is this code.
## What was checked
Equativ accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
The block is on the seat. Another buyer is the way through it.
## The same number in OpenRTB
OpenRTB loss reason 104 is Buyer Seat Blocked . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 102 : Lost to Higher Bid
Equativ RTB error 103 : Lost to a Bid for a PMP Deal
Equativ RTB error 202 : Creative Filtered - Disapproved by Exchange
Equativ RTB error 209 : Creative Filtered - Category Exclusions
---
# Equativ RTB error 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 202: Creative Filtered - Disapproved by Exchange
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
Equativ's quality mechanisms rejected the creative.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 202 is this code.
## What was checked
Equativ uses this OpenRTB number. The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
Replace the creative. The same crid keeps returning 202.
## The same number in OpenRTB
OpenRTB loss reason 202 is Creative Filtered - Disapproved by Exchange . Equativ publishes this integer with that meaning.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 103 : Lost to a Bid for a PMP Deal
Equativ RTB error 104 : Buyer Seat Blocked
Equativ RTB error 209 : Creative Filtered - Category Exclusions
Equativ RTB error 1001 : Invalid Currency
---
# Equativ RTB error 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 209: Creative Filtered - Category Exclusions
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
Equativ blocked the creative, or the advertiser category, as sensitive. The public table lists both checks under 209.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 209 is this code.
## What to change
A sensitive category returns 209 even when the markup itself is fine. Move the advertiser off that category for this publisher.
## The same number in OpenRTB
OpenRTB loss reason 209 is Creative Filtered - Category Exclusions . Equativ publishes a different reading of this integer. Use the wording above when the loss came from Equativ.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 104 : Buyer Seat Blocked
Equativ RTB error 202 : Creative Filtered - Disapproved by Exchange
Equativ RTB error 1001 : Invalid Currency
Equativ RTB error 1002 : Invalid Native Ad
---
# Equativ RTB error 1001: Invalid Currency · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1001/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1001: Invalid Currency
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The currency of the bid response was incorrect.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1001 is this code.
## What to change
Send the bid in a currency Equativ listed on the request. A price in the wrong currency returns 1001.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 202 : Creative Filtered - Disapproved by Exchange
Equativ RTB error 209 : Creative Filtered - Category Exclusions
Equativ RTB error 1002 : Invalid Native Ad
Equativ RTB error 1003 : SKAdNetworkInvalidResponse
---
# Equativ RTB error 1002: Invalid Native Ad · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1002/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1002: Invalid Native Ad
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The bid response for a native ad was invalid.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1002 is this code.
## What to change
Check the native adm against the native request Equativ sent. A native response that does not match the assets returns 1002.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 209 : Creative Filtered - Category Exclusions
Equativ RTB error 1001 : Invalid Currency
Equativ RTB error 1003 : SKAdNetworkInvalidResponse
Equativ RTB error 1004 : SKAdNetworkEmptyResponse
---
# Equativ RTB error 1003: SKAdNetworkInvalidResponse · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1003/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1003: SKAdNetworkInvalidResponse
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The bid set BidResponse.seatbid.bid.ext.skadn, and its SKAdNetwork ID was not in the plist on BidRequest.imp.ext.skadn.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1003 is this code.
## What to change
Bid a SKAdNetwork ID from the request's plist, or omit ext.skadn when the impression did not send one.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 1001 : Invalid Currency
Equativ RTB error 1002 : Invalid Native Ad
Equativ RTB error 1004 : SKAdNetworkEmptyResponse
Equativ RTB error 1005 : CreativeBlockedByErrorRate
---
# Equativ RTB error 1004: SKAdNetworkEmptyResponse · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1004/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1004: SKAdNetworkEmptyResponse
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The bid set ext.skadn, and ext.skadn.network was empty or null.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1004 is this code.
## What to change
Fill ext.skadn.network with an ID from the request, or omit the object.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 1002 : Invalid Native Ad
Equativ RTB error 1003 : SKAdNetworkInvalidResponse
Equativ RTB error 1005 : CreativeBlockedByErrorRate
Equativ RTB error 1006 : Blocked Bid Response on Publisher Level
---
# Equativ RTB error 1005: CreativeBlockedByErrorRate · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1005/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1005: CreativeBlockedByErrorRate
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
Equativ blocked the bid because this creative has produced a large number of rendering errors.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1005 is this code.
## What to change
Stop bidding that creative until the render errors are fixed. A new crid is how the next auction avoids 1005.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 1003 : SKAdNetworkInvalidResponse
Equativ RTB error 1004 : SKAdNetworkEmptyResponse
Equativ RTB error 1006 : Blocked Bid Response on Publisher Level
Equativ RTB error 1007 : Creative Size Blocked on Publisher level
---
# Equativ RTB error 1006: Blocked Bid Response on Publisher Level · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1006/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1006: Blocked Bid Response on Publisher Level
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The publisher blocked the partner, DSP, buyer, RTB advertiser, or advertiser category.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1006 is this code.
## What to change
The block is on the publisher's rule, not on the bid price. Another seat or another advertiser is the way through it.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 1004 : SKAdNetworkEmptyResponse
Equativ RTB error 1005 : CreativeBlockedByErrorRate
Equativ RTB error 1007 : Creative Size Blocked on Publisher level
---
# Equativ RTB error 1007: Creative Size Blocked on Publisher level · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/equativ/1007/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Equativ RTB error 1007: Creative Size Blocked on Publisher level
Equativ Expanded via ${AUCTION_LOSS} in lurl
## What Equativ says
The publisher blocked this creative size.
Equativ reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Equativ RTB error 1007 is this code.
## What to change
Send a size the publisher allows. The same dimensions will keep returning 1007.
## Related
All Equativ loss reason codes
The OpenRTB loss reason table
Equativ loss notifications
Equativ RTB error 1005 : CreativeBlockedByErrorRate
Equativ RTB error 1006 : Blocked Bid Response on Publisher Level
---
# Google Authorized Buyers loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google Authorized Buyers loss reason codes
Google Authorized Buyers sends loss reason 501 when a bid loses in the mediation waterfall. Creative status codes travel in ${CREATIVE_STATUS_CODE} , which is a different field from ${AUCTION_LOSS} . The numbered list is the [Google creative status index](/docs/openrtb/loss/exchange/google-creative-status/).
## Published codes
Value Name Meaning
501 Lost in the mediation waterfall Google sends 501 in ${AUCTION_LOSS} when the bid lost in the mediation waterfall. Google says it supports most OpenRTB loss reason codes, and 501 is the extra value.
Published in the Google Authorized Buyers win and loss notifications . The OpenRTB list these sit beside is the loss reason code table .
---
# Google RTB error 501: Lost in the mediation waterfall · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google/501/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google RTB error 501: Lost in the mediation waterfall
Google Authorized Buyers Expanded via ${AUCTION_LOSS} in lurl
## What Google Authorized Buyers says
Google sends 501 in ${AUCTION_LOSS} when the bid lost in the mediation waterfall. Google says it supports most OpenRTB loss reason codes, and 501 is the extra value.
Google Authorized Buyers reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Google RTB error 501 is this code.
## What to change
Read ${WINNING_MEDIATION_ECPM} on the loss notice when Google fills it. The bid had to clear the auction and the mediation chain. The price that would have taken the impression is the higher of that mediation eCPM and ${AUCTION_MIN_TO_WIN} .
## Related
All Google Authorized Buyers loss reason codes
The OpenRTB loss reason table
Google Authorized Buyers win and loss notifications
---
# Chartboost loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost loss reason codes
Chartboost publishes this ${AUCTION_LOSS} table. 502 and 1000 through 1003 are Chartboost codes. 211 does not mean the OpenRTB ad-type exclusion. 206 still means an app bundle exclusion.
## Published codes
Value Name Meaning
0 Bid Won Chartboost can report 0 when the bid won. The clearing price macro is filled only when the loss code is 0.
3 Invalid Bid Response Chartboost lists 3 as an invalid bid response.
4 Invalid Deal ID The deal id on the bid did not match a Chartboost deal.
5 Bid response impid does not match the auction id Chartboost's table says the bid response's impid does not match the auction id.
6 Invalid Advertiser Domain Chartboost rejected adomain.
100 Bid was Below Auction Floor The bid was below the auction floor.
102 Lost to Higher Bid Another bid paid more. Chartboost fills the minimum-bid macro only on this code, and only if it is enabled for the seat.
103 Lost to a Bid for a PMP Deal A deal bid took the impression.
202 Creative Filtered - Disapproved by Exchange Chartboost disapproved the creative.
204 Creative Filtered - Incorrect Creative Format The creative format did not match the placement.
205 Creative Filtered - Advertiser Exclusions The advertiser is excluded.
206 Creative Filtered - App Bundle Exclusions Chartboost still prints 206 as an app bundle exclusion, which is the OpenRTB 2.5 name. The current OpenRTB list uses 215 for that and 206 for a store id.
209 Creative Filtered - Category Exclusions The category is excluded.
211 Missing MRAID playable crtype Chartboost blocks a rewarded non-VAST response that is missing bid.ext.crtype set to MRAID playable. This is not the OpenRTB meaning of 211, which is ad type exclusions.
214 Invalid SKAdNetwork The SKAdNetwork payload failed Chartboost's check.
502 Bid won the auction but the ad failed to load The bid won, then the ad failed to load. Chartboost reports that as 502.
1000 Creative id blocked globally Chartboost blocked the crid globally.
1001 Timeout The bid was not received in time. Chartboost can only wait a short time after the auction timeout, so this notification is partial.
1002 Unencoded quote in burl or imptrackers burl or ext.imptrackers contains a single quote that is not URL-encoded.
1003 Tracker URL longer than 12K A burl or ext.imptrackers URL is longer than 12,000 characters.
Published in the Chartboost loss notifications . The OpenRTB list these sit beside is the loss reason code table .
---
# Chartboost RTB error 0: Bid Won · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/0/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 0: Bid Won
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost can report 0 when the bid won. The clearing price macro is filled only when the loss code is 0.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 0 is this code.
## What to change
Use nurl for the win. Chartboost fills the minimum-bid macro only when the code is 102, and only if that macro is enabled for the seat.
## The same number in OpenRTB
OpenRTB loss reason 0 is Bid Won . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 3 : Invalid Bid Response
Chartboost RTB error 4 : Invalid Deal ID
---
# Chartboost RTB error 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 3: Invalid Bid Response
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost lists 3 as an invalid bid response.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 3 is this code.
## What was checked
Chartboost rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Validate the response before it is sent. Chartboost does not publish a narrower reason under 3.
## The same number in OpenRTB
OpenRTB loss reason 3 is Invalid Bid Response . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 0 : Bid Won
Chartboost RTB error 4 : Invalid Deal ID
Chartboost RTB error 5 : Bid response impid does not match the auction id
---
# Chartboost RTB error 4: Invalid Deal ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 4: Invalid Deal ID
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The deal id on the bid did not match a Chartboost deal.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 4 is this code.
## What was checked
Chartboost rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Bid the deal id Chartboost sent, or omit it on an open auction.
## The same number in OpenRTB
OpenRTB loss reason 4 is Invalid Deal ID . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 0 : Bid Won
Chartboost RTB error 3 : Invalid Bid Response
Chartboost RTB error 5 : Bid response impid does not match the auction id
Chartboost RTB error 6 : Invalid Advertiser Domain
---
# Chartboost RTB error 5: Bid response impid does not match the auction id · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 5: Bid response impid does not match the auction id
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost's table says the bid response's impid does not match the auction id.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 5 is this code.
## What to change
Set impid to the impression id from the request Chartboost sent.
## The same number in OpenRTB
OpenRTB loss reason 5 is Invalid Auction ID . Chartboost publishes a different reading of this integer. Use the wording above when the loss came from Chartboost.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 3 : Invalid Bid Response
Chartboost RTB error 4 : Invalid Deal ID
Chartboost RTB error 6 : Invalid Advertiser Domain
Chartboost RTB error 100 : Bid was Below Auction Floor
---
# Chartboost RTB error 6: Invalid Advertiser Domain · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 6: Invalid Advertiser Domain
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost rejected adomain.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 6 is this code.
## What was checked
Chartboost rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Send adomain as a hostname.
## The same number in OpenRTB
OpenRTB loss reason 6 is Invalid Advertiser Domain . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 4 : Invalid Deal ID
Chartboost RTB error 5 : Bid response impid does not match the auction id
Chartboost RTB error 100 : Bid was Below Auction Floor
Chartboost RTB error 102 : Lost to Higher Bid
---
# Chartboost RTB error 100: Bid was Below Auction Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 100: Bid was Below Auction Floor
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The bid was below the auction floor.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 100 is this code.
## What was checked
Chartboost uses this OpenRTB number. The exchange compared bid.price with imp.bidfloor . The floor's currency is imp.bidfloorcur , which defaults to USD. A currency listed in the request cur array does not set the floor currency.
## What to change
Bid at or above the floor, or skip the impression.
## The same number in OpenRTB
OpenRTB loss reason 100 is Bid was Below Auction Floor . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 5 : Bid response impid does not match the auction id
Chartboost RTB error 6 : Invalid Advertiser Domain
Chartboost RTB error 102 : Lost to Higher Bid
Chartboost RTB error 103 : Lost to a Bid for a PMP Deal
---
# Chartboost RTB error 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 102: Lost to Higher Bid
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Another bid paid more. Chartboost fills the minimum-bid macro only on this code, and only if it is enabled for the seat.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 102 is this code.
## What was checked
Chartboost uses this OpenRTB number. The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
Read the minimum bid to win when it is present. Ask Chartboost to enable the macro if it comes back empty.
## The same number in OpenRTB
OpenRTB loss reason 102 is Lost to Higher Bid . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 6 : Invalid Advertiser Domain
Chartboost RTB error 100 : Bid was Below Auction Floor
Chartboost RTB error 103 : Lost to a Bid for a PMP Deal
Chartboost RTB error 202 : Creative Filtered - Disapproved by Exchange
---
# Chartboost RTB error 103: Lost to a Bid for a PMP Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 103: Lost to a Bid for a PMP Deal
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
A deal bid took the impression.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 103 is this code.
## What was checked
Chartboost accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid the deal when the request offers one.
## The same number in OpenRTB
OpenRTB loss reason 103 is Lost to a Bid for a Deal . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 100 : Bid was Below Auction Floor
Chartboost RTB error 102 : Lost to Higher Bid
Chartboost RTB error 202 : Creative Filtered - Disapproved by Exchange
Chartboost RTB error 204 : Creative Filtered - Incorrect Creative Format
---
# Chartboost RTB error 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 202: Creative Filtered - Disapproved by Exchange
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost disapproved the creative.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 202 is this code.
## What was checked
Chartboost uses this OpenRTB number. The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
Replace the creative. The same crid keeps returning 202.
## The same number in OpenRTB
OpenRTB loss reason 202 is Creative Filtered - Disapproved by Exchange . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 102 : Lost to Higher Bid
Chartboost RTB error 103 : Lost to a Bid for a PMP Deal
Chartboost RTB error 204 : Creative Filtered - Incorrect Creative Format
Chartboost RTB error 205 : Creative Filtered - Advertiser Exclusions
---
# Chartboost RTB error 204: Creative Filtered - Incorrect Creative Format · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 204: Creative Filtered - Incorrect Creative Format
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The creative format did not match the placement.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 204 is this code.
## What was checked
Chartboost accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Send the format Chartboost requested.
## The same number in OpenRTB
OpenRTB loss reason 204 is Creative Filtered - Incorrect Creative Format . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 103 : Lost to a Bid for a PMP Deal
Chartboost RTB error 202 : Creative Filtered - Disapproved by Exchange
Chartboost RTB error 205 : Creative Filtered - Advertiser Exclusions
Chartboost RTB error 206 : Creative Filtered - App Bundle Exclusions
---
# Chartboost RTB error 205: Creative Filtered - Advertiser Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 205: Creative Filtered - Advertiser Exclusions
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The advertiser is excluded.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 205 is this code.
## What was checked
Chartboost accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Take that advertiser off this inventory.
## The same number in OpenRTB
OpenRTB loss reason 205 is Creative Filtered - Advertiser Exclusions . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 202 : Creative Filtered - Disapproved by Exchange
Chartboost RTB error 204 : Creative Filtered - Incorrect Creative Format
Chartboost RTB error 206 : Creative Filtered - App Bundle Exclusions
Chartboost RTB error 209 : Creative Filtered - Category Exclusions
---
# Chartboost RTB error 206: Creative Filtered - App Bundle Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 206: Creative Filtered - App Bundle Exclusions
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost still prints 206 as an app bundle exclusion, which is the OpenRTB 2.5 name. The current OpenRTB list uses 215 for that and 206 for a store id.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 206 is this code.
## What to change
Treat a Chartboost 206 as a blocked bundle. Do not relabel it as a store-id exclusion.
## The same number in OpenRTB
OpenRTB loss reason 206 is Creative Filtered - App Store ID Exclusions . Chartboost publishes a different reading of this integer. Use the wording above when the loss came from Chartboost.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 204 : Creative Filtered - Incorrect Creative Format
Chartboost RTB error 205 : Creative Filtered - Advertiser Exclusions
Chartboost RTB error 209 : Creative Filtered - Category Exclusions
Chartboost RTB error 211 : Missing MRAID playable crtype
---
# Chartboost RTB error 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 209: Creative Filtered - Category Exclusions
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The category is excluded.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 209 is this code.
## What was checked
Chartboost accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
The category on the creative is blocked for this placement.
## The same number in OpenRTB
OpenRTB loss reason 209 is Creative Filtered - Category Exclusions . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 205 : Creative Filtered - Advertiser Exclusions
Chartboost RTB error 206 : Creative Filtered - App Bundle Exclusions
Chartboost RTB error 211 : Missing MRAID playable crtype
Chartboost RTB error 214 : Invalid SKAdNetwork
---
# Chartboost RTB error 211: Missing MRAID playable crtype · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/211/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 211: Missing MRAID playable crtype
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost blocks a rewarded non-VAST response that is missing bid.ext.crtype set to MRAID playable. This is not the OpenRTB meaning of 211, which is ad type exclusions.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 211 is this code.
## What to change
On a rewarded placement that is not VAST, set bid.ext.crtype to MRAID playable.
## The same number in OpenRTB
OpenRTB loss reason 211 is Creative Filtered - Ad Type Exclusions . Chartboost publishes a different reading of this integer. Use the wording above when the loss came from Chartboost.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 206 : Creative Filtered - App Bundle Exclusions
Chartboost RTB error 209 : Creative Filtered - Category Exclusions
Chartboost RTB error 214 : Invalid SKAdNetwork
Chartboost RTB error 502 : Bid won the auction but the ad failed to load
---
# Chartboost RTB error 214: Invalid SKAdNetwork · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/214/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 214: Invalid SKAdNetwork
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The SKAdNetwork payload failed Chartboost's check.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 214 is this code.
## What was checked
Chartboost accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Send a SKAdNetwork object that matches the version and ids on the request, or omit it when the request has none.
## The same number in OpenRTB
OpenRTB loss reason 214 is Creative Filtered - Invalid SKAdNetwork . Chartboost publishes this integer with that meaning.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 209 : Creative Filtered - Category Exclusions
Chartboost RTB error 211 : Missing MRAID playable crtype
Chartboost RTB error 502 : Bid won the auction but the ad failed to load
Chartboost RTB error 1000 : Creative id blocked globally
---
# Chartboost RTB error 502: Bid won the auction but the ad failed to load · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/502/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 502: Bid won the auction but the ad failed to load
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The bid won, then the ad failed to load. Chartboost reports that as 502.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 502 is this code.
## What to change
The auction price was fine. Fix the creative load. A win notice can still fire for this bid.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 211 : Missing MRAID playable crtype
Chartboost RTB error 214 : Invalid SKAdNetwork
Chartboost RTB error 1000 : Creative id blocked globally
Chartboost RTB error 1001 : Timeout
---
# Chartboost RTB error 1000: Creative id blocked globally · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/1000/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 1000: Creative id blocked globally
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
Chartboost blocked the crid globally.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 1000 is this code.
## What to change
Stop bidding that crid. A new creative id is how the next auction avoids 1000.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 214 : Invalid SKAdNetwork
Chartboost RTB error 502 : Bid won the auction but the ad failed to load
Chartboost RTB error 1001 : Timeout
Chartboost RTB error 1002 : Unencoded quote in burl or imptrackers
---
# Chartboost RTB error 1001: Timeout · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/1001/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 1001: Timeout
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
The bid was not received in time. Chartboost can only wait a short time after the auction timeout, so this notification is partial.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 1001 is this code.
## What to change
Answer inside the remaining time. A late bid can lose as 1001 even when the response was valid.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 502 : Bid won the auction but the ad failed to load
Chartboost RTB error 1000 : Creative id blocked globally
Chartboost RTB error 1002 : Unencoded quote in burl or imptrackers
Chartboost RTB error 1003 : Tracker URL longer than 12K
---
# Chartboost RTB error 1002: Unencoded quote in burl or imptrackers · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/1002/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 1002: Unencoded quote in burl or imptrackers
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
burl or ext.imptrackers contains a single quote that is not URL-encoded.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 1002 is this code.
## What to change
Percent-encode the quote in burl and in ext.imptrackers.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 1000 : Creative id blocked globally
Chartboost RTB error 1001 : Timeout
Chartboost RTB error 1003 : Tracker URL longer than 12K
---
# Chartboost RTB error 1003: Tracker URL longer than 12K · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/chartboost/1003/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Chartboost RTB error 1003: Tracker URL longer than 12K
Chartboost Expanded via ${AUCTION_LOSS} in lurl
## What Chartboost says
A burl or ext.imptrackers URL is longer than 12,000 characters.
Chartboost reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Chartboost RTB error 1003 is this code.
## What to change
Shorten the tracker URL to 12,000 characters or less.
## Related
All Chartboost loss reason codes
The OpenRTB loss reason table
Chartboost loss notifications
Chartboost RTB error 1001 : Timeout
Chartboost RTB error 1002 : Unencoded quote in burl or imptrackers
---
# Digital Turbine loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine loss reason codes
Digital Turbine publishes this ${AUCTION_LOSS} table, and a bid-status table that names which status fires which code. 1010 is Digital Turbine's code for a malformed bundle. 206 still means an app bundle exclusion.
## Published codes
Value Name Meaning
1 Internal Error Digital Turbine reports an internal error.
2 Impression Opportunity Expired Digital Turbine's bid-status table maps Timeout to lurl 2. The response exceeded the window, 350 ms for RTB bidders.
3 Invalid Bid Response Digital Turbine maps HTTP Error and Invalid Response to lurl 3. The response format was invalid, a parameter was missing, or the call failed on the server.
6 Invalid Advertiser Domain Digital Turbine maps an empty adomain and a malformed adomain to lurl 6. A valid value is a hostname such as us.company.com. A value with a scheme, a path, a leading dot, or a store URL is invalid, and so is a raw app bundle.
7 Missing Markup The markup was missing.
9 Missing Bid Price The bid had no price.
100 Bid Below Auction Floor Digital Turbine maps Below the Floor Price to lurl 100.
101 Bid Below Deal Floor The bid was below the deal floor.
102 Lost to Higher Bid Digital Turbine maps Lost on Price to lurl 102.
103 Lost to a Bid for a PMP Deal A deal bid took the impression.
202 Creative Filtered - Disapproved by Exchange Digital Turbine disapproved the creative.
204 Creative Filtered - Incorrect Creative Format The creative format did not match the placement.
205 Creative Filtered - Advertiser Exclusions Digital Turbine maps Blocked Advertiser Domain to lurl 205.
206 Creative Filtered - App Bundle Exclusions Digital Turbine prints 206 as an app bundle exclusion and maps Blocked Advertiser App to it. That is the OpenRTB 2.5 name. The current OpenRTB list uses 215 for a bundle and 206 for a store id.
207 Creative Filtered - Not Secure The creative was not secure.
209 Creative Filtered - Category Exclusions Digital Turbine maps Blocked Category to lurl 209.
210 Creative Filtered - Creative Attribute Exclusions A creative attribute is excluded.
214 Invalid SKAdNetwork Digital Turbine maps both Incompatible SKAD Versions and Invalid SKAD Parameters to lurl 214. The version on bid.ext.skadn.version was higher than the app supports, or another skadn parameter was invalid.
1010 Invalid or malformed bundle A valid bundle is an Android package name or an App Store id. Digital Turbine maps Invalid or Malformed Bundle to lurl 1010.
Published in the Digital Turbine bid loss notifications . The OpenRTB list these sit beside is the loss reason code table .
---
# Digital Turbine RTB error 1: Internal Error · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 1: Internal Error
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine reports an internal error.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 1 is this code.
## What was checked
Digital Turbine rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Retry on a later auction. The bid itself may have been valid.
## The same number in OpenRTB
OpenRTB loss reason 1 is Internal Error . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 2 : Impression Opportunity Expired
Digital Turbine RTB error 3 : Invalid Bid Response
---
# Digital Turbine RTB error 2: Impression Opportunity Expired · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 2: Impression Opportunity Expired
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine's bid-status table maps Timeout to lurl 2. The response exceeded the window, 350 ms for RTB bidders.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 2 is this code.
## What to change
Answer inside 350 ms, or no-bid instead of letting the request time out.
## The same number in OpenRTB
OpenRTB loss reason 2 is Impression Opportunity Expired . Digital Turbine publishes a different reading of this integer. Use the wording above when the loss came from Digital Turbine.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 1 : Internal Error
Digital Turbine RTB error 3 : Invalid Bid Response
Digital Turbine RTB error 6 : Invalid Advertiser Domain
---
# Digital Turbine RTB error 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 3: Invalid Bid Response
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps HTTP Error and Invalid Response to lurl 3. The response format was invalid, a parameter was missing, or the call failed on the server.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 3 is this code.
## What to change
Return a valid bid JSON with the required fields, or a no-bid. A server error on your endpoint is reported as 3.
## The same number in OpenRTB
OpenRTB loss reason 3 is Invalid Bid Response . Digital Turbine publishes a different reading of this integer. Use the wording above when the loss came from Digital Turbine.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 1 : Internal Error
Digital Turbine RTB error 2 : Impression Opportunity Expired
Digital Turbine RTB error 6 : Invalid Advertiser Domain
Digital Turbine RTB error 7 : Missing Markup
---
# Digital Turbine RTB error 6: Invalid Advertiser Domain · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 6: Invalid Advertiser Domain
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps an empty adomain and a malformed adomain to lurl 6. A valid value is a hostname such as us.company.com. A value with a scheme, a path, a leading dot, or a store URL is invalid, and so is a raw app bundle.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 6 is this code.
## What to change
Send adomain as a bare hostname. Put the app id on bundle, not on adomain.
## The same number in OpenRTB
OpenRTB loss reason 6 is Invalid Advertiser Domain . Digital Turbine publishes a different reading of this integer. Use the wording above when the loss came from Digital Turbine.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 2 : Impression Opportunity Expired
Digital Turbine RTB error 3 : Invalid Bid Response
Digital Turbine RTB error 7 : Missing Markup
Digital Turbine RTB error 9 : Missing Bid Price
---
# Digital Turbine RTB error 7: Missing Markup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 7: Missing Markup
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
The markup was missing.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 7 is this code.
## What was checked
Digital Turbine rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Put the creative on adm.
## The same number in OpenRTB
OpenRTB loss reason 7 is Missing Markup . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 3 : Invalid Bid Response
Digital Turbine RTB error 6 : Invalid Advertiser Domain
Digital Turbine RTB error 9 : Missing Bid Price
Digital Turbine RTB error 100 : Bid Below Auction Floor
---
# Digital Turbine RTB error 9: Missing Bid Price · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 9: Missing Bid Price
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
The bid had no price.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 9 is this code.
## What was checked
Digital Turbine rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Set price.
## The same number in OpenRTB
OpenRTB loss reason 9 is Missing Bid Price . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 6 : Invalid Advertiser Domain
Digital Turbine RTB error 7 : Missing Markup
Digital Turbine RTB error 100 : Bid Below Auction Floor
Digital Turbine RTB error 101 : Bid Below Deal Floor
---
# Digital Turbine RTB error 100: Bid Below Auction Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 100: Bid Below Auction Floor
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps Below the Floor Price to lurl 100.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 100 is this code.
## What was checked
Digital Turbine uses this OpenRTB number. The exchange compared bid.price with imp.bidfloor . The floor's currency is imp.bidfloorcur , which defaults to USD. A currency listed in the request cur array does not set the floor currency.
## What to change
Bid at or above the floor, or skip the impression.
## The same number in OpenRTB
OpenRTB loss reason 100 is Bid was Below Auction Floor . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 7 : Missing Markup
Digital Turbine RTB error 9 : Missing Bid Price
Digital Turbine RTB error 101 : Bid Below Deal Floor
Digital Turbine RTB error 102 : Lost to Higher Bid
---
# Digital Turbine RTB error 101: Bid Below Deal Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/101/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 101: Bid Below Deal Floor
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
The bid was below the deal floor.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 101 is this code.
## What was checked
Digital Turbine accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid at or above that deal's floor.
## The same number in OpenRTB
OpenRTB loss reason 101 is Bid was Below Deal Floor . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 9 : Missing Bid Price
Digital Turbine RTB error 100 : Bid Below Auction Floor
Digital Turbine RTB error 102 : Lost to Higher Bid
Digital Turbine RTB error 103 : Lost to a Bid for a PMP Deal
---
# Digital Turbine RTB error 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 102: Lost to Higher Bid
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps Lost on Price to lurl 102.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 102 is this code.
## What was checked
Digital Turbine uses this OpenRTB number. The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
Another bid paid more.
## The same number in OpenRTB
OpenRTB loss reason 102 is Lost to Higher Bid . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 100 : Bid Below Auction Floor
Digital Turbine RTB error 101 : Bid Below Deal Floor
Digital Turbine RTB error 103 : Lost to a Bid for a PMP Deal
Digital Turbine RTB error 202 : Creative Filtered - Disapproved by Exchange
---
# Digital Turbine RTB error 103: Lost to a Bid for a PMP Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 103: Lost to a Bid for a PMP Deal
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
A deal bid took the impression.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 103 is this code.
## What was checked
Digital Turbine accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid the deal when the request offers one.
## The same number in OpenRTB
OpenRTB loss reason 103 is Lost to a Bid for a Deal . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 101 : Bid Below Deal Floor
Digital Turbine RTB error 102 : Lost to Higher Bid
Digital Turbine RTB error 202 : Creative Filtered - Disapproved by Exchange
Digital Turbine RTB error 204 : Creative Filtered - Incorrect Creative Format
---
# Digital Turbine RTB error 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 202: Creative Filtered - Disapproved by Exchange
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine disapproved the creative.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 202 is this code.
## What was checked
Digital Turbine uses this OpenRTB number. The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
Replace the creative.
## The same number in OpenRTB
OpenRTB loss reason 202 is Creative Filtered - Disapproved by Exchange . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 102 : Lost to Higher Bid
Digital Turbine RTB error 103 : Lost to a Bid for a PMP Deal
Digital Turbine RTB error 204 : Creative Filtered - Incorrect Creative Format
Digital Turbine RTB error 205 : Creative Filtered - Advertiser Exclusions
---
# Digital Turbine RTB error 204: Creative Filtered - Incorrect Creative Format · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 204: Creative Filtered - Incorrect Creative Format
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
The creative format did not match the placement.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 204 is this code.
## What was checked
Digital Turbine accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Send the format Digital Turbine requested.
## The same number in OpenRTB
OpenRTB loss reason 204 is Creative Filtered - Incorrect Creative Format . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 103 : Lost to a Bid for a PMP Deal
Digital Turbine RTB error 202 : Creative Filtered - Disapproved by Exchange
Digital Turbine RTB error 205 : Creative Filtered - Advertiser Exclusions
Digital Turbine RTB error 206 : Creative Filtered - App Bundle Exclusions
---
# Digital Turbine RTB error 205: Creative Filtered - Advertiser Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 205: Creative Filtered - Advertiser Exclusions
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps Blocked Advertiser Domain to lurl 205.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 205 is this code.
## What was checked
Digital Turbine accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
That advertiser domain is blocked. Bid a different advertiser on this inventory.
## The same number in OpenRTB
OpenRTB loss reason 205 is Creative Filtered - Advertiser Exclusions . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 202 : Creative Filtered - Disapproved by Exchange
Digital Turbine RTB error 204 : Creative Filtered - Incorrect Creative Format
Digital Turbine RTB error 206 : Creative Filtered - App Bundle Exclusions
Digital Turbine RTB error 207 : Creative Filtered - Not Secure
---
# Digital Turbine RTB error 206: Creative Filtered - App Bundle Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 206: Creative Filtered - App Bundle Exclusions
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine prints 206 as an app bundle exclusion and maps Blocked Advertiser App to it. That is the OpenRTB 2.5 name. The current OpenRTB list uses 215 for a bundle and 206 for a store id.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 206 is this code.
## What to change
Treat a Digital Turbine 206 as a blocked app. Do not relabel it as a store-id exclusion.
## The same number in OpenRTB
OpenRTB loss reason 206 is Creative Filtered - App Store ID Exclusions . Digital Turbine publishes a different reading of this integer. Use the wording above when the loss came from Digital Turbine.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 204 : Creative Filtered - Incorrect Creative Format
Digital Turbine RTB error 205 : Creative Filtered - Advertiser Exclusions
Digital Turbine RTB error 207 : Creative Filtered - Not Secure
Digital Turbine RTB error 209 : Creative Filtered - Category Exclusions
---
# Digital Turbine RTB error 207: Creative Filtered - Not Secure · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/207/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 207: Creative Filtered - Not Secure
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
The creative was not secure.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 207 is this code.
## What was checked
Digital Turbine uses this OpenRTB number. The exchange looked for an insecure URL in a creative served to an impression with imp.secure set to 1.
## What to change
Serve markup and trackers on https.
## The same number in OpenRTB
OpenRTB loss reason 207 is Creative Filtered - Not Secure . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 205 : Creative Filtered - Advertiser Exclusions
Digital Turbine RTB error 206 : Creative Filtered - App Bundle Exclusions
Digital Turbine RTB error 209 : Creative Filtered - Category Exclusions
Digital Turbine RTB error 210 : Creative Filtered - Creative Attribute Exclusions
---
# Digital Turbine RTB error 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 209: Creative Filtered - Category Exclusions
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps Blocked Category to lurl 209.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 209 is this code.
## What was checked
Digital Turbine accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
The category is blocked for this placement.
## The same number in OpenRTB
OpenRTB loss reason 209 is Creative Filtered - Category Exclusions . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 206 : Creative Filtered - App Bundle Exclusions
Digital Turbine RTB error 207 : Creative Filtered - Not Secure
Digital Turbine RTB error 210 : Creative Filtered - Creative Attribute Exclusions
Digital Turbine RTB error 214 : Invalid SKAdNetwork
---
# Digital Turbine RTB error 210: Creative Filtered - Creative Attribute Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 210: Creative Filtered - Creative Attribute Exclusions
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
A creative attribute is excluded.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 210 is this code.
## What was checked
Digital Turbine accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Drop the blocked attribute, such as autoplay or expandable, for this placement.
## The same number in OpenRTB
OpenRTB loss reason 210 is Creative Filtered - Creative Attribute Exclusions . Digital Turbine publishes this integer with that meaning.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 207 : Creative Filtered - Not Secure
Digital Turbine RTB error 209 : Creative Filtered - Category Exclusions
Digital Turbine RTB error 214 : Invalid SKAdNetwork
Digital Turbine RTB error 1010 : Invalid or malformed bundle
---
# Digital Turbine RTB error 214: Invalid SKAdNetwork · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/214/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 214: Invalid SKAdNetwork
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
Digital Turbine maps both Incompatible SKAD Versions and Invalid SKAD Parameters to lurl 214. The version on bid.ext.skadn.version was higher than the app supports, or another skadn parameter was invalid.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 214 is this code.
## What to change
Send a SKAdNetwork version the request allows, and fill the parameters from the request.
## The same number in OpenRTB
OpenRTB loss reason 214 is Creative Filtered - Invalid SKAdNetwork . Digital Turbine publishes a different reading of this integer. Use the wording above when the loss came from Digital Turbine.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 209 : Creative Filtered - Category Exclusions
Digital Turbine RTB error 210 : Creative Filtered - Creative Attribute Exclusions
Digital Turbine RTB error 1010 : Invalid or malformed bundle
---
# Digital Turbine RTB error 1010: Invalid or malformed bundle · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/digital-turbine/1010/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Digital Turbine RTB error 1010: Invalid or malformed bundle
Digital Turbine Expanded via ${AUCTION_LOSS} in lurl
## What Digital Turbine says
A valid bundle is an Android package name or an App Store id. Digital Turbine maps Invalid or Malformed Bundle to lurl 1010.
Digital Turbine reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Digital Turbine RTB error 1010 is this code.
## What to change
Send bundle as a Play package name or an Apple numeric id. A store URL in bundle returns 1010.
## Related
All Digital Turbine loss reason codes
The OpenRTB loss reason table
Digital Turbine bid loss notifications
Digital Turbine RTB error 210 : Creative Filtered - Creative Attribute Exclusions
Digital Turbine RTB error 214 : Invalid SKAdNetwork
---
# Verve loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve loss reason codes
Verve publishes the loss reasons its own auction returns. An upstream auction can forward other codes. 206 is printed as an app bundle exclusion.
## Published codes
Value Name Meaning
1 Internal Error Verve lists 1 as an internal error.
3 Invalid Bid Response Verve lists 3 as an invalid bid response.
4 Invalid Deal ID The deal id did not match.
7 Missing Markup The markup was missing.
9 Missing Bid Price The bid had no price.
102 Lost to Higher Bid Another bid paid more. Verve fills the minimum bid to win for 102 and for 103.
103 Lost to a Bid for a Deal A deal bid took the impression. Verve fills the minimum bid to win for this code.
104 Buyer Seat Blocked The seat is blocked.
200 Creative Filtered - General; Reason Unknown Verve filtered the creative and did not say why.
202 Creative Filtered - Disapproved by Exchange Verve disapproved the creative.
205 Creative Filtered - Advertiser Exclusions The advertiser is excluded.
206 Creative Filtered - App Bundle Exclusions Verve prints 206 as an app bundle exclusion, the OpenRTB 2.5 name.
209 Creative Filtered - Category Exclusions The category is excluded.
210 Creative Filtered - Creative Attribute Exclusions A creative attribute is excluded.
Published in the Verve bid loss notification . The OpenRTB list these sit beside is the loss reason code table .
---
# Verve RTB error 1: Internal Error · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 1: Internal Error
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Verve lists 1 as an internal error.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 1 is this code.
## What was checked
Verve rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Verve does not publish a narrower cause. Retry on a later auction.
## The same number in OpenRTB
OpenRTB loss reason 1 is Internal Error . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 3 : Invalid Bid Response
Verve RTB error 4 : Invalid Deal ID
---
# Verve RTB error 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 3: Invalid Bid Response
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Verve lists 3 as an invalid bid response.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 3 is this code.
## What was checked
Verve rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Validate the response before it is sent.
## The same number in OpenRTB
OpenRTB loss reason 3 is Invalid Bid Response . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 1 : Internal Error
Verve RTB error 4 : Invalid Deal ID
Verve RTB error 7 : Missing Markup
---
# Verve RTB error 4: Invalid Deal ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 4: Invalid Deal ID
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The deal id did not match.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 4 is this code.
## What was checked
Verve rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Bid the deal id Verve sent.
## The same number in OpenRTB
OpenRTB loss reason 4 is Invalid Deal ID . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 1 : Internal Error
Verve RTB error 3 : Invalid Bid Response
Verve RTB error 7 : Missing Markup
Verve RTB error 9 : Missing Bid Price
---
# Verve RTB error 7: Missing Markup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 7: Missing Markup
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The markup was missing.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 7 is this code.
## What was checked
Verve rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Put the creative on adm.
## The same number in OpenRTB
OpenRTB loss reason 7 is Missing Markup . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 3 : Invalid Bid Response
Verve RTB error 4 : Invalid Deal ID
Verve RTB error 9 : Missing Bid Price
Verve RTB error 102 : Lost to Higher Bid
---
# Verve RTB error 9: Missing Bid Price · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 9: Missing Bid Price
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The bid had no price.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 9 is this code.
## What was checked
Verve rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Set price.
## The same number in OpenRTB
OpenRTB loss reason 9 is Missing Bid Price . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 4 : Invalid Deal ID
Verve RTB error 7 : Missing Markup
Verve RTB error 102 : Lost to Higher Bid
Verve RTB error 103 : Lost to a Bid for a Deal
---
# Verve RTB error 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 102: Lost to Higher Bid
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Another bid paid more. Verve fills the minimum bid to win for 102 and for 103.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 102 is this code.
## What was checked
Verve uses this OpenRTB number. The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
Read the minimum bid to win on this loss.
## The same number in OpenRTB
OpenRTB loss reason 102 is Lost to Higher Bid . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 7 : Missing Markup
Verve RTB error 9 : Missing Bid Price
Verve RTB error 103 : Lost to a Bid for a Deal
Verve RTB error 104 : Buyer Seat Blocked
---
# Verve RTB error 103: Lost to a Bid for a Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 103: Lost to a Bid for a Deal
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
A deal bid took the impression. Verve fills the minimum bid to win for this code.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 103 is this code.
## What was checked
Verve accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid the deal when the request offers one.
## The same number in OpenRTB
OpenRTB loss reason 103 is Lost to a Bid for a Deal . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 9 : Missing Bid Price
Verve RTB error 102 : Lost to Higher Bid
Verve RTB error 104 : Buyer Seat Blocked
Verve RTB error 200 : Creative Filtered - General; Reason Unknown
---
# Verve RTB error 104: Buyer Seat Blocked · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/104/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 104: Buyer Seat Blocked
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The seat is blocked.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 104 is this code.
## What was checked
Verve accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Another seat is the way through this publisher.
## The same number in OpenRTB
OpenRTB loss reason 104 is Buyer Seat Blocked . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 102 : Lost to Higher Bid
Verve RTB error 103 : Lost to a Bid for a Deal
Verve RTB error 200 : Creative Filtered - General; Reason Unknown
Verve RTB error 202 : Creative Filtered - Disapproved by Exchange
---
# Verve RTB error 200: Creative Filtered - General; Reason Unknown · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/200/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 200: Creative Filtered - General; Reason Unknown
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Verve filtered the creative and did not say why.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 200 is this code.
## What was checked
Verve accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
There is no narrower code on this loss.
## The same number in OpenRTB
OpenRTB loss reason 200 is Creative Filtered - General; Reason Unknown . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 103 : Lost to a Bid for a Deal
Verve RTB error 104 : Buyer Seat Blocked
Verve RTB error 202 : Creative Filtered - Disapproved by Exchange
Verve RTB error 205 : Creative Filtered - Advertiser Exclusions
---
# Verve RTB error 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 202: Creative Filtered - Disapproved by Exchange
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Verve disapproved the creative.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 202 is this code.
## What was checked
Verve uses this OpenRTB number. The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
Replace the creative.
## The same number in OpenRTB
OpenRTB loss reason 202 is Creative Filtered - Disapproved by Exchange . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 104 : Buyer Seat Blocked
Verve RTB error 200 : Creative Filtered - General; Reason Unknown
Verve RTB error 205 : Creative Filtered - Advertiser Exclusions
Verve RTB error 206 : Creative Filtered - App Bundle Exclusions
---
# Verve RTB error 205: Creative Filtered - Advertiser Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 205: Creative Filtered - Advertiser Exclusions
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The advertiser is excluded.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 205 is this code.
## What was checked
Verve accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Bid a different advertiser on this inventory.
## The same number in OpenRTB
OpenRTB loss reason 205 is Creative Filtered - Advertiser Exclusions . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 200 : Creative Filtered - General; Reason Unknown
Verve RTB error 202 : Creative Filtered - Disapproved by Exchange
Verve RTB error 206 : Creative Filtered - App Bundle Exclusions
Verve RTB error 209 : Creative Filtered - Category Exclusions
---
# Verve RTB error 206: Creative Filtered - App Bundle Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 206: Creative Filtered - App Bundle Exclusions
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
Verve prints 206 as an app bundle exclusion, the OpenRTB 2.5 name.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 206 is this code.
## What to change
Treat a Verve 206 as a blocked bundle.
## The same number in OpenRTB
OpenRTB loss reason 206 is Creative Filtered - App Store ID Exclusions . Verve publishes a different reading of this integer. Use the wording above when the loss came from Verve.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 202 : Creative Filtered - Disapproved by Exchange
Verve RTB error 205 : Creative Filtered - Advertiser Exclusions
Verve RTB error 209 : Creative Filtered - Category Exclusions
Verve RTB error 210 : Creative Filtered - Creative Attribute Exclusions
---
# Verve RTB error 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 209: Creative Filtered - Category Exclusions
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
The category is excluded.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 209 is this code.
## What was checked
Verve accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
The category is blocked for this placement.
## The same number in OpenRTB
OpenRTB loss reason 209 is Creative Filtered - Category Exclusions . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 205 : Creative Filtered - Advertiser Exclusions
Verve RTB error 206 : Creative Filtered - App Bundle Exclusions
Verve RTB error 210 : Creative Filtered - Creative Attribute Exclusions
---
# Verve RTB error 210: Creative Filtered - Creative Attribute Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/verve/210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Verve RTB error 210: Creative Filtered - Creative Attribute Exclusions
Verve Expanded via ${AUCTION_LOSS} in lurl
## What Verve says
A creative attribute is excluded.
Verve reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Verve RTB error 210 is this code.
## What was checked
Verve accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Drop the blocked attribute for this placement.
## The same number in OpenRTB
OpenRTB loss reason 210 is Creative Filtered - Creative Attribute Exclusions . Verve publishes this integer with that meaning.
## Related
All Verve loss reason codes
The OpenRTB loss reason table
Verve bid loss notification
Verve RTB error 206 : Creative Filtered - App Bundle Exclusions
Verve RTB error 209 : Creative Filtered - Category Exclusions
---
# Xandr loss reason codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr loss reason codes
Xandr publishes the ${AUCTION_LOSS} codes it returns. The list is a subset of the OpenRTB table. Xandr does not publish a code at 500 or above.
## Published codes
Value Name Meaning
1 Internal Error Xandr lists 1 as an internal error.
3 Invalid Bid Response Xandr lists 3 as an invalid bid response.
4 Invalid Deal ID The deal id did not match a deal Xandr knows.
5 Invalid Auction ID The auction id did not match.
6 Invalid Advertiser Domain adomain was missing or malformed.
7 Missing Markup The markup was missing.
8 Missing Creative ID The creative id was missing.
9 Missing Bid Price The bid had no price.
100 Bid was Below Auction Floor The bid was below the auction floor.
101 Bid was Below Deal Floor The bid was below the deal floor.
102 Lost to Higher Bid Another bid paid more.
104 Buyer Seat Blocked The seat is blocked.
200 Creative Filtered - General; reason unknown Xandr filtered the creative and did not say why.
201 Creative Filtered - Pending Processing by Exchange The creative is still in review or transcoding.
202 Creative Filtered - Disapproved by Exchange Xandr disapproved the creative.
203 Creative Filtered - Size Not Allowed The size was not allowed.
204 Creative Filtered - Incorrect Creative Format The format did not match the placement.
205 Creative Filtered - Advertiser Exclusions The advertiser is excluded.
207 Creative Filtered - Not Secure The creative was not secure.
208 Creative Filtered - Language Exclusions The language is excluded.
209 Creative Filtered - Category Exclusions The category is excluded.
210 Creative Filtered - Creative Attribute Exclusions A creative attribute is excluded.
213 Creative Filtered - Not Allowed in PMP Deal The creative is not allowed in the deal. Xandr's table uses the OpenRTB 2.5 wording for 213.
Published in the Xandr loss reason codes . The OpenRTB list these sit beside is the loss reason code table .
---
# Xandr RTB error 1: Internal Error · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 1: Internal Error
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
Xandr lists 1 as an internal error.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 1 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Xandr does not publish a narrower cause for 1.
## The same number in OpenRTB
OpenRTB loss reason 1 is Internal Error . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 3 : Invalid Bid Response
Xandr RTB error 4 : Invalid Deal ID
---
# Xandr RTB error 3: Invalid Bid Response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 3: Invalid Bid Response
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
Xandr lists 3 as an invalid bid response.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 3 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Validate the response before it is sent.
## The same number in OpenRTB
OpenRTB loss reason 3 is Invalid Bid Response . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 1 : Internal Error
Xandr RTB error 4 : Invalid Deal ID
Xandr RTB error 5 : Invalid Auction ID
---
# Xandr RTB error 4: Invalid Deal ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 4: Invalid Deal ID
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The deal id did not match a deal Xandr knows.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 4 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Bid the deal id from the request.
## The same number in OpenRTB
OpenRTB loss reason 4 is Invalid Deal ID . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 1 : Internal Error
Xandr RTB error 3 : Invalid Bid Response
Xandr RTB error 5 : Invalid Auction ID
Xandr RTB error 6 : Invalid Advertiser Domain
---
# Xandr RTB error 5: Invalid Auction ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 5: Invalid Auction ID
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The auction id did not match.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 5 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Echo the request id Xandr sent.
## The same number in OpenRTB
OpenRTB loss reason 5 is Invalid Auction ID . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 3 : Invalid Bid Response
Xandr RTB error 4 : Invalid Deal ID
Xandr RTB error 6 : Invalid Advertiser Domain
Xandr RTB error 7 : Missing Markup
---
# Xandr RTB error 6: Invalid Advertiser Domain · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 6: Invalid Advertiser Domain
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
adomain was missing or malformed.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 6 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Send adomain as a hostname.
## The same number in OpenRTB
OpenRTB loss reason 6 is Invalid Advertiser Domain . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 4 : Invalid Deal ID
Xandr RTB error 5 : Invalid Auction ID
Xandr RTB error 7 : Missing Markup
Xandr RTB error 8 : Missing Creative ID
---
# Xandr RTB error 7: Missing Markup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 7: Missing Markup
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The markup was missing.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 7 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Put the creative on adm.
## The same number in OpenRTB
OpenRTB loss reason 7 is Missing Markup . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 5 : Invalid Auction ID
Xandr RTB error 6 : Invalid Advertiser Domain
Xandr RTB error 8 : Missing Creative ID
Xandr RTB error 9 : Missing Bid Price
---
# Xandr RTB error 8: Missing Creative ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/8/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 8: Missing Creative ID
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The creative id was missing.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 8 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Set crid.
## The same number in OpenRTB
OpenRTB loss reason 8 is Missing Creative ID . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 6 : Invalid Advertiser Domain
Xandr RTB error 7 : Missing Markup
Xandr RTB error 9 : Missing Bid Price
Xandr RTB error 100 : Bid was Below Auction Floor
---
# Xandr RTB error 9: Missing Bid Price · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 9: Missing Bid Price
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The bid had no price.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 9 is this code.
## What was checked
Xandr rejected the bid before price comparison. OpenRTB groups 1 through 10 as a response the exchange could not use: a bad id, missing markup, a missing price, or a domain it will not accept.
## What to change
Set price.
## The same number in OpenRTB
OpenRTB loss reason 9 is Missing Bid Price . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 7 : Missing Markup
Xandr RTB error 8 : Missing Creative ID
Xandr RTB error 100 : Bid was Below Auction Floor
Xandr RTB error 101 : Bid was Below Deal Floor
---
# Xandr RTB error 100: Bid was Below Auction Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 100: Bid was Below Auction Floor
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The bid was below the auction floor.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 100 is this code.
## What was checked
Xandr uses this OpenRTB number. The exchange compared bid.price with imp.bidfloor . The floor's currency is imp.bidfloorcur , which defaults to USD. A currency listed in the request cur array does not set the floor currency.
## What to change
Bid at or above the floor.
## The same number in OpenRTB
OpenRTB loss reason 100 is Bid was Below Auction Floor . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 8 : Missing Creative ID
Xandr RTB error 9 : Missing Bid Price
Xandr RTB error 101 : Bid was Below Deal Floor
Xandr RTB error 102 : Lost to Higher Bid
---
# Xandr RTB error 101: Bid was Below Deal Floor · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/101/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 101: Bid was Below Deal Floor
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The bid was below the deal floor.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 101 is this code.
## What was checked
Xandr accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Bid at or above the deal floor.
## The same number in OpenRTB
OpenRTB loss reason 101 is Bid was Below Deal Floor . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 9 : Missing Bid Price
Xandr RTB error 100 : Bid was Below Auction Floor
Xandr RTB error 102 : Lost to Higher Bid
Xandr RTB error 104 : Buyer Seat Blocked
---
# Xandr RTB error 102: Lost to Higher Bid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 102: Lost to Higher Bid
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
Another bid paid more.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 102 is this code.
## What was checked
Xandr uses this OpenRTB number. The bid cleared the floor and lost because another bid paid more. The response itself was acceptable to the exchange.
## What to change
This is price.
## The same number in OpenRTB
OpenRTB loss reason 102 is Lost to Higher Bid . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 100 : Bid was Below Auction Floor
Xandr RTB error 101 : Bid was Below Deal Floor
Xandr RTB error 104 : Buyer Seat Blocked
Xandr RTB error 200 : Creative Filtered - General; reason unknown
---
# Xandr RTB error 104: Buyer Seat Blocked · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/104/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 104: Buyer Seat Blocked
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The seat is blocked.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 104 is this code.
## What was checked
Xandr accepted the response and lost it on price, a deal, or a seat block. OpenRTB groups 100 through 104 as auction economics.
## What to change
Another seat is the way through this publisher.
## The same number in OpenRTB
OpenRTB loss reason 104 is Buyer Seat Blocked . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 101 : Bid was Below Deal Floor
Xandr RTB error 102 : Lost to Higher Bid
Xandr RTB error 200 : Creative Filtered - General; reason unknown
Xandr RTB error 201 : Creative Filtered - Pending Processing by Exchange
---
# Xandr RTB error 200: Creative Filtered - General; reason unknown · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/200/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 200: Creative Filtered - General; reason unknown
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
Xandr filtered the creative and did not say why.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 200 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
There is no narrower code on this loss.
## The same number in OpenRTB
OpenRTB loss reason 200 is Creative Filtered - General; Reason Unknown . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 102 : Lost to Higher Bid
Xandr RTB error 104 : Buyer Seat Blocked
Xandr RTB error 201 : Creative Filtered - Pending Processing by Exchange
Xandr RTB error 202 : Creative Filtered - Disapproved by Exchange
---
# Xandr RTB error 201: Creative Filtered - Pending Processing by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/201/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 201: Creative Filtered - Pending Processing by Exchange
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The creative is still in review or transcoding.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 201 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Wait for approval before bidding that crid again.
## The same number in OpenRTB
OpenRTB loss reason 201 is Creative Filtered - Pending Processing by Exchange . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 104 : Buyer Seat Blocked
Xandr RTB error 200 : Creative Filtered - General; reason unknown
Xandr RTB error 202 : Creative Filtered - Disapproved by Exchange
Xandr RTB error 203 : Creative Filtered - Size Not Allowed
---
# Xandr RTB error 202: Creative Filtered - Disapproved by Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 202: Creative Filtered - Disapproved by Exchange
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
Xandr disapproved the creative.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 202 is this code.
## What was checked
Xandr uses this OpenRTB number. The exchange compared the creative, usually crid together with iurl or adm , with a review decision it had already stored.
## What to change
Replace the creative.
## The same number in OpenRTB
OpenRTB loss reason 202 is Creative Filtered - Disapproved by Exchange . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 200 : Creative Filtered - General; reason unknown
Xandr RTB error 201 : Creative Filtered - Pending Processing by Exchange
Xandr RTB error 203 : Creative Filtered - Size Not Allowed
Xandr RTB error 204 : Creative Filtered - Incorrect Creative Format
---
# Xandr RTB error 203: Creative Filtered - Size Not Allowed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/203/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 203: Creative Filtered - Size Not Allowed
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The size was not allowed.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 203 is this code.
## What was checked
Xandr uses this OpenRTB number. The exchange compared the creative's pixel size with the sizes on the impression. For a banner that is banner.w and banner.h , or any pair in banner.format . Video uses video.w and video.h .
## What to change
Send a size the impression listed.
## The same number in OpenRTB
OpenRTB loss reason 203 is Creative Filtered - Size Not Allowed . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 201 : Creative Filtered - Pending Processing by Exchange
Xandr RTB error 202 : Creative Filtered - Disapproved by Exchange
Xandr RTB error 204 : Creative Filtered - Incorrect Creative Format
Xandr RTB error 205 : Creative Filtered - Advertiser Exclusions
---
# Xandr RTB error 204: Creative Filtered - Incorrect Creative Format · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 204: Creative Filtered - Incorrect Creative Format
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The format did not match the placement.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 204 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Send the format Xandr requested.
## The same number in OpenRTB
OpenRTB loss reason 204 is Creative Filtered - Incorrect Creative Format . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 202 : Creative Filtered - Disapproved by Exchange
Xandr RTB error 203 : Creative Filtered - Size Not Allowed
Xandr RTB error 205 : Creative Filtered - Advertiser Exclusions
Xandr RTB error 207 : Creative Filtered - Not Secure
---
# Xandr RTB error 205: Creative Filtered - Advertiser Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 205: Creative Filtered - Advertiser Exclusions
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The advertiser is excluded.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 205 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Bid a different advertiser.
## The same number in OpenRTB
OpenRTB loss reason 205 is Creative Filtered - Advertiser Exclusions . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 203 : Creative Filtered - Size Not Allowed
Xandr RTB error 204 : Creative Filtered - Incorrect Creative Format
Xandr RTB error 207 : Creative Filtered - Not Secure
Xandr RTB error 208 : Creative Filtered - Language Exclusions
---
# Xandr RTB error 207: Creative Filtered - Not Secure · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/207/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 207: Creative Filtered - Not Secure
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The creative was not secure.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 207 is this code.
## What was checked
Xandr uses this OpenRTB number. The exchange looked for an insecure URL in a creative served to an impression with imp.secure set to 1.
## What to change
Serve markup and trackers on https.
## The same number in OpenRTB
OpenRTB loss reason 207 is Creative Filtered - Not Secure . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 204 : Creative Filtered - Incorrect Creative Format
Xandr RTB error 205 : Creative Filtered - Advertiser Exclusions
Xandr RTB error 208 : Creative Filtered - Language Exclusions
Xandr RTB error 209 : Creative Filtered - Category Exclusions
---
# Xandr RTB error 208: Creative Filtered - Language Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/208/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 208: Creative Filtered - Language Exclusions
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The language is excluded.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 208 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
The creative language is blocked for this placement.
## The same number in OpenRTB
OpenRTB loss reason 208 is Creative Filtered - Language Exclusions . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 205 : Creative Filtered - Advertiser Exclusions
Xandr RTB error 207 : Creative Filtered - Not Secure
Xandr RTB error 209 : Creative Filtered - Category Exclusions
Xandr RTB error 210 : Creative Filtered - Creative Attribute Exclusions
---
# Xandr RTB error 209: Creative Filtered - Category Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 209: Creative Filtered - Category Exclusions
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The category is excluded.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 209 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
The category is blocked for this placement.
## The same number in OpenRTB
OpenRTB loss reason 209 is Creative Filtered - Category Exclusions . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 207 : Creative Filtered - Not Secure
Xandr RTB error 208 : Creative Filtered - Language Exclusions
Xandr RTB error 210 : Creative Filtered - Creative Attribute Exclusions
Xandr RTB error 213 : Creative Filtered - Not Allowed in PMP Deal
---
# Xandr RTB error 210: Creative Filtered - Creative Attribute Exclusions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 210: Creative Filtered - Creative Attribute Exclusions
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
A creative attribute is excluded.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 210 is this code.
## What was checked
Xandr accepted the bid and rejected the creative. OpenRTB groups 200 through 215 as creative policy: size, format, security, category, attributes, or the app being promoted.
## What to change
Drop the blocked attribute.
## The same number in OpenRTB
OpenRTB loss reason 210 is Creative Filtered - Creative Attribute Exclusions . Xandr publishes this integer with that meaning.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 208 : Creative Filtered - Language Exclusions
Xandr RTB error 209 : Creative Filtered - Category Exclusions
Xandr RTB error 213 : Creative Filtered - Not Allowed in PMP Deal
---
# Xandr RTB error 213: Creative Filtered - Not Allowed in PMP Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/xandr/213/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Xandr RTB error 213: Creative Filtered - Not Allowed in PMP Deal
Xandr Expanded via ${AUCTION_LOSS} in lurl
## What Xandr says
The creative is not allowed in the deal. Xandr's table uses the OpenRTB 2.5 wording for 213.
Xandr reports this integer in the ${AUCTION_LOSS} macro on the bid's lurl . A search for Xandr RTB error 213 is this code.
## What to change
The creative does not qualify for that deal.
## The same number in OpenRTB
OpenRTB loss reason 213 is Creative Filtered - Not Allowed in Deal . Xandr publishes a different reading of this integer. Use the wording above when the loss came from Xandr.
## Related
All Xandr loss reason codes
The OpenRTB loss reason table
Xandr loss reason codes
Xandr RTB error 209 : Creative Filtered - Category Exclusions
Xandr RTB error 210 : Creative Filtered - Creative Attribute Exclusions
---
# Google creative status codes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status codes
Google returns these integers in ${CREATIVE_STATUS_CODE} on the win or loss notice. They are not ${AUCTION_LOSS} values. Loss reason 501 is on the [Google loss reason page](/docs/openrtb/loss/exchange/google/501/).
## Published codes
Value Name Meaning
1 Creative won the auction Creative won the auction
2 Internal error Internal error
3 Unknown error (deprecated) Unknown error (deprecated)
4 Internal error: unknown status code Internal error: unknown status code
5 Creative filtered due to landing page quality Creative filtered due to landing page quality
6 Creative filtered because malware was detected Creative filtered because malware was detected
7 Creative URL has not yet been reviewed Creative URL has not yet been reviewed
8 Unknown error (deprecated) Unknown error (deprecated)
9 Unknown error (deprecated) Unknown error (deprecated)
10 Creative was not approved Creative was not approved
11 Creative has not yet been categorized Creative has not yet been categorized
12 Creative filtered by publisher through the Publisher Controls ad review tool Creative filtered by publisher through the Publisher Controls ad review tool
13 Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
14 Creative filtered because of detected excluded_sensitive_category Creative filtered because of detected excluded_sensitive_category
15 Creative filtered because one or more detected product categories were excluded in the bid request Creative filtered because one or more detected product categories were excluded in the bid request
16 Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
17 Creative filtered because one or more declared vendors were excluded in the bid request Creative filtered because one or more declared vendors were excluded in the bid request
18 Creative filtered because one or more declared attributes were excluded in the bid request Creative filtered because one or more declared attributes were excluded in the bid request
19 Creative filtered because one or more declared sensitive categories were excluded in the bid request Creative filtered because one or more declared sensitive categories were excluded in the bid request
20 Unknown error (deprecated) Unknown error (deprecated)
21 Creative filtered because the required field buyer_creative_id is missing Creative filtered because the required field buyer_creative_id is missing
22 Creative filtered because no matching ad slot was found Creative filtered because no matching ad slot was found
23 Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups) Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
24 Creative filtered because the required adgroup_id field is missing Creative filtered because the required adgroup_id field is missing
25 Creative filtered because the declared width and height do not match the request Creative filtered because the declared width and height do not match the request
26 Creative filtered because the required fields width or height are missing Creative filtered because the required fields width or height are missing
27 Creative filtered because it includes more than one of the following: html_snippet, video_url Creative filtered because it includes more than one of the following: html_snippet, video_url
28 Creative filtered because click_through_url was not empty Creative filtered because click_through_url was not empty
29 Unknown error (deprecated) Unknown error (deprecated)
30 Unknown error (deprecated) Unknown error (deprecated)
31 Unknown error (deprecated) Unknown error (deprecated)
32 Unknown error (deprecated) Unknown error (deprecated)
33 Creative filtered because the required field html_snippet was empty Creative filtered because the required field html_snippet was empty
34 Creative filtered because the required field video_url was empty Creative filtered because the required field video_url was empty
35 Unknown error (deprecated) Unknown error (deprecated)
36 Creative filtered because the required field click_through_url was empty Creative filtered because the required field click_through_url was empty
37 Creative filtered because html_snippet should be empty when video is requested Creative filtered because html_snippet should be empty when video is requested
38 Creative filtered because video_url field was not empty, should be empty unless video is requested Creative filtered because video_url field was not empty, should be empty unless video is requested
39 Unknown error (deprecated) Unknown error (deprecated)
40 Unknown error (deprecated) Unknown error (deprecated)
41 Unknown error (deprecated) Unknown error (deprecated)
42 Unknown error (deprecated) Unknown error (deprecated)
43 Unknown error (deprecated) Unknown error (deprecated)
44 Unknown error (deprecated) Unknown error (deprecated)
45 Unknown error (deprecated) Unknown error (deprecated)
46 Unknown error (deprecated) Unknown error (deprecated)
47 Unknown error (deprecated) Unknown error (deprecated)
48 Unknown error (deprecated) Unknown error (deprecated)
49 Unknown error (deprecated) Unknown error (deprecated)
50 Unknown error (deprecated) Unknown error (deprecated)
51 Unknown error (deprecated) Unknown error (deprecated)
52 Unknown error (deprecated) Unknown error (deprecated)
53 Unknown error (deprecated) Unknown error (deprecated)
54 Unknown error (deprecated) Unknown error (deprecated)
55 Unknown error (deprecated) Unknown error (deprecated)
56 Creative filtered because the field click_through_url is too short, must be at least 11 characters Creative filtered because the field click_through_url is too short, must be at least 11 characters
57 Creative filtered because the field click_through_url could not be parsed Creative filtered because the field click_through_url could not be parsed
58 Creative filtered because the field click_through_url has a domain consisting of all digits Creative filtered because the field click_through_url has a domain consisting of all digits
59 Creative filtered because the field video_url is too short, must be at least 11 characters Creative filtered because the field video_url is too short, must be at least 11 characters
60 Creative filtered because the field video_url could not be parsed Creative filtered because the field video_url could not be parsed
61 Creative filtered because the field video_url has a domain consisting of all digits Creative filtered because the field video_url has a domain consisting of all digits
62 Unknown error (deprecated) Unknown error (deprecated)
63 Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
64 Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
65 Unknown error (deprecated) Unknown error (deprecated)
66 Creative filtered because the field buyer_creative_id exceeds 64 bytes Creative filtered because the field buyer_creative_id exceeds 64 bytes
67 Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
68 Creative filtered because max_cpm_micros is not greater than 0 Creative filtered because max_cpm_micros is not greater than 0
69 Unknown error (deprecated) Unknown error (deprecated)
70 Unknown error (deprecated) Unknown error (deprecated)
71 Creative filtered due to publisher's URL exclusion settings Creative filtered due to publisher's URL exclusion settings
72 Creative filtered due to publisher's advertiser exclusion settings Creative filtered due to publisher's advertiser exclusion settings
73 Creative filtered due to publisher's targeting type settings Creative filtered due to publisher's targeting type settings
74 Creative filtered because it has historically had a high error rate and/or very low view rate Creative filtered because it has historically had a high error rate and/or very low view rate
75 Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
76 Creative filtered because the VAST XML contains errors or could not be fetched for verification Creative filtered because the VAST XML contains errors or could not be fetched for verification
77 Creative is awaiting review by the publisher Creative is awaiting review by the publisher
78 Creative filtered because the declared creative size was not present in pre-targeting adgroup Creative filtered because the declared creative size was not present in pre-targeting adgroup
79 Creative was outbid Creative was outbid
80 Creative filtered because the bid price was below the minimum CPM threshold Creative filtered because the bid price was below the minimum CPM threshold
81 Creative was not allowed in Private Auction or Preferred Deal Creative was not allowed in Private Auction or Preferred Deal
82 Creative filtered because the ad language is not allowed by the publisher Creative filtered because the ad language is not allowed by the publisher
83 The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
84 Creative filtered because the publisher disallows ads from this agency Creative filtered because the publisher disallows ads from this agency
85 Creative requires additional review Creative requires additional review
86 Creative filtered because one or more undeclared restricted_category fields were detected Creative filtered because one or more undeclared restricted_category fields were detected
87 Creative filtered because one or more declared restricted_category fields do not match the request Creative filtered because one or more declared restricted_category fields do not match the request
88 Creative filtered because deal_id is not for a valid deal Creative filtered because deal_id is not for a valid deal
89 Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen... Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen width and 40% height)
90 AdX VAST ad type does not match the type required in the video ad request AdX VAST ad type does not match the type required in the video ad request
91 Creative filtered because the duration of the video is too long Creative filtered because the duration of the video is too long
92 Creative filtered because the duration of the video is too short Creative filtered because the duration of the video is too short
93 Creative filtered because it is a skippable video ad for a non-skippable request Creative filtered because it is a skippable video ad for a non-skippable request
94 Creative filtered because it is a non-skippable video ad for a skippable-only request Creative filtered because it is a non-skippable video ad for a skippable-only request
95 Creative filtered because the skip offset is wrong (5 seconds is the correct value) Creative filtered because the skip offset is wrong (5 seconds is the correct value)
96 Creative filtered because it lacks a MP4 video file in the VAST Creative filtered because it lacks a MP4 video file in the VAST
97 Creative filtered because it lacks a WebM video file in the VAST Creative filtered because it lacks a WebM video file in the VAST
98 Creative filtered because it lacks a Flash video file in the VAST Creative filtered because it lacks a Flash video file in the VAST
99 Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available) Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
100 Unknown error (deprecated) Unknown error (deprecated)
101 Unknown error (deprecated) Unknown error (deprecated)
102 Creative filtered because the bidder account is in testing mode Creative filtered because the bidder account is in testing mode
103 Native ad specified for an adslot that does not support it Native ad specified for an adslot that does not support it
104 native_ad.image.url field value is an invalid URL native_ad.image.url field value is an invalid URL
105 native_ad.logo.url field value is an invalid URL native_ad.logo.url field value is an invalid URL
106 native_ad.app_icon.url field value is an invalid URL native_ad.app_icon.url field value is an invalid URL
107 Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
108 Unknown error (deprecated) Unknown error (deprecated)
109 Unknown error (deprecated) Unknown error (deprecated)
110 Unknown error (deprecated) Unknown error (deprecated)
111 native_ad.click_tracking_url field value is too short to be a valid URL native_ad.click_tracking_url field value is too short to be a valid URL
112 native_ad.click_tracking_url field value cannot be parsed as a valid URL native_ad.click_tracking_url field value cannot be parsed as a valid URL
113 native_ad.click_tracking_url field value has a domain that is all digits native_ad.click_tracking_url field value has a domain that is all digits
114 Creative filtered because deal_id is invalid Creative filtered because deal_id is invalid
115 ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
116 Creative filtered because deal's buyer_network_id is invalid Creative filtered because deal's buyer_network_id is invalid
117 Creative filtered because deal's advertiser is invalid Creative filtered because deal's advertiser is invalid
118 Creative filtered because a deal id is required Creative filtered because a deal id is required
119 Creative filtered by publisher's exclusion rules Creative filtered by publisher's exclusion rules
120 Creative filtered because the language could not be detected and the publisher has language restrictions Creative filtered because the language could not be detected and the publisher has language restrictions
121 Creative filtered because the billing entity it is attributed to is out of budget Creative filtered because the billing entity it is attributed to is out of budget
122 Creative filtered due to frequency caps Creative filtered due to frequency caps
123 Creative filtered because it is not allowed to serve on the Android platform Creative filtered because it is not allowed to serve on the Android platform
124 Creative filtered because it is not allowed to serve on the iOS platform Creative filtered because it is not allowed to serve on the iOS platform
125 impression_tracking_url field value is too short to be a valid URL impression_tracking_url field value is too short to be a valid URL
126 impression_tracking_url field value cannot be parsed as a valid URL impression_tracking_url field value cannot be parsed as a valid URL
127 impression_tracking_url field value has a domain that is all digits impression_tracking_url field value has a domain that is all digits
128 impression_tracking_url not supported for non mobile-app html ads impression_tracking_url not supported for non mobile-app html ads
129 Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
130 Creative filtered because it is ineligible or unapproved for serving to a Russian user or property Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
131 Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your... Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your technical account manager
132 native_ad.image.width or native_ad.image.height has an invalid value native_ad.image.width or native_ad.image.height has an invalid value
133 native_ad.logo.width or native_ad.logo.height has an invalid value native_ad.logo.width or native_ad.logo.height has an invalid value
134 native_ad.app_icon.width or native_ad.app_icon.height has an invalid value native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
135 native_ad.store field value is an invalid URL native_ad.store field value is an invalid URL
136 native_ad.star_rating field value is invalid native_ad.star_rating field value is invalid
137 Creative filtered because ad.width/height is not allowed for the chosen deal Creative filtered because ad.width/height is not allowed for the chosen deal
138 Creative filtered because max_cpm_micros is too large Creative filtered because max_cpm_micros is too large
139 Creative filtered because bidder used an unsupported OpenRTB feature Creative filtered because bidder used an unsupported OpenRTB feature
140 Unknown error (deprecated) Unknown error (deprecated)
141 Exactly one adslot was expected for the ad; either zero or multiple were returned Exactly one adslot was expected for the ad; either zero or multiple were returned
142 Creative is not SSL compliant but secure ads are required on this request Creative is not SSL compliant but secure ads are required on this request
143 Creative uses flash but flash is not available or not allowed on this request Creative uses flash but flash is not available or not allowed on this request
144 Creative filtered by publisher's creative text filter rules Creative filtered by publisher's creative text filter rules
145 The adslot ID specified in the response did not match any in the request The adslot ID specified in the response did not match any in the request
146 The creative was not eligible to serve to the current user The creative was not eligible to serve to the current user
147 Unknown error (deprecated) Unknown error (deprecated)
148 Unknown error (deprecated) Unknown error (deprecated)
149 The click tracking URL is too short to be a valid URL The click tracking URL is too short to be a valid URL
150 The click tracking URL cannot be parsed as valid URL The click tracking URL cannot be parsed as valid URL
151 The click tracking URL has a domain that is all digits The click tracking URL has a domain that is all digits
152 Invalid ad.adslot.billing_id in the bid response Invalid ad.adslot.billing_id in the bid response
153 ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
154 Creative filtered because buyer_creative_id is not UTF8 compliant Creative filtered because buyer_creative_id is not UTF8 compliant
155 ad_choices_destination_url field value is too short to be a valid URL ad_choices_destination_url field value is too short to be a valid URL
156 ad_choices_destination_url field value cannot be parsed as a valid URL ad_choices_destination_url field value cannot be parsed as a valid URL
157 ad_choices_destination_url field value has a domain that is all digits ad_choices_destination_url field value has a domain that is all digits
158 Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
159 native_ad.video_url field value is an invalid URL native_ad.video_url field value is an invalid URL
160 native_ad.click_link_url field value is an invalid URL native_ad.click_link_url field value is an invalid URL
161 Creative filtered because it lacks a VPAID Flash file in the VAST Creative filtered because it lacks a VPAID Flash file in the VAST
162 Creative filtered because it lacks a VPAID JavaScript file in the VAST Creative filtered because it lacks a VPAID JavaScript file in the VAST
163 Native ad image asset width not in permitted range Native ad image asset width not in permitted range
164 Native ad image asset aspect ratio not in permitted range Native ad image asset aspect ratio not in permitted range
165 Creative filtered by publisher's restrictions on which brands can be shown together Creative filtered by publisher's restrictions on which brands can be shown together
166 Deal bid filtered because the publisher didn't enable deals for the exchange. Deal bid filtered because the publisher didn't enable deals for the exchange.
167 Publisher requires premium (high-quality) snippets only, but this snippet does not match Publisher requires premium (high-quality) snippets only, but this snippet does not match
168 Creative filtered because it lacks a MP3 (audio) file in the VAST Creative filtered because it lacks a MP3 (audio) file in the VAST
169 Creative filtered because it lacks a AUDIO (audio) file in the VAST Creative filtered because it lacks a AUDIO (audio) file in the VAST
170 Creative filtered because it lacks a MOV file in the VAST Creative filtered because it lacks a MOV file in the VAST
171 Creative filtered because it lacks a 3GPP file in the VAST Creative filtered because it lacks a 3GPP file in the VAST
172 Creative filtered because it lacks a DASH file in the VAST Creative filtered because it lacks a DASH file in the VAST
173 Creative filtered because it lacks an HLS file in the VAST Creative filtered because it lacks an HLS file in the VAST
174 Creative filtered because it lacks an MP4A file in the VAST Creative filtered because it lacks an MP4A file in the VAST
175 Creative filtered because it has an empty VAST XML document. Creative filtered because it has an empty VAST XML document.
176 Creative filtered because the VAST document can't be parsed. Creative filtered because the VAST document can't be parsed.
177 Creative filtered because request requires assets to have a bitrate within a specified range Creative filtered because request requires assets to have a bitrate within a specified range
178 Creative filtered because request requires assets to have a resolution within a specified range Creative filtered because request requires assets to have a resolution within a specified range
179 Creative filtered because the required field amp_ad_url was missing or empty. Creative filtered because the required field amp_ad_url was missing or empty.
180 Video ad VAST version is not one of the supported versions in the video ad request Video ad VAST version is not one of the supported versions in the video ad request
181 Creative filtered because the VAST XML document is larger than the set maximum size. Creative filtered because the VAST XML document is larger than the set maximum size.
182 Creative filtered beacuse the publisher blocklisted the deal ID it targeted Creative filtered beacuse the publisher blocklisted the deal ID it targeted
183 Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
184 Creative filtered because the field amp_ad_url is too short, must be at least 11 characters Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
185 Creative filtered because the field amp_ad_url could not be parsed Creative filtered because the field amp_ad_url could not be parsed
186 Creative filtered because the field amp_ad_url has a domain consisting of all digits Creative filtered because the field amp_ad_url has a domain consisting of all digits
187 Creative filtered because of creative policy violations Creative filtered because of creative policy violations
188 Creative filtered due to publisher's app exclusion settings Creative filtered due to publisher's app exclusion settings
189 Filtered due to unknown SDK identifier Filtered due to unknown SDK identifier
190 Filtered due to disallowed SDK identifier Filtered due to disallowed SDK identifier
191 Creative filtered because it contains an invalid OMSDK script URL. Creative filtered because it contains an invalid OMSDK script URL.
192 Rejected due to Coppa/KFA being filtered for demand syndication. Rejected due to Coppa/KFA being filtered for demand syndication.
193 Filtered due to missing SDK identifier Filtered due to missing SDK identifier
194 Filtered due to missing SDK rendering data Filtered due to missing SDK rendering data
195 Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal. Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
196 The publisher has blocked the buyer for this bid. The publisher has blocked the buyer for this bid.
197 The response did not comply with demand syndication guidelines The response did not comply with demand syndication guidelines
198 The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed... The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed Deals) on the request.
199 Filtered due to experimental changes Filtered due to experimental changes
200 iOS requests disallow video ads missing the playsinline attribute iOS requests disallow video ads missing the playsinline attribute
201 The TC string doesn't contain consent for one of the vendors included in this ad creative. The TC string doesn't contain consent for one of the vendors included in this ad creative.
202 Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
203 Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
204 The creative's instream format is not allowed (i.e. linear vs. non-linear) The creative's instream format is not allowed (i.e. linear vs. non-linear)
205 Creative was disapproved Creative was disapproved
206 Ad filtered because it does not match the format of the chosen deal Ad filtered because it does not match the format of the chosen deal
207 Ad filtered because publisher does not support the iOS SKAdNetwork API Ad filtered because publisher does not support the iOS SKAdNetwork API
208 Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
209 Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
210 Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's... Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's Info.plist
211 Ad filtered because the provided iOS SKAdNetwork is missing required fields Ad filtered because the provided iOS SKAdNetwork is missing required fields
212 The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information. The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
213 A provided ad load notification URL is too short to be a valid URL. A provided ad load notification URL is too short to be a valid URL.
214 A provided ad load notification URL cannot be parsed as a valid URL. A provided ad load notification URL cannot be parsed as a valid URL.
215 A provided ad load notification URL has a domain that is all digits. A provided ad load notification URL has a domain that is all digits.
216 Ad load notification URLs are not supported for non mobile-app SDK rendered ads. Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
217 Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise. Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
218 Ad contains a vendor domain that could not be attributed to any known vendor. Ad contains a vendor domain that could not be attributed to any known vendor.
219 The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad... The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad creative.
220 Native ad filtered because it contains both video URL and VAST tag. Native ad filtered because it contains both video URL and VAST tag.
221 Native ad filtered because the VAST XML document is empty. Native ad filtered because the VAST XML document is empty.
222 Native ad filtered because the VAST XML document is too large. Native ad filtered because the VAST XML document is too large.
223 Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it. Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
224 Multiple bids submitted for a single deal ID on a bid response. Multiple bids submitted for a single deal ID on a bid response.
225 Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query. Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
226 Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency. Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
227 Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot. Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
228 Ad rejected because bidder specified an unexpected billing ID when bidding on a deal. Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
229 Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request. Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
230 A provided ad load notification URL exceeded the maximum length. A provided ad load notification URL exceeded the maximum length.
231 Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file. Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
232 Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in... Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in landscape.
233 Ad rejected because the publisher blocked non-instream video in protections. Ad rejected because the publisher blocked non-instream video in protections.
234 Ad rejected because the publisher blocked display ads in protections. Ad rejected because the publisher blocked display ads in protections.
235 Ad filtered because the currency specified in the bid response is invalid. Ad filtered because the currency specified in the bid response is invalid.
Published in the Google Authorized Buyers creative status codes . The OpenRTB list these sit beside is the loss reason code table .
---
# Google creative status code 1: Creative won the auction · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/1/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 1: Creative won the auction
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative won the auction
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 1 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 1 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 1.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 2 : Internal error
Google creative status code 3 : Unknown error (deprecated)
---
# Google creative status code 2: Internal error · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/2/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 2: Internal error
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Internal error
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 2 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 2 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 2.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 1 : Creative won the auction
Google creative status code 3 : Unknown error (deprecated)
Google creative status code 4 : Internal error: unknown status code
---
# Google creative status code 3: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/3/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 3: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 3 is this status.
## What was checked
Creative status 3 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 3 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 1 : Creative won the auction
Google creative status code 2 : Internal error
Google creative status code 4 : Internal error: unknown status code
Google creative status code 5 : Creative filtered due to landing page quality
---
# Google creative status code 4: Internal error: unknown status code · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/4/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 4: Internal error: unknown status code
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Internal error: unknown status code
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 4 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 4 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 4.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 2 : Internal error
Google creative status code 3 : Unknown error (deprecated)
Google creative status code 5 : Creative filtered due to landing page quality
Google creative status code 6 : Creative filtered because malware was detected
---
# Google creative status code 5: Creative filtered due to landing page quality · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/5/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 5: Creative filtered due to landing page quality
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to landing page quality
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 5 is this status.
## What was checked
Google reviewed the landing page the creative clicks through to.
## What to change
Change the landing page. The creative stays filtered while that page fails the quality check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 3 : Unknown error (deprecated)
Google creative status code 4 : Internal error: unknown status code
Google creative status code 6 : Creative filtered because malware was detected
Google creative status code 7 : Creative URL has not yet been reviewed
---
# Google creative status code 6: Creative filtered because malware was detected · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/6/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 6: Creative filtered because malware was detected
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because malware was detected
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 6 is this status.
## What was checked
Google's malware scan flagged the creative or its landing page.
## What to change
Pull the creative. Resubmitting the same asset returns this status until the flagged file is gone.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 4 : Internal error: unknown status code
Google creative status code 5 : Creative filtered due to landing page quality
Google creative status code 7 : Creative URL has not yet been reviewed
Google creative status code 8 : Unknown error (deprecated)
---
# Google creative status code 7: Creative URL has not yet been reviewed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/7/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 7: Creative URL has not yet been reviewed
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative URL has not yet been reviewed
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 7 is this status.
## What was checked
Google has not finished reviewing or categorizing this creative URL.
## What to change
Wait for review. Bidding the URL again before Google categorizes it returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 5 : Creative filtered due to landing page quality
Google creative status code 6 : Creative filtered because malware was detected
Google creative status code 8 : Unknown error (deprecated)
Google creative status code 9 : Unknown error (deprecated)
---
# Google creative status code 8: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/8/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 8: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 8 is this status.
## What was checked
Creative status 8 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 8 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 6 : Creative filtered because malware was detected
Google creative status code 7 : Creative URL has not yet been reviewed
Google creative status code 9 : Unknown error (deprecated)
Google creative status code 10 : Creative was not approved
---
# Google creative status code 9: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/9/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 9: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 9 is this status.
## What was checked
Creative status 9 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 9 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 7 : Creative URL has not yet been reviewed
Google creative status code 8 : Unknown error (deprecated)
Google creative status code 10 : Creative was not approved
Google creative status code 11 : Creative has not yet been categorized
---
# Google creative status code 10: Creative was not approved · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/10/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 10: Creative was not approved
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative was not approved
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 10 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 10 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 10.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 8 : Unknown error (deprecated)
Google creative status code 9 : Unknown error (deprecated)
Google creative status code 11 : Creative has not yet been categorized
Google creative status code 12 : Creative filtered by publisher through the Publisher Controls ad review tool
---
# Google creative status code 11: Creative has not yet been categorized · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/11/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 11: Creative has not yet been categorized
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative has not yet been categorized
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 11 is this status.
## What was checked
Google has not finished reviewing or categorizing this creative URL.
## What to change
Wait for review. Bidding the URL again before Google categorizes it returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 9 : Unknown error (deprecated)
Google creative status code 10 : Creative was not approved
Google creative status code 12 : Creative filtered by publisher through the Publisher Controls ad review tool
Google creative status code 13 : Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
---
# Google creative status code 12: Creative filtered by publisher through the Publisher Controls ad review tool · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/12/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 12: Creative filtered by publisher through the Publisher Controls ad review tool
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered by publisher through the Publisher Controls ad review tool
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 12 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 10 : Creative was not approved
Google creative status code 11 : Creative has not yet been categorized
Google creative status code 13 : Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
Google creative status code 14 : Creative filtered because of detected excluded_sensitive_category
---
# Google creative status code 13: Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/13/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 13: Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 13 is this status.
## What was checked
Google's creative policy, or the inventory context, rejected the ad.
## What to change
Replace the creative. Policy statuses stay on the asset until the violating content is gone.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 11 : Creative has not yet been categorized
Google creative status code 12 : Creative filtered by publisher through the Publisher Controls ad review tool
Google creative status code 14 : Creative filtered because of detected excluded_sensitive_category
Google creative status code 15 : Creative filtered because one or more detected product categories were excluded in the bid request
---
# Google creative status code 14: Creative filtered because of detected excluded_sensitive_category · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/14/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 14: Creative filtered because of detected excluded_sensitive_category
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because of detected excluded_sensitive_category
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 14 is this status.
## What was checked
Google detected a sensitive category on the creative and compared it with the exclusions on the request.
## What to change
The request excludes that sensitive category. Bid a different creative on this impression.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 12 : Creative filtered by publisher through the Publisher Controls ad review tool
Google creative status code 13 : Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
Google creative status code 15 : Creative filtered because one or more detected product categories were excluded in the bid request
Google creative status code 16 : Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
---
# Google creative status code 15: Creative filtered because one or more detected product categories were excluded in the bid request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/15/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 15: Creative filtered because one or more detected product categories were excluded in the bid request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more detected product categories were excluded in the bid request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 15 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 15 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 15.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 13 : Creative filtered because the context of the inventory was incompatible with ad content, according to ad policy
Google creative status code 14 : Creative filtered because of detected excluded_sensitive_category
Google creative status code 16 : Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
Google creative status code 17 : Creative filtered because one or more declared vendors were excluded in the bid request
---
# Google creative status code 16: Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/16/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 16: Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 16 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 14 : Creative filtered because of detected excluded_sensitive_category
Google creative status code 15 : Creative filtered because one or more detected product categories were excluded in the bid request
Google creative status code 17 : Creative filtered because one or more declared vendors were excluded in the bid request
Google creative status code 18 : Creative filtered because one or more declared attributes were excluded in the bid request
---
# Google creative status code 17: Creative filtered because one or more declared vendors were excluded in the bid request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/17/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 17: Creative filtered because one or more declared vendors were excluded in the bid request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more declared vendors were excluded in the bid request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 17 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 15 : Creative filtered because one or more detected product categories were excluded in the bid request
Google creative status code 16 : Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
Google creative status code 18 : Creative filtered because one or more declared attributes were excluded in the bid request
Google creative status code 19 : Creative filtered because one or more declared sensitive categories were excluded in the bid request
---
# Google creative status code 18: Creative filtered because one or more declared attributes were excluded in the bid request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/18/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 18: Creative filtered because one or more declared attributes were excluded in the bid request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more declared attributes were excluded in the bid request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 18 is this status.
## What was checked
Google checked declared creative attributes against the exclusions on the request.
## What to change
Drop the excluded attribute, or skip requests that block it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 16 : Creative filtered because one or more detected vendors are ineligible to serve ads on the Ad Exchange
Google creative status code 17 : Creative filtered because one or more declared vendors were excluded in the bid request
Google creative status code 19 : Creative filtered because one or more declared sensitive categories were excluded in the bid request
Google creative status code 20 : Unknown error (deprecated)
---
# Google creative status code 19: Creative filtered because one or more declared sensitive categories were excluded in the bid request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/19/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 19: Creative filtered because one or more declared sensitive categories were excluded in the bid request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more declared sensitive categories were excluded in the bid request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 19 is this status.
## What was checked
Google detected a sensitive category on the creative and compared it with the exclusions on the request.
## What to change
The request excludes that sensitive category. Bid a different creative on this impression.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 17 : Creative filtered because one or more declared vendors were excluded in the bid request
Google creative status code 18 : Creative filtered because one or more declared attributes were excluded in the bid request
Google creative status code 20 : Unknown error (deprecated)
Google creative status code 21 : Creative filtered because the required field buyer_creative_id is missing
---
# Google creative status code 20: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/20/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 20: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 20 is this status.
## What was checked
Creative status 20 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 20 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 18 : Creative filtered because one or more declared attributes were excluded in the bid request
Google creative status code 19 : Creative filtered because one or more declared sensitive categories were excluded in the bid request
Google creative status code 21 : Creative filtered because the required field buyer_creative_id is missing
Google creative status code 22 : Creative filtered because no matching ad slot was found
---
# Google creative status code 21: Creative filtered because the required field buyer_creative_id is missing · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/21/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 21: Creative filtered because the required field buyer_creative_id is missing
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required field buyer_creative_id is missing
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 21 is this status.
## What was checked
Google required buyer_creative_id and did not accept the value it found.
## What to change
Set buyer_creative_id to the value this request expects. Status 21 is that field check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 19 : Creative filtered because one or more declared sensitive categories were excluded in the bid request
Google creative status code 20 : Unknown error (deprecated)
Google creative status code 22 : Creative filtered because no matching ad slot was found
Google creative status code 23 : Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
---
# Google creative status code 22: Creative filtered because no matching ad slot was found · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/22/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 22: Creative filtered because no matching ad slot was found
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because no matching ad slot was found
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 22 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 22 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 22.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 20 : Unknown error (deprecated)
Google creative status code 21 : Creative filtered because the required field buyer_creative_id is missing
Google creative status code 23 : Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
Google creative status code 24 : Creative filtered because the required adgroup_id field is missing
---
# Google creative status code 23: Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/23/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 23: Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 23 is this status.
## What was checked
Google checked adgroup_id against the ad groups that matched the request.
## What to change
Return an adgroup_id from the matched set. A missing or unknown id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 21 : Creative filtered because the required field buyer_creative_id is missing
Google creative status code 22 : Creative filtered because no matching ad slot was found
Google creative status code 24 : Creative filtered because the required adgroup_id field is missing
Google creative status code 25 : Creative filtered because the declared width and height do not match the request
---
# Google creative status code 24: Creative filtered because the required adgroup_id field is missing · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/24/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 24: Creative filtered because the required adgroup_id field is missing
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required adgroup_id field is missing
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 24 is this status.
## What was checked
Google checked adgroup_id against the ad groups that matched the request.
## What to change
Return an adgroup_id from the matched set. A missing or unknown id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 22 : Creative filtered because no matching ad slot was found
Google creative status code 23 : Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
Google creative status code 25 : Creative filtered because the declared width and height do not match the request
Google creative status code 26 : Creative filtered because the required fields width or height are missing
---
# Google creative status code 25: Creative filtered because the declared width and height do not match the request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/25/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 25: Creative filtered because the declared width and height do not match the request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the declared width and height do not match the request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 25 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 23 : Creative filtered because the returned adgroup_id is invalid (not one of the matched adgroups)
Google creative status code 24 : Creative filtered because the required adgroup_id field is missing
Google creative status code 26 : Creative filtered because the required fields width or height are missing
Google creative status code 27 : Creative filtered because it includes more than one of the following: html_snippet, video_url
---
# Google creative status code 26: Creative filtered because the required fields width or height are missing · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/26/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 26: Creative filtered because the required fields width or height are missing
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required fields width or height are missing
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 26 is this status.
## What was checked
Google required width or height and did not accept the value it found.
## What to change
Set width or height to the value this request expects. Status 26 is that field check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 24 : Creative filtered because the required adgroup_id field is missing
Google creative status code 25 : Creative filtered because the declared width and height do not match the request
Google creative status code 27 : Creative filtered because it includes more than one of the following: html_snippet, video_url
Google creative status code 28 : Creative filtered because click_through_url was not empty
---
# Google creative status code 27: Creative filtered because it includes more than one of the following: html_snippet, video_url · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/27/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 27: Creative filtered because it includes more than one of the following: html_snippet, video_url
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it includes more than one of the following: html_snippet, video_url
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 27 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 25 : Creative filtered because the declared width and height do not match the request
Google creative status code 26 : Creative filtered because the required fields width or height are missing
Google creative status code 28 : Creative filtered because click_through_url was not empty
Google creative status code 29 : Unknown error (deprecated)
---
# Google creative status code 28: Creative filtered because click_through_url was not empty · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/28/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 28: Creative filtered because click_through_url was not empty
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because click_through_url was not empty
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 28 is this status.
## What was checked
Google checked click_through_url .
## What to change
Leave click_through_url empty for this request. A populated value returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 26 : Creative filtered because the required fields width or height are missing
Google creative status code 27 : Creative filtered because it includes more than one of the following: html_snippet, video_url
Google creative status code 29 : Unknown error (deprecated)
Google creative status code 30 : Unknown error (deprecated)
---
# Google creative status code 29: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/29/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 29: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 29 is this status.
## What was checked
Creative status 29 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 29 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 27 : Creative filtered because it includes more than one of the following: html_snippet, video_url
Google creative status code 28 : Creative filtered because click_through_url was not empty
Google creative status code 30 : Unknown error (deprecated)
Google creative status code 31 : Unknown error (deprecated)
---
# Google creative status code 30: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/30/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 30: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 30 is this status.
## What was checked
Creative status 30 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 30 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 28 : Creative filtered because click_through_url was not empty
Google creative status code 29 : Unknown error (deprecated)
Google creative status code 31 : Unknown error (deprecated)
Google creative status code 32 : Unknown error (deprecated)
---
# Google creative status code 31: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/31/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 31: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 31 is this status.
## What was checked
Creative status 31 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 31 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 29 : Unknown error (deprecated)
Google creative status code 30 : Unknown error (deprecated)
Google creative status code 32 : Unknown error (deprecated)
Google creative status code 33 : Creative filtered because the required field html_snippet was empty
---
# Google creative status code 32: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/32/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 32: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 32 is this status.
## What was checked
Creative status 32 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 32 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 30 : Unknown error (deprecated)
Google creative status code 31 : Unknown error (deprecated)
Google creative status code 33 : Creative filtered because the required field html_snippet was empty
Google creative status code 34 : Creative filtered because the required field video_url was empty
---
# Google creative status code 33: Creative filtered because the required field html_snippet was empty · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/33/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 33: Creative filtered because the required field html_snippet was empty
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required field html_snippet was empty
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 33 is this status.
## What was checked
Google required html_snippet and did not accept the value it found.
## What to change
Set html_snippet to the value this request expects. Status 33 is that field check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 31 : Unknown error (deprecated)
Google creative status code 32 : Unknown error (deprecated)
Google creative status code 34 : Creative filtered because the required field video_url was empty
Google creative status code 35 : Unknown error (deprecated)
---
# Google creative status code 34: Creative filtered because the required field video_url was empty · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/34/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 34: Creative filtered because the required field video_url was empty
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required field video_url was empty
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 34 is this status.
## What was checked
Google required video_url and did not accept the value it found.
## What to change
Set video_url to the value this request expects. Status 34 is that field check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 32 : Unknown error (deprecated)
Google creative status code 33 : Creative filtered because the required field html_snippet was empty
Google creative status code 35 : Unknown error (deprecated)
Google creative status code 36 : Creative filtered because the required field click_through_url was empty
---
# Google creative status code 35: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/35/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 35: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 35 is this status.
## What was checked
Creative status 35 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 35 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 33 : Creative filtered because the required field html_snippet was empty
Google creative status code 34 : Creative filtered because the required field video_url was empty
Google creative status code 36 : Creative filtered because the required field click_through_url was empty
Google creative status code 37 : Creative filtered because html_snippet should be empty when video is requested
---
# Google creative status code 36: Creative filtered because the required field click_through_url was empty · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/36/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 36: Creative filtered because the required field click_through_url was empty
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required field click_through_url was empty
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 36 is this status.
## What was checked
Google required click_through_url and did not accept the value it found.
## What to change
Set click_through_url to the value this request expects. Status 36 is that field check.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 34 : Creative filtered because the required field video_url was empty
Google creative status code 35 : Unknown error (deprecated)
Google creative status code 37 : Creative filtered because html_snippet should be empty when video is requested
Google creative status code 38 : Creative filtered because video_url field was not empty, should be empty unless video is requested
---
# Google creative status code 37: Creative filtered because html_snippet should be empty when video is requested · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/37/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 37: Creative filtered because html_snippet should be empty when video is requested
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because html_snippet should be empty when video is requested
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 37 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 35 : Unknown error (deprecated)
Google creative status code 36 : Creative filtered because the required field click_through_url was empty
Google creative status code 38 : Creative filtered because video_url field was not empty, should be empty unless video is requested
Google creative status code 39 : Unknown error (deprecated)
---
# Google creative status code 38: Creative filtered because video_url field was not empty, should be empty unless video is requested · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/38/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 38: Creative filtered because video_url field was not empty, should be empty unless video is requested
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because video_url field was not empty, should be empty unless video is requested
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 38 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 36 : Creative filtered because the required field click_through_url was empty
Google creative status code 37 : Creative filtered because html_snippet should be empty when video is requested
Google creative status code 39 : Unknown error (deprecated)
Google creative status code 40 : Unknown error (deprecated)
---
# Google creative status code 39: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/39/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 39: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 39 is this status.
## What was checked
Creative status 39 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 39 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 37 : Creative filtered because html_snippet should be empty when video is requested
Google creative status code 38 : Creative filtered because video_url field was not empty, should be empty unless video is requested
Google creative status code 40 : Unknown error (deprecated)
Google creative status code 41 : Unknown error (deprecated)
---
# Google creative status code 40: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/40/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 40: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 40 is this status.
## What was checked
Creative status 40 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 40 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 38 : Creative filtered because video_url field was not empty, should be empty unless video is requested
Google creative status code 39 : Unknown error (deprecated)
Google creative status code 41 : Unknown error (deprecated)
Google creative status code 42 : Unknown error (deprecated)
---
# Google creative status code 41: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/41/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 41: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 41 is this status.
## What was checked
Creative status 41 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 41 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 39 : Unknown error (deprecated)
Google creative status code 40 : Unknown error (deprecated)
Google creative status code 42 : Unknown error (deprecated)
Google creative status code 43 : Unknown error (deprecated)
---
# Google creative status code 42: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/42/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 42: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 42 is this status.
## What was checked
Creative status 42 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 42 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 40 : Unknown error (deprecated)
Google creative status code 41 : Unknown error (deprecated)
Google creative status code 43 : Unknown error (deprecated)
Google creative status code 44 : Unknown error (deprecated)
---
# Google creative status code 43: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/43/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 43: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 43 is this status.
## What was checked
Creative status 43 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 43 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 41 : Unknown error (deprecated)
Google creative status code 42 : Unknown error (deprecated)
Google creative status code 44 : Unknown error (deprecated)
Google creative status code 45 : Unknown error (deprecated)
---
# Google creative status code 44: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/44/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 44: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 44 is this status.
## What was checked
Creative status 44 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 44 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 42 : Unknown error (deprecated)
Google creative status code 43 : Unknown error (deprecated)
Google creative status code 45 : Unknown error (deprecated)
Google creative status code 46 : Unknown error (deprecated)
---
# Google creative status code 45: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/45/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 45: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 45 is this status.
## What was checked
Creative status 45 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 45 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 43 : Unknown error (deprecated)
Google creative status code 44 : Unknown error (deprecated)
Google creative status code 46 : Unknown error (deprecated)
Google creative status code 47 : Unknown error (deprecated)
---
# Google creative status code 46: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/46/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 46: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 46 is this status.
## What was checked
Creative status 46 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 46 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 44 : Unknown error (deprecated)
Google creative status code 45 : Unknown error (deprecated)
Google creative status code 47 : Unknown error (deprecated)
Google creative status code 48 : Unknown error (deprecated)
---
# Google creative status code 47: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/47/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 47: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 47 is this status.
## What was checked
Creative status 47 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 47 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 45 : Unknown error (deprecated)
Google creative status code 46 : Unknown error (deprecated)
Google creative status code 48 : Unknown error (deprecated)
Google creative status code 49 : Unknown error (deprecated)
---
# Google creative status code 48: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/48/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 48: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 48 is this status.
## What was checked
Creative status 48 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 48 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 46 : Unknown error (deprecated)
Google creative status code 47 : Unknown error (deprecated)
Google creative status code 49 : Unknown error (deprecated)
Google creative status code 50 : Unknown error (deprecated)
---
# Google creative status code 49: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/49/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 49: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 49 is this status.
## What was checked
Creative status 49 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 49 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 47 : Unknown error (deprecated)
Google creative status code 48 : Unknown error (deprecated)
Google creative status code 50 : Unknown error (deprecated)
Google creative status code 51 : Unknown error (deprecated)
---
# Google creative status code 50: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/50/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 50: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 50 is this status.
## What was checked
Creative status 50 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 50 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 48 : Unknown error (deprecated)
Google creative status code 49 : Unknown error (deprecated)
Google creative status code 51 : Unknown error (deprecated)
Google creative status code 52 : Unknown error (deprecated)
---
# Google creative status code 51: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/51/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 51: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 51 is this status.
## What was checked
Creative status 51 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 51 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 49 : Unknown error (deprecated)
Google creative status code 50 : Unknown error (deprecated)
Google creative status code 52 : Unknown error (deprecated)
Google creative status code 53 : Unknown error (deprecated)
---
# Google creative status code 52: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/52/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 52: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 52 is this status.
## What was checked
Creative status 52 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 52 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 50 : Unknown error (deprecated)
Google creative status code 51 : Unknown error (deprecated)
Google creative status code 53 : Unknown error (deprecated)
Google creative status code 54 : Unknown error (deprecated)
---
# Google creative status code 53: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/53/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 53: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 53 is this status.
## What was checked
Creative status 53 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 53 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 51 : Unknown error (deprecated)
Google creative status code 52 : Unknown error (deprecated)
Google creative status code 54 : Unknown error (deprecated)
Google creative status code 55 : Unknown error (deprecated)
---
# Google creative status code 54: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/54/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 54: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 54 is this status.
## What was checked
Creative status 54 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 54 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 52 : Unknown error (deprecated)
Google creative status code 53 : Unknown error (deprecated)
Google creative status code 55 : Unknown error (deprecated)
Google creative status code 56 : Creative filtered because the field click_through_url is too short, must be at least 11 characters
---
# Google creative status code 55: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/55/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 55: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 55 is this status.
## What was checked
Creative status 55 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 55 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 53 : Unknown error (deprecated)
Google creative status code 54 : Unknown error (deprecated)
Google creative status code 56 : Creative filtered because the field click_through_url is too short, must be at least 11 characters
Google creative status code 57 : Creative filtered because the field click_through_url could not be parsed
---
# Google creative status code 56: Creative filtered because the field click_through_url is too short, must be at least 11 characters · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/56/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 56: Creative filtered because the field click_through_url is too short, must be at least 11 characters
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field click_through_url is too short, must be at least 11 characters
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 56 is this status.
## What was checked
Google checked click_through_url .
## What to change
Fill click_through_url . An empty value returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 54 : Unknown error (deprecated)
Google creative status code 55 : Unknown error (deprecated)
Google creative status code 57 : Creative filtered because the field click_through_url could not be parsed
Google creative status code 58 : Creative filtered because the field click_through_url has a domain consisting of all digits
---
# Google creative status code 57: Creative filtered because the field click_through_url could not be parsed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/57/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 57: Creative filtered because the field click_through_url could not be parsed
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field click_through_url could not be parsed
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 57 is this status.
## What was checked
Google checked click_through_url .
## What to change
Fill click_through_url . An empty value returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 55 : Unknown error (deprecated)
Google creative status code 56 : Creative filtered because the field click_through_url is too short, must be at least 11 characters
Google creative status code 58 : Creative filtered because the field click_through_url has a domain consisting of all digits
Google creative status code 59 : Creative filtered because the field video_url is too short, must be at least 11 characters
---
# Google creative status code 58: Creative filtered because the field click_through_url has a domain consisting of all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/58/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 58: Creative filtered because the field click_through_url has a domain consisting of all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field click_through_url has a domain consisting of all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 58 is this status.
## What was checked
Google checked click_through_url .
## What to change
Fill click_through_url . An empty value returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 56 : Creative filtered because the field click_through_url is too short, must be at least 11 characters
Google creative status code 57 : Creative filtered because the field click_through_url could not be parsed
Google creative status code 59 : Creative filtered because the field video_url is too short, must be at least 11 characters
Google creative status code 60 : Creative filtered because the field video_url could not be parsed
---
# Google creative status code 59: Creative filtered because the field video_url is too short, must be at least 11 characters · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/59/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 59: Creative filtered because the field video_url is too short, must be at least 11 characters
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field video_url is too short, must be at least 11 characters
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 59 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 57 : Creative filtered because the field click_through_url could not be parsed
Google creative status code 58 : Creative filtered because the field click_through_url has a domain consisting of all digits
Google creative status code 60 : Creative filtered because the field video_url could not be parsed
Google creative status code 61 : Creative filtered because the field video_url has a domain consisting of all digits
---
# Google creative status code 60: Creative filtered because the field video_url could not be parsed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/60/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 60: Creative filtered because the field video_url could not be parsed
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field video_url could not be parsed
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 60 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 58 : Creative filtered because the field click_through_url has a domain consisting of all digits
Google creative status code 59 : Creative filtered because the field video_url is too short, must be at least 11 characters
Google creative status code 61 : Creative filtered because the field video_url has a domain consisting of all digits
Google creative status code 62 : Unknown error (deprecated)
---
# Google creative status code 61: Creative filtered because the field video_url has a domain consisting of all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/61/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 61: Creative filtered because the field video_url has a domain consisting of all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field video_url has a domain consisting of all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 61 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 59 : Creative filtered because the field video_url is too short, must be at least 11 characters
Google creative status code 60 : Creative filtered because the field video_url could not be parsed
Google creative status code 62 : Unknown error (deprecated)
Google creative status code 63 : Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
---
# Google creative status code 62: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/62/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 62: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 62 is this status.
## What was checked
Creative status 62 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 62 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 60 : Creative filtered because the field video_url could not be parsed
Google creative status code 61 : Creative filtered because the field video_url has a domain consisting of all digits
Google creative status code 63 : Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
Google creative status code 64 : Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
---
# Google creative status code 63: Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/63/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 63: Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 63 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 61 : Creative filtered because the field video_url has a domain consisting of all digits
Google creative status code 62 : Unknown error (deprecated)
Google creative status code 64 : Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
Google creative status code 65 : Unknown error (deprecated)
---
# Google creative status code 64: Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/64/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 64: Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 64 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 62 : Unknown error (deprecated)
Google creative status code 63 : Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
Google creative status code 65 : Unknown error (deprecated)
Google creative status code 66 : Creative filtered because the field buyer_creative_id exceeds 64 bytes
---
# Google creative status code 65: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/65/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 65: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 65 is this status.
## What was checked
Creative status 65 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 65 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 63 : Creative filtered because an expandable vendor was declared, but expandable directions are missing from Ad.attribute
Google creative status code 64 : Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
Google creative status code 66 : Creative filtered because the field buyer_creative_id exceeds 64 bytes
Google creative status code 67 : Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
---
# Google creative status code 66: Creative filtered because the field buyer_creative_id exceeds 64 bytes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/66/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 66: Creative filtered because the field buyer_creative_id exceeds 64 bytes
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field buyer_creative_id exceeds 64 bytes
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 66 is this status.
## What was checked
Google looked for buyer_creative_id on the creative.
## What to change
Send buyer_creative_id . Google drops the creative when the field is missing.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 64 : Creative filtered because expandable directions were passed in Ad.attribute, but an expandable vendor declaration is missing
Google creative status code 65 : Unknown error (deprecated)
Google creative status code 67 : Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
Google creative status code 68 : Creative filtered because max_cpm_micros is not greater than 0
---
# Google creative status code 67: Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/67/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 67: Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 67 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 67 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 67.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 65 : Unknown error (deprecated)
Google creative status code 66 : Creative filtered because the field buyer_creative_id exceeds 64 bytes
Google creative status code 68 : Creative filtered because max_cpm_micros is not greater than 0
Google creative status code 69 : Unknown error (deprecated)
---
# Google creative status code 68: Creative filtered because max_cpm_micros is not greater than 0 · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/68/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 68: Creative filtered because max_cpm_micros is not greater than 0
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because max_cpm_micros is not greater than 0
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 68 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 68 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 68.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 66 : Creative filtered because the field buyer_creative_id exceeds 64 bytes
Google creative status code 67 : Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
Google creative status code 69 : Unknown error (deprecated)
Google creative status code 70 : Unknown error (deprecated)
---
# Google creative status code 69: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/69/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 69: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 69 is this status.
## What was checked
Creative status 69 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 69 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 67 : Creative filtered because max_cpm_micros is not greater than or equal to min_cpm_micros
Google creative status code 68 : Creative filtered because max_cpm_micros is not greater than 0
Google creative status code 70 : Unknown error (deprecated)
Google creative status code 71 : Creative filtered due to publisher's URL exclusion settings
---
# Google creative status code 70: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/70/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 70: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 70 is this status.
## What was checked
Creative status 70 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 70 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 68 : Creative filtered because max_cpm_micros is not greater than 0
Google creative status code 69 : Unknown error (deprecated)
Google creative status code 71 : Creative filtered due to publisher's URL exclusion settings
Google creative status code 72 : Creative filtered due to publisher's advertiser exclusion settings
---
# Google creative status code 71: Creative filtered due to publisher's URL exclusion settings · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/71/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 71: Creative filtered due to publisher's URL exclusion settings
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to publisher's URL exclusion settings
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 71 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 69 : Unknown error (deprecated)
Google creative status code 70 : Unknown error (deprecated)
Google creative status code 72 : Creative filtered due to publisher's advertiser exclusion settings
Google creative status code 73 : Creative filtered due to publisher's targeting type settings
---
# Google creative status code 72: Creative filtered due to publisher's advertiser exclusion settings · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/72/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 72: Creative filtered due to publisher's advertiser exclusion settings
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to publisher's advertiser exclusion settings
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 72 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 70 : Unknown error (deprecated)
Google creative status code 71 : Creative filtered due to publisher's URL exclusion settings
Google creative status code 73 : Creative filtered due to publisher's targeting type settings
Google creative status code 74 : Creative filtered because it has historically had a high error rate and/or very low view rate
---
# Google creative status code 73: Creative filtered due to publisher's targeting type settings · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/73/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 73: Creative filtered due to publisher's targeting type settings
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to publisher's targeting type settings
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 73 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 71 : Creative filtered due to publisher's URL exclusion settings
Google creative status code 72 : Creative filtered due to publisher's advertiser exclusion settings
Google creative status code 74 : Creative filtered because it has historically had a high error rate and/or very low view rate
Google creative status code 75 : Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
---
# Google creative status code 74: Creative filtered because it has historically had a high error rate and/or very low view rate · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/74/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 74: Creative filtered because it has historically had a high error rate and/or very low view rate
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it has historically had a high error rate and/or very low view rate
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 74 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 74 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 74.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 72 : Creative filtered due to publisher's advertiser exclusion settings
Google creative status code 73 : Creative filtered due to publisher's targeting type settings
Google creative status code 75 : Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
Google creative status code 76 : Creative filtered because the VAST XML contains errors or could not be fetched for verification
---
# Google creative status code 75: Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/75/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 75: Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 75 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 75 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 75.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 73 : Creative filtered due to publisher's targeting type settings
Google creative status code 74 : Creative filtered because it has historically had a high error rate and/or very low view rate
Google creative status code 76 : Creative filtered because the VAST XML contains errors or could not be fetched for verification
Google creative status code 77 : Creative is awaiting review by the publisher
---
# Google creative status code 76: Creative filtered because the VAST XML contains errors or could not be fetched for verification · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/76/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 76: Creative filtered because the VAST XML contains errors or could not be fetched for verification
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the VAST XML contains errors or could not be fetched for verification
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 76 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 76 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 76.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 74 : Creative filtered because it has historically had a high error rate and/or very low view rate
Google creative status code 75 : Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
Google creative status code 77 : Creative is awaiting review by the publisher
Google creative status code 78 : Creative filtered because the declared creative size was not present in pre-targeting adgroup
---
# Google creative status code 77: Creative is awaiting review by the publisher · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/77/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 77: Creative is awaiting review by the publisher
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative is awaiting review by the publisher
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 77 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 75 : Creative filtered because the hosted creative had the wrong size or was not in a matching adgroup
Google creative status code 76 : Creative filtered because the VAST XML contains errors or could not be fetched for verification
Google creative status code 78 : Creative filtered because the declared creative size was not present in pre-targeting adgroup
Google creative status code 79 : Creative was outbid
---
# Google creative status code 78: Creative filtered because the declared creative size was not present in pre-targeting adgroup · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/78/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 78: Creative filtered because the declared creative size was not present in pre-targeting adgroup
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the declared creative size was not present in pre-targeting adgroup
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 78 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 78 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 78.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 76 : Creative filtered because the VAST XML contains errors or could not be fetched for verification
Google creative status code 77 : Creative is awaiting review by the publisher
Google creative status code 79 : Creative was outbid
Google creative status code 80 : Creative filtered because the bid price was below the minimum CPM threshold
---
# Google creative status code 79: Creative was outbid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/79/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 79: Creative was outbid
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative was outbid
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 79 is this status.
## What was checked
Google compared the bid price with the price that won.
## What to change
This is a price loss, not a creative defect. Read ${AUCTION_MIN_TO_WIN} on the same notice when Google fills it, and raise the bid if the campaign should have won.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 77 : Creative is awaiting review by the publisher
Google creative status code 78 : Creative filtered because the declared creative size was not present in pre-targeting adgroup
Google creative status code 80 : Creative filtered because the bid price was below the minimum CPM threshold
Google creative status code 81 : Creative was not allowed in Private Auction or Preferred Deal
---
# Google creative status code 80: Creative filtered because the bid price was below the minimum CPM threshold · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/80/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 80: Creative filtered because the bid price was below the minimum CPM threshold
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the bid price was below the minimum CPM threshold
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 80 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 80 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 80.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 78 : Creative filtered because the declared creative size was not present in pre-targeting adgroup
Google creative status code 79 : Creative was outbid
Google creative status code 81 : Creative was not allowed in Private Auction or Preferred Deal
Google creative status code 82 : Creative filtered because the ad language is not allowed by the publisher
---
# Google creative status code 81: Creative was not allowed in Private Auction or Preferred Deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/81/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 81: Creative was not allowed in Private Auction or Preferred Deal
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative was not allowed in Private Auction or Preferred Deal
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 81 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 79 : Creative was outbid
Google creative status code 80 : Creative filtered because the bid price was below the minimum CPM threshold
Google creative status code 82 : Creative filtered because the ad language is not allowed by the publisher
Google creative status code 83 : The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
---
# Google creative status code 82: Creative filtered because the ad language is not allowed by the publisher · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/82/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 82: Creative filtered because the ad language is not allowed by the publisher
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the ad language is not allowed by the publisher
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 82 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 80 : Creative filtered because the bid price was below the minimum CPM threshold
Google creative status code 81 : Creative was not allowed in Private Auction or Preferred Deal
Google creative status code 83 : The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
Google creative status code 84 : Creative filtered because the publisher disallows ads from this agency
---
# Google creative status code 83: The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/83/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 83: The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 83 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 83 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 83.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 81 : Creative was not allowed in Private Auction or Preferred Deal
Google creative status code 82 : Creative filtered because the ad language is not allowed by the publisher
Google creative status code 84 : Creative filtered because the publisher disallows ads from this agency
Google creative status code 85 : Creative requires additional review
---
# Google creative status code 84: Creative filtered because the publisher disallows ads from this agency · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/84/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 84: Creative filtered because the publisher disallows ads from this agency
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the publisher disallows ads from this agency
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 84 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 82 : Creative filtered because the ad language is not allowed by the publisher
Google creative status code 83 : The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
Google creative status code 85 : Creative requires additional review
Google creative status code 86 : Creative filtered because one or more undeclared restricted_category fields were detected
---
# Google creative status code 85: Creative requires additional review · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/85/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 85: Creative requires additional review
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative requires additional review
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 85 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 85 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 85.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 83 : The ad was part of a winning passback chain and will only show if preceding requests in the chain pass back
Google creative status code 84 : Creative filtered because the publisher disallows ads from this agency
Google creative status code 86 : Creative filtered because one or more undeclared restricted_category fields were detected
Google creative status code 87 : Creative filtered because one or more declared restricted_category fields do not match the request
---
# Google creative status code 86: Creative filtered because one or more undeclared restricted_category fields were detected · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/86/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 86: Creative filtered because one or more undeclared restricted_category fields were detected
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more undeclared restricted_category fields were detected
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 86 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 86 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 86.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 84 : Creative filtered because the publisher disallows ads from this agency
Google creative status code 85 : Creative requires additional review
Google creative status code 87 : Creative filtered because one or more declared restricted_category fields do not match the request
Google creative status code 88 : Creative filtered because deal_id is not for a valid deal
---
# Google creative status code 87: Creative filtered because one or more declared restricted_category fields do not match the request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/87/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 87: Creative filtered because one or more declared restricted_category fields do not match the request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because one or more declared restricted_category fields do not match the request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 87 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 87 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 87.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 85 : Creative requires additional review
Google creative status code 86 : Creative filtered because one or more undeclared restricted_category fields were detected
Google creative status code 88 : Creative filtered because deal_id is not for a valid deal
Google creative status code 89 : Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen...
---
# Google creative status code 88: Creative filtered because deal_id is not for a valid deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/88/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 88: Creative filtered because deal_id is not for a valid deal
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because deal_id is not for a valid deal
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 88 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 86 : Creative filtered because one or more undeclared restricted_category fields were detected
Google creative status code 87 : Creative filtered because one or more declared restricted_category fields do not match the request
Google creative status code 89 : Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen...
Google creative status code 90 : AdX VAST ad type does not match the type required in the video ad request
---
# Google creative status code 89: Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/89/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 89: Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen width and 40% height)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 89 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 87 : Creative filtered because one or more declared restricted_category fields do not match the request
Google creative status code 88 : Creative filtered because deal_id is not for a valid deal
Google creative status code 90 : AdX VAST ad type does not match the type required in the video ad request
Google creative status code 91 : Creative filtered because the duration of the video is too long
---
# Google creative status code 90: AdX VAST ad type does not match the type required in the video ad request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/90/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 90: AdX VAST ad type does not match the type required in the video ad request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
AdX VAST ad type does not match the type required in the video ad request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 90 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 90 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 90.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 88 : Creative filtered because deal_id is not for a valid deal
Google creative status code 89 : Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen...
Google creative status code 91 : Creative filtered because the duration of the video is too long
Google creative status code 92 : Creative filtered because the duration of the video is too short
---
# Google creative status code 91: Creative filtered because the duration of the video is too long · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/91/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 91: Creative filtered because the duration of the video is too long
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the duration of the video is too long
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 91 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 91 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 91.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 89 : Interstitial ad size declared is either too big or too small to show on the device screen (it needs to cover at least 50% of screen...
Google creative status code 90 : AdX VAST ad type does not match the type required in the video ad request
Google creative status code 92 : Creative filtered because the duration of the video is too short
Google creative status code 93 : Creative filtered because it is a skippable video ad for a non-skippable request
---
# Google creative status code 92: Creative filtered because the duration of the video is too short · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/92/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 92: Creative filtered because the duration of the video is too short
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the duration of the video is too short
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 92 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 92 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 92.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 90 : AdX VAST ad type does not match the type required in the video ad request
Google creative status code 91 : Creative filtered because the duration of the video is too long
Google creative status code 93 : Creative filtered because it is a skippable video ad for a non-skippable request
Google creative status code 94 : Creative filtered because it is a non-skippable video ad for a skippable-only request
---
# Google creative status code 93: Creative filtered because it is a skippable video ad for a non-skippable request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/93/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 93: Creative filtered because it is a skippable video ad for a non-skippable request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is a skippable video ad for a non-skippable request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 93 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 93 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 93.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 91 : Creative filtered because the duration of the video is too long
Google creative status code 92 : Creative filtered because the duration of the video is too short
Google creative status code 94 : Creative filtered because it is a non-skippable video ad for a skippable-only request
Google creative status code 95 : Creative filtered because the skip offset is wrong (5 seconds is the correct value)
---
# Google creative status code 94: Creative filtered because it is a non-skippable video ad for a skippable-only request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/94/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 94: Creative filtered because it is a non-skippable video ad for a skippable-only request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is a non-skippable video ad for a skippable-only request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 94 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 94 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 94.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 92 : Creative filtered because the duration of the video is too short
Google creative status code 93 : Creative filtered because it is a skippable video ad for a non-skippable request
Google creative status code 95 : Creative filtered because the skip offset is wrong (5 seconds is the correct value)
Google creative status code 96 : Creative filtered because it lacks a MP4 video file in the VAST
---
# Google creative status code 95: Creative filtered because the skip offset is wrong (5 seconds is the correct value) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/95/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 95: Creative filtered because the skip offset is wrong (5 seconds is the correct value)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the skip offset is wrong (5 seconds is the correct value)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 95 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 95 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 95.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 93 : Creative filtered because it is a skippable video ad for a non-skippable request
Google creative status code 94 : Creative filtered because it is a non-skippable video ad for a skippable-only request
Google creative status code 96 : Creative filtered because it lacks a MP4 video file in the VAST
Google creative status code 97 : Creative filtered because it lacks a WebM video file in the VAST
---
# Google creative status code 96: Creative filtered because it lacks a MP4 video file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/96/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 96: Creative filtered because it lacks a MP4 video file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a MP4 video file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 96 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 96 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 96.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 94 : Creative filtered because it is a non-skippable video ad for a skippable-only request
Google creative status code 95 : Creative filtered because the skip offset is wrong (5 seconds is the correct value)
Google creative status code 97 : Creative filtered because it lacks a WebM video file in the VAST
Google creative status code 98 : Creative filtered because it lacks a Flash video file in the VAST
---
# Google creative status code 97: Creative filtered because it lacks a WebM video file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/97/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 97: Creative filtered because it lacks a WebM video file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a WebM video file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 97 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 97 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 97.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 95 : Creative filtered because the skip offset is wrong (5 seconds is the correct value)
Google creative status code 96 : Creative filtered because it lacks a MP4 video file in the VAST
Google creative status code 98 : Creative filtered because it lacks a Flash video file in the VAST
Google creative status code 99 : Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
---
# Google creative status code 98: Creative filtered because it lacks a Flash video file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/98/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 98: Creative filtered because it lacks a Flash video file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a Flash video file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 98 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 98 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 98.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 96 : Creative filtered because it lacks a MP4 video file in the VAST
Google creative status code 97 : Creative filtered because it lacks a WebM video file in the VAST
Google creative status code 99 : Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
Google creative status code 100 : Unknown error (deprecated)
---
# Google creative status code 99: Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/99/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 99: Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 99 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 99 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 99.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 97 : Creative filtered because it lacks a WebM video file in the VAST
Google creative status code 98 : Creative filtered because it lacks a Flash video file in the VAST
Google creative status code 100 : Unknown error (deprecated)
Google creative status code 101 : Unknown error (deprecated)
---
# Google creative status code 100: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/100/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 100: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 100 is this status.
## What was checked
Creative status 100 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 100 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 98 : Creative filtered because it lacks a Flash video file in the VAST
Google creative status code 99 : Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
Google creative status code 101 : Unknown error (deprecated)
Google creative status code 102 : Creative filtered because the bidder account is in testing mode
---
# Google creative status code 101: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/101/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 101: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 101 is this status.
## What was checked
Creative status 101 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 101 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 99 : Creative filtered because it lacks a required video MIME type in the VAST file (the specific missing type is not available)
Google creative status code 100 : Unknown error (deprecated)
Google creative status code 102 : Creative filtered because the bidder account is in testing mode
Google creative status code 103 : Native ad specified for an adslot that does not support it
---
# Google creative status code 102: Creative filtered because the bidder account is in testing mode · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/102/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 102: Creative filtered because the bidder account is in testing mode
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the bidder account is in testing mode
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 102 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 102 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 102.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 100 : Unknown error (deprecated)
Google creative status code 101 : Unknown error (deprecated)
Google creative status code 103 : Native ad specified for an adslot that does not support it
Google creative status code 104 : native_ad.image.url field value is an invalid URL
---
# Google creative status code 103: Native ad specified for an adslot that does not support it · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/103/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 103: Native ad specified for an adslot that does not support it
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad specified for an adslot that does not support it
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 103 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 103 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 103.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 101 : Unknown error (deprecated)
Google creative status code 102 : Creative filtered because the bidder account is in testing mode
Google creative status code 104 : native_ad.image.url field value is an invalid URL
Google creative status code 105 : native_ad.logo.url field value is an invalid URL
---
# Google creative status code 104: native_ad.image.url field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/104/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 104: native_ad.image.url field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.image.url field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 104 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 104 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 104.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 102 : Creative filtered because the bidder account is in testing mode
Google creative status code 103 : Native ad specified for an adslot that does not support it
Google creative status code 105 : native_ad.logo.url field value is an invalid URL
Google creative status code 106 : native_ad.app_icon.url field value is an invalid URL
---
# Google creative status code 105: native_ad.logo.url field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/105/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 105: native_ad.logo.url field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.logo.url field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 105 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 105 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 105.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 103 : Native ad specified for an adslot that does not support it
Google creative status code 104 : native_ad.image.url field value is an invalid URL
Google creative status code 106 : native_ad.app_icon.url field value is an invalid URL
Google creative status code 107 : Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
---
# Google creative status code 106: native_ad.app_icon.url field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/106/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 106: native_ad.app_icon.url field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.app_icon.url field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 106 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 106 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 106.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 104 : native_ad.image.url field value is an invalid URL
Google creative status code 105 : native_ad.logo.url field value is an invalid URL
Google creative status code 107 : Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
Google creative status code 108 : Unknown error (deprecated)
---
# Google creative status code 107: Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/107/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 107: Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 107 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 107 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 107.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 105 : native_ad.logo.url field value is an invalid URL
Google creative status code 106 : native_ad.app_icon.url field value is an invalid URL
Google creative status code 108 : Unknown error (deprecated)
Google creative status code 109 : Unknown error (deprecated)
---
# Google creative status code 108: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/108/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 108: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 108 is this status.
## What was checked
Creative status 108 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 108 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 106 : native_ad.app_icon.url field value is an invalid URL
Google creative status code 107 : Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
Google creative status code 109 : Unknown error (deprecated)
Google creative status code 110 : Unknown error (deprecated)
---
# Google creative status code 109: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/109/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 109: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 109 is this status.
## What was checked
Creative status 109 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 109 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 107 : Required elements specified in bid_request.adslot.native_ad_template.required_fields are missing or empty
Google creative status code 108 : Unknown error (deprecated)
Google creative status code 110 : Unknown error (deprecated)
Google creative status code 111 : native_ad.click_tracking_url field value is too short to be a valid URL
---
# Google creative status code 110: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/110/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 110: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 110 is this status.
## What was checked
Creative status 110 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 110 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 108 : Unknown error (deprecated)
Google creative status code 109 : Unknown error (deprecated)
Google creative status code 111 : native_ad.click_tracking_url field value is too short to be a valid URL
Google creative status code 112 : native_ad.click_tracking_url field value cannot be parsed as a valid URL
---
# Google creative status code 111: native_ad.click_tracking_url field value is too short to be a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/111/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 111: native_ad.click_tracking_url field value is too short to be a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.click_tracking_url field value is too short to be a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 111 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 111 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 111.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 109 : Unknown error (deprecated)
Google creative status code 110 : Unknown error (deprecated)
Google creative status code 112 : native_ad.click_tracking_url field value cannot be parsed as a valid URL
Google creative status code 113 : native_ad.click_tracking_url field value has a domain that is all digits
---
# Google creative status code 112: native_ad.click_tracking_url field value cannot be parsed as a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/112/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 112: native_ad.click_tracking_url field value cannot be parsed as a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.click_tracking_url field value cannot be parsed as a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 112 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 110 : Unknown error (deprecated)
Google creative status code 111 : native_ad.click_tracking_url field value is too short to be a valid URL
Google creative status code 113 : native_ad.click_tracking_url field value has a domain that is all digits
Google creative status code 114 : Creative filtered because deal_id is invalid
---
# Google creative status code 113: native_ad.click_tracking_url field value has a domain that is all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/113/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 113: native_ad.click_tracking_url field value has a domain that is all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.click_tracking_url field value has a domain that is all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 113 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 113 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 113.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 111 : native_ad.click_tracking_url field value is too short to be a valid URL
Google creative status code 112 : native_ad.click_tracking_url field value cannot be parsed as a valid URL
Google creative status code 114 : Creative filtered because deal_id is invalid
Google creative status code 115 : ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
---
# Google creative status code 114: Creative filtered because deal_id is invalid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/114/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 114: Creative filtered because deal_id is invalid
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because deal_id is invalid
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 114 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 112 : native_ad.click_tracking_url field value cannot be parsed as a valid URL
Google creative status code 113 : native_ad.click_tracking_url field value has a domain that is all digits
Google creative status code 115 : ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
Google creative status code 116 : Creative filtered because deal's buyer_network_id is invalid
---
# Google creative status code 115: ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/115/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 115: ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 115 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 113 : native_ad.click_tracking_url field value has a domain that is all digits
Google creative status code 114 : Creative filtered because deal_id is invalid
Google creative status code 116 : Creative filtered because deal's buyer_network_id is invalid
Google creative status code 117 : Creative filtered because deal's advertiser is invalid
---
# Google creative status code 116: Creative filtered because deal's buyer_network_id is invalid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/116/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 116: Creative filtered because deal's buyer_network_id is invalid
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because deal's buyer_network_id is invalid
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 116 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 114 : Creative filtered because deal_id is invalid
Google creative status code 115 : ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
Google creative status code 117 : Creative filtered because deal's advertiser is invalid
Google creative status code 118 : Creative filtered because a deal id is required
---
# Google creative status code 117: Creative filtered because deal's advertiser is invalid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/117/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 117: Creative filtered because deal's advertiser is invalid
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because deal's advertiser is invalid
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 117 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 115 : ADX_AD_SOURCE_TYPE_MANAGED_TAG does not support deals
Google creative status code 116 : Creative filtered because deal's buyer_network_id is invalid
Google creative status code 118 : Creative filtered because a deal id is required
Google creative status code 119 : Creative filtered by publisher's exclusion rules
---
# Google creative status code 118: Creative filtered because a deal id is required · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/118/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 118: Creative filtered because a deal id is required
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because a deal id is required
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 118 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 116 : Creative filtered because deal's buyer_network_id is invalid
Google creative status code 117 : Creative filtered because deal's advertiser is invalid
Google creative status code 119 : Creative filtered by publisher's exclusion rules
Google creative status code 120 : Creative filtered because the language could not be detected and the publisher has language restrictions
---
# Google creative status code 119: Creative filtered by publisher's exclusion rules · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/119/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 119: Creative filtered by publisher's exclusion rules
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered by publisher's exclusion rules
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 119 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 117 : Creative filtered because deal's advertiser is invalid
Google creative status code 118 : Creative filtered because a deal id is required
Google creative status code 120 : Creative filtered because the language could not be detected and the publisher has language restrictions
Google creative status code 121 : Creative filtered because the billing entity it is attributed to is out of budget
---
# Google creative status code 120: Creative filtered because the language could not be detected and the publisher has language restrictions · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/120/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 120: Creative filtered because the language could not be detected and the publisher has language restrictions
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the language could not be detected and the publisher has language restrictions
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 120 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 118 : Creative filtered because a deal id is required
Google creative status code 119 : Creative filtered by publisher's exclusion rules
Google creative status code 121 : Creative filtered because the billing entity it is attributed to is out of budget
Google creative status code 122 : Creative filtered due to frequency caps
---
# Google creative status code 121: Creative filtered because the billing entity it is attributed to is out of budget · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/121/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 121: Creative filtered because the billing entity it is attributed to is out of budget
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the billing entity it is attributed to is out of budget
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 121 is this status.
## What was checked
Google checked declared creative attributes against the exclusions on the request.
## What to change
Drop the excluded attribute, or skip requests that block it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 119 : Creative filtered by publisher's exclusion rules
Google creative status code 120 : Creative filtered because the language could not be detected and the publisher has language restrictions
Google creative status code 122 : Creative filtered due to frequency caps
Google creative status code 123 : Creative filtered because it is not allowed to serve on the Android platform
---
# Google creative status code 122: Creative filtered due to frequency caps · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/122/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 122: Creative filtered due to frequency caps
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to frequency caps
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 122 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 122 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 122.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 120 : Creative filtered because the language could not be detected and the publisher has language restrictions
Google creative status code 121 : Creative filtered because the billing entity it is attributed to is out of budget
Google creative status code 123 : Creative filtered because it is not allowed to serve on the Android platform
Google creative status code 124 : Creative filtered because it is not allowed to serve on the iOS platform
---
# Google creative status code 123: Creative filtered because it is not allowed to serve on the Android platform · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/123/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 123: Creative filtered because it is not allowed to serve on the Android platform
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is not allowed to serve on the Android platform
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 123 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 123 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 123.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 121 : Creative filtered because the billing entity it is attributed to is out of budget
Google creative status code 122 : Creative filtered due to frequency caps
Google creative status code 124 : Creative filtered because it is not allowed to serve on the iOS platform
Google creative status code 125 : impression_tracking_url field value is too short to be a valid URL
---
# Google creative status code 124: Creative filtered because it is not allowed to serve on the iOS platform · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/124/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 124: Creative filtered because it is not allowed to serve on the iOS platform
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is not allowed to serve on the iOS platform
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 124 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 124 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 124.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 122 : Creative filtered due to frequency caps
Google creative status code 123 : Creative filtered because it is not allowed to serve on the Android platform
Google creative status code 125 : impression_tracking_url field value is too short to be a valid URL
Google creative status code 126 : impression_tracking_url field value cannot be parsed as a valid URL
---
# Google creative status code 125: impression_tracking_url field value is too short to be a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/125/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 125: impression_tracking_url field value is too short to be a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
impression_tracking_url field value is too short to be a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 125 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 125 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 125.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 123 : Creative filtered because it is not allowed to serve on the Android platform
Google creative status code 124 : Creative filtered because it is not allowed to serve on the iOS platform
Google creative status code 126 : impression_tracking_url field value cannot be parsed as a valid URL
Google creative status code 127 : impression_tracking_url field value has a domain that is all digits
---
# Google creative status code 126: impression_tracking_url field value cannot be parsed as a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/126/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 126: impression_tracking_url field value cannot be parsed as a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
impression_tracking_url field value cannot be parsed as a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 126 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 124 : Creative filtered because it is not allowed to serve on the iOS platform
Google creative status code 125 : impression_tracking_url field value is too short to be a valid URL
Google creative status code 127 : impression_tracking_url field value has a domain that is all digits
Google creative status code 128 : impression_tracking_url not supported for non mobile-app html ads
---
# Google creative status code 127: impression_tracking_url field value has a domain that is all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/127/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 127: impression_tracking_url field value has a domain that is all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
impression_tracking_url field value has a domain that is all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 127 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 127 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 127.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 125 : impression_tracking_url field value is too short to be a valid URL
Google creative status code 126 : impression_tracking_url field value cannot be parsed as a valid URL
Google creative status code 128 : impression_tracking_url not supported for non mobile-app html ads
Google creative status code 129 : Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
---
# Google creative status code 128: impression_tracking_url not supported for non mobile-app html ads · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/128/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 128: impression_tracking_url not supported for non mobile-app html ads
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
impression_tracking_url not supported for non mobile-app html ads
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 128 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 128 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 128.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 126 : impression_tracking_url field value cannot be parsed as a valid URL
Google creative status code 127 : impression_tracking_url field value has a domain that is all digits
Google creative status code 129 : Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
Google creative status code 130 : Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
---
# Google creative status code 129: Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/129/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 129: Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 129 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 129 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 129.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 127 : impression_tracking_url field value has a domain that is all digits
Google creative status code 128 : impression_tracking_url not supported for non mobile-app html ads
Google creative status code 130 : Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
Google creative status code 131 : Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your...
---
# Google creative status code 130: Creative filtered because it is ineligible or unapproved for serving to a Russian user or property · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/130/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 130: Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 130 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 130 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 130.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 128 : impression_tracking_url not supported for non mobile-app html ads
Google creative status code 129 : Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
Google creative status code 131 : Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your...
Google creative status code 132 : native_ad.image.width or native_ad.image.height has an invalid value
---
# Google creative status code 131: Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/131/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 131: Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your technical account manager
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 131 is this status.
## What was checked
Google has not finished reviewing or categorizing this creative URL.
## What to change
Wait for review. Bidding the URL again before Google categorizes it returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 129 : Creative filtered because it is ineligible or unapproved for serving to a Chinese user or property
Google creative status code 130 : Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
Google creative status code 132 : native_ad.image.width or native_ad.image.height has an invalid value
Google creative status code 133 : native_ad.logo.width or native_ad.logo.height has an invalid value
---
# Google creative status code 132: native_ad.image.width or native_ad.image.height has an invalid value · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/132/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 132: native_ad.image.width or native_ad.image.height has an invalid value
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.image.width or native_ad.image.height has an invalid value
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 132 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 130 : Creative filtered because it is ineligible or unapproved for serving to a Russian user or property
Google creative status code 131 : Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your...
Google creative status code 133 : native_ad.logo.width or native_ad.logo.height has an invalid value
Google creative status code 134 : native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
---
# Google creative status code 133: native_ad.logo.width or native_ad.logo.height has an invalid value · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/133/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 133: native_ad.logo.width or native_ad.logo.height has an invalid value
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.logo.width or native_ad.logo.height has an invalid value
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 133 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 131 : Creative has not yet been reviewed or is not currently active, and the account has too many active snippets. Please contact your...
Google creative status code 132 : native_ad.image.width or native_ad.image.height has an invalid value
Google creative status code 134 : native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
Google creative status code 135 : native_ad.store field value is an invalid URL
---
# Google creative status code 134: native_ad.app_icon.width or native_ad.app_icon.height has an invalid value · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/134/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 134: native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 134 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 132 : native_ad.image.width or native_ad.image.height has an invalid value
Google creative status code 133 : native_ad.logo.width or native_ad.logo.height has an invalid value
Google creative status code 135 : native_ad.store field value is an invalid URL
Google creative status code 136 : native_ad.star_rating field value is invalid
---
# Google creative status code 135: native_ad.store field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/135/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 135: native_ad.store field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.store field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 135 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 135 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 135.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 133 : native_ad.logo.width or native_ad.logo.height has an invalid value
Google creative status code 134 : native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
Google creative status code 136 : native_ad.star_rating field value is invalid
Google creative status code 137 : Creative filtered because ad.width/height is not allowed for the chosen deal
---
# Google creative status code 136: native_ad.star_rating field value is invalid · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/136/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 136: native_ad.star_rating field value is invalid
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.star_rating field value is invalid
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 136 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 136 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 136.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 134 : native_ad.app_icon.width or native_ad.app_icon.height has an invalid value
Google creative status code 135 : native_ad.store field value is an invalid URL
Google creative status code 137 : Creative filtered because ad.width/height is not allowed for the chosen deal
Google creative status code 138 : Creative filtered because max_cpm_micros is too large
---
# Google creative status code 137: Creative filtered because ad.width/height is not allowed for the chosen deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/137/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 137: Creative filtered because ad.width/height is not allowed for the chosen deal
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because ad.width/height is not allowed for the chosen deal
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 137 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 135 : native_ad.store field value is an invalid URL
Google creative status code 136 : native_ad.star_rating field value is invalid
Google creative status code 138 : Creative filtered because max_cpm_micros is too large
Google creative status code 139 : Creative filtered because bidder used an unsupported OpenRTB feature
---
# Google creative status code 138: Creative filtered because max_cpm_micros is too large · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/138/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 138: Creative filtered because max_cpm_micros is too large
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because max_cpm_micros is too large
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 138 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 138 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 138.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 136 : native_ad.star_rating field value is invalid
Google creative status code 137 : Creative filtered because ad.width/height is not allowed for the chosen deal
Google creative status code 139 : Creative filtered because bidder used an unsupported OpenRTB feature
Google creative status code 140 : Unknown error (deprecated)
---
# Google creative status code 139: Creative filtered because bidder used an unsupported OpenRTB feature · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/139/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 139: Creative filtered because bidder used an unsupported OpenRTB feature
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because bidder used an unsupported OpenRTB feature
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 139 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 139 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 139.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 137 : Creative filtered because ad.width/height is not allowed for the chosen deal
Google creative status code 138 : Creative filtered because max_cpm_micros is too large
Google creative status code 140 : Unknown error (deprecated)
Google creative status code 141 : Exactly one adslot was expected for the ad; either zero or multiple were returned
---
# Google creative status code 140: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/140/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 140: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 140 is this status.
## What was checked
Creative status 140 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 140 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 138 : Creative filtered because max_cpm_micros is too large
Google creative status code 139 : Creative filtered because bidder used an unsupported OpenRTB feature
Google creative status code 141 : Exactly one adslot was expected for the ad; either zero or multiple were returned
Google creative status code 142 : Creative is not SSL compliant but secure ads are required on this request
---
# Google creative status code 141: Exactly one adslot was expected for the ad; either zero or multiple were returned · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/141/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 141: Exactly one adslot was expected for the ad; either zero or multiple were returned
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Exactly one adslot was expected for the ad; either zero or multiple were returned
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 141 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 141 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 141.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 139 : Creative filtered because bidder used an unsupported OpenRTB feature
Google creative status code 140 : Unknown error (deprecated)
Google creative status code 142 : Creative is not SSL compliant but secure ads are required on this request
Google creative status code 143 : Creative uses flash but flash is not available or not allowed on this request
---
# Google creative status code 142: Creative is not SSL compliant but secure ads are required on this request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/142/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 142: Creative is not SSL compliant but secure ads are required on this request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative is not SSL compliant but secure ads are required on this request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 142 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 142 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 142.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 140 : Unknown error (deprecated)
Google creative status code 141 : Exactly one adslot was expected for the ad; either zero or multiple were returned
Google creative status code 143 : Creative uses flash but flash is not available or not allowed on this request
Google creative status code 144 : Creative filtered by publisher's creative text filter rules
---
# Google creative status code 143: Creative uses flash but flash is not available or not allowed on this request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/143/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 143: Creative uses flash but flash is not available or not allowed on this request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative uses flash but flash is not available or not allowed on this request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 143 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 143 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 143.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 141 : Exactly one adslot was expected for the ad; either zero or multiple were returned
Google creative status code 142 : Creative is not SSL compliant but secure ads are required on this request
Google creative status code 144 : Creative filtered by publisher's creative text filter rules
Google creative status code 145 : The adslot ID specified in the response did not match any in the request
---
# Google creative status code 144: Creative filtered by publisher's creative text filter rules · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/144/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 144: Creative filtered by publisher's creative text filter rules
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered by publisher's creative text filter rules
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 144 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 142 : Creative is not SSL compliant but secure ads are required on this request
Google creative status code 143 : Creative uses flash but flash is not available or not allowed on this request
Google creative status code 145 : The adslot ID specified in the response did not match any in the request
Google creative status code 146 : The creative was not eligible to serve to the current user
---
# Google creative status code 145: The adslot ID specified in the response did not match any in the request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/145/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 145: The adslot ID specified in the response did not match any in the request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The adslot ID specified in the response did not match any in the request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 145 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 145 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 145.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 143 : Creative uses flash but flash is not available or not allowed on this request
Google creative status code 144 : Creative filtered by publisher's creative text filter rules
Google creative status code 146 : The creative was not eligible to serve to the current user
Google creative status code 147 : Unknown error (deprecated)
---
# Google creative status code 146: The creative was not eligible to serve to the current user · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/146/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 146: The creative was not eligible to serve to the current user
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The creative was not eligible to serve to the current user
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 146 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 146 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 146.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 144 : Creative filtered by publisher's creative text filter rules
Google creative status code 145 : The adslot ID specified in the response did not match any in the request
Google creative status code 147 : Unknown error (deprecated)
Google creative status code 148 : Unknown error (deprecated)
---
# Google creative status code 147: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/147/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 147: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 147 is this status.
## What was checked
Creative status 147 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 147 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 145 : The adslot ID specified in the response did not match any in the request
Google creative status code 146 : The creative was not eligible to serve to the current user
Google creative status code 148 : Unknown error (deprecated)
Google creative status code 149 : The click tracking URL is too short to be a valid URL
---
# Google creative status code 148: Unknown error (deprecated) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/148/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 148: Unknown error (deprecated)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Unknown error (deprecated)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 148 is this status.
## What was checked
Creative status 148 is retired. Google still returns the integer so older logs can be read.
## What to change
Google marks creative status 148 deprecated. A live disapproval uses a different status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 146 : The creative was not eligible to serve to the current user
Google creative status code 147 : Unknown error (deprecated)
Google creative status code 149 : The click tracking URL is too short to be a valid URL
Google creative status code 150 : The click tracking URL cannot be parsed as valid URL
---
# Google creative status code 149: The click tracking URL is too short to be a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/149/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 149: The click tracking URL is too short to be a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The click tracking URL is too short to be a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 149 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 149 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 149.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 147 : Unknown error (deprecated)
Google creative status code 148 : Unknown error (deprecated)
Google creative status code 150 : The click tracking URL cannot be parsed as valid URL
Google creative status code 151 : The click tracking URL has a domain that is all digits
---
# Google creative status code 150: The click tracking URL cannot be parsed as valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/150/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 150: The click tracking URL cannot be parsed as valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The click tracking URL cannot be parsed as valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 150 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 148 : Unknown error (deprecated)
Google creative status code 149 : The click tracking URL is too short to be a valid URL
Google creative status code 151 : The click tracking URL has a domain that is all digits
Google creative status code 152 : Invalid ad.adslot.billing_id in the bid response
---
# Google creative status code 151: The click tracking URL has a domain that is all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/151/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 151: The click tracking URL has a domain that is all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The click tracking URL has a domain that is all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 151 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 151 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 151.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 149 : The click tracking URL is too short to be a valid URL
Google creative status code 150 : The click tracking URL cannot be parsed as valid URL
Google creative status code 152 : Invalid ad.adslot.billing_id in the bid response
Google creative status code 153 : ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
---
# Google creative status code 152: Invalid ad.adslot.billing_id in the bid response · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/152/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 152: Invalid ad.adslot.billing_id in the bid response
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Invalid ad.adslot.billing_id in the bid response
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 152 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 152 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 152.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 150 : The click tracking URL cannot be parsed as valid URL
Google creative status code 151 : The click tracking URL has a domain that is all digits
Google creative status code 153 : ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
Google creative status code 154 : Creative filtered because buyer_creative_id is not UTF8 compliant
---
# Google creative status code 153: ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/153/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 153: ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 153 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 153 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 153.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 151 : The click tracking URL has a domain that is all digits
Google creative status code 152 : Invalid ad.adslot.billing_id in the bid response
Google creative status code 154 : Creative filtered because buyer_creative_id is not UTF8 compliant
Google creative status code 155 : ad_choices_destination_url field value is too short to be a valid URL
---
# Google creative status code 154: Creative filtered because buyer_creative_id is not UTF8 compliant · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/154/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 154: Creative filtered because buyer_creative_id is not UTF8 compliant
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because buyer_creative_id is not UTF8 compliant
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 154 is this status.
## What was checked
Google looked for buyer_creative_id on the creative.
## What to change
Send buyer_creative_id . Google drops the creative when the field is missing.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 152 : Invalid ad.adslot.billing_id in the bid response
Google creative status code 153 : ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
Google creative status code 155 : ad_choices_destination_url field value is too short to be a valid URL
Google creative status code 156 : ad_choices_destination_url field value cannot be parsed as a valid URL
---
# Google creative status code 155: ad_choices_destination_url field value is too short to be a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/155/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 155: ad_choices_destination_url field value is too short to be a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
ad_choices_destination_url field value is too short to be a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 155 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 155 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 155.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 153 : ad.adslot.billing_id in the bid response does not match any adslot.matching_ad_data.billing_id in the bid request
Google creative status code 154 : Creative filtered because buyer_creative_id is not UTF8 compliant
Google creative status code 156 : ad_choices_destination_url field value cannot be parsed as a valid URL
Google creative status code 157 : ad_choices_destination_url field value has a domain that is all digits
---
# Google creative status code 156: ad_choices_destination_url field value cannot be parsed as a valid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/156/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 156: ad_choices_destination_url field value cannot be parsed as a valid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
ad_choices_destination_url field value cannot be parsed as a valid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 156 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 154 : Creative filtered because buyer_creative_id is not UTF8 compliant
Google creative status code 155 : ad_choices_destination_url field value is too short to be a valid URL
Google creative status code 157 : ad_choices_destination_url field value has a domain that is all digits
Google creative status code 158 : Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
---
# Google creative status code 157: ad_choices_destination_url field value has a domain that is all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/157/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 157: ad_choices_destination_url field value has a domain that is all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
ad_choices_destination_url field value has a domain that is all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 157 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 157 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 157.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 155 : ad_choices_destination_url field value is too short to be a valid URL
Google creative status code 156 : ad_choices_destination_url field value cannot be parsed as a valid URL
Google creative status code 158 : Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
Google creative status code 159 : native_ad.video_url field value is an invalid URL
---
# Google creative status code 158: Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/158/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 158: Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 158 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 158 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 158.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 156 : ad_choices_destination_url field value cannot be parsed as a valid URL
Google creative status code 157 : ad_choices_destination_url field value has a domain that is all digits
Google creative status code 159 : native_ad.video_url field value is an invalid URL
Google creative status code 160 : native_ad.click_link_url field value is an invalid URL
---
# Google creative status code 159: native_ad.video_url field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/159/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 159: native_ad.video_url field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.video_url field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 159 is this status.
## What was checked
Google checked html_snippet and video_url against the kind of ad the request asked for.
## What to change
Send the snippet the request type allows, and leave the other one empty. A video request with HTML, or a display request with a video URL, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 157 : ad_choices_destination_url field value has a domain that is all digits
Google creative status code 158 : Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
Google creative status code 160 : native_ad.click_link_url field value is an invalid URL
Google creative status code 161 : Creative filtered because it lacks a VPAID Flash file in the VAST
---
# Google creative status code 160: native_ad.click_link_url field value is an invalid URL · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/160/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 160: native_ad.click_link_url field value is an invalid URL
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
native_ad.click_link_url field value is an invalid URL
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 160 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 160 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 160.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 158 : Ad rejected because it is an HTML ad that plays video, and the impression excludes video ads
Google creative status code 159 : native_ad.video_url field value is an invalid URL
Google creative status code 161 : Creative filtered because it lacks a VPAID Flash file in the VAST
Google creative status code 162 : Creative filtered because it lacks a VPAID JavaScript file in the VAST
---
# Google creative status code 161: Creative filtered because it lacks a VPAID Flash file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/161/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 161: Creative filtered because it lacks a VPAID Flash file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a VPAID Flash file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 161 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 161 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 161.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 159 : native_ad.video_url field value is an invalid URL
Google creative status code 160 : native_ad.click_link_url field value is an invalid URL
Google creative status code 162 : Creative filtered because it lacks a VPAID JavaScript file in the VAST
Google creative status code 163 : Native ad image asset width not in permitted range
---
# Google creative status code 162: Creative filtered because it lacks a VPAID JavaScript file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/162/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 162: Creative filtered because it lacks a VPAID JavaScript file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a VPAID JavaScript file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 162 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 162 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 162.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 160 : native_ad.click_link_url field value is an invalid URL
Google creative status code 161 : Creative filtered because it lacks a VPAID Flash file in the VAST
Google creative status code 163 : Native ad image asset width not in permitted range
Google creative status code 164 : Native ad image asset aspect ratio not in permitted range
---
# Google creative status code 163: Native ad image asset width not in permitted range · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/163/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 163: Native ad image asset width not in permitted range
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad image asset width not in permitted range
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 163 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 163 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 163.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 161 : Creative filtered because it lacks a VPAID Flash file in the VAST
Google creative status code 162 : Creative filtered because it lacks a VPAID JavaScript file in the VAST
Google creative status code 164 : Native ad image asset aspect ratio not in permitted range
Google creative status code 165 : Creative filtered by publisher's restrictions on which brands can be shown together
---
# Google creative status code 164: Native ad image asset aspect ratio not in permitted range · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/164/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 164: Native ad image asset aspect ratio not in permitted range
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad image asset aspect ratio not in permitted range
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 164 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 164 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 164.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 162 : Creative filtered because it lacks a VPAID JavaScript file in the VAST
Google creative status code 163 : Native ad image asset width not in permitted range
Google creative status code 165 : Creative filtered by publisher's restrictions on which brands can be shown together
Google creative status code 166 : Deal bid filtered because the publisher didn't enable deals for the exchange.
---
# Google creative status code 165: Creative filtered by publisher's restrictions on which brands can be shown together · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/165/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 165: Creative filtered by publisher's restrictions on which brands can be shown together
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered by publisher's restrictions on which brands can be shown together
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 165 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 163 : Native ad image asset width not in permitted range
Google creative status code 164 : Native ad image asset aspect ratio not in permitted range
Google creative status code 166 : Deal bid filtered because the publisher didn't enable deals for the exchange.
Google creative status code 167 : Publisher requires premium (high-quality) snippets only, but this snippet does not match
---
# Google creative status code 166: Deal bid filtered because the publisher didn't enable deals for the exchange. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/166/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 166: Deal bid filtered because the publisher didn't enable deals for the exchange.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Deal bid filtered because the publisher didn't enable deals for the exchange.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 166 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 164 : Native ad image asset aspect ratio not in permitted range
Google creative status code 165 : Creative filtered by publisher's restrictions on which brands can be shown together
Google creative status code 167 : Publisher requires premium (high-quality) snippets only, but this snippet does not match
Google creative status code 168 : Creative filtered because it lacks a MP3 (audio) file in the VAST
---
# Google creative status code 167: Publisher requires premium (high-quality) snippets only, but this snippet does not match · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/167/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 167: Publisher requires premium (high-quality) snippets only, but this snippet does not match
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Publisher requires premium (high-quality) snippets only, but this snippet does not match
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 167 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 165 : Creative filtered by publisher's restrictions on which brands can be shown together
Google creative status code 166 : Deal bid filtered because the publisher didn't enable deals for the exchange.
Google creative status code 168 : Creative filtered because it lacks a MP3 (audio) file in the VAST
Google creative status code 169 : Creative filtered because it lacks a AUDIO (audio) file in the VAST
---
# Google creative status code 168: Creative filtered because it lacks a MP3 (audio) file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/168/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 168: Creative filtered because it lacks a MP3 (audio) file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a MP3 (audio) file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 168 is this status.
## What was checked
Google looked in the VAST for a MP3 media file and did not find one.
## What to change
Add a MP3 MediaFile to the VAST, or stop bidding this creative on requests that require MP3.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 166 : Deal bid filtered because the publisher didn't enable deals for the exchange.
Google creative status code 167 : Publisher requires premium (high-quality) snippets only, but this snippet does not match
Google creative status code 169 : Creative filtered because it lacks a AUDIO (audio) file in the VAST
Google creative status code 170 : Creative filtered because it lacks a MOV file in the VAST
---
# Google creative status code 169: Creative filtered because it lacks a AUDIO (audio) file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/169/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 169: Creative filtered because it lacks a AUDIO (audio) file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a AUDIO (audio) file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 169 is this status.
## What was checked
Google looked in the VAST for an AUDIO media file and did not find one.
## What to change
Add an AUDIO MediaFile to the VAST, or stop bidding this creative on requests that require AUDIO.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 167 : Publisher requires premium (high-quality) snippets only, but this snippet does not match
Google creative status code 168 : Creative filtered because it lacks a MP3 (audio) file in the VAST
Google creative status code 170 : Creative filtered because it lacks a MOV file in the VAST
Google creative status code 171 : Creative filtered because it lacks a 3GPP file in the VAST
---
# Google creative status code 170: Creative filtered because it lacks a MOV file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/170/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 170: Creative filtered because it lacks a MOV file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a MOV file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 170 is this status.
## What was checked
Google looked in the VAST for a MOV media file and did not find one.
## What to change
Add a MOV MediaFile to the VAST, or stop bidding this creative on requests that require MOV.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 168 : Creative filtered because it lacks a MP3 (audio) file in the VAST
Google creative status code 169 : Creative filtered because it lacks a AUDIO (audio) file in the VAST
Google creative status code 171 : Creative filtered because it lacks a 3GPP file in the VAST
Google creative status code 172 : Creative filtered because it lacks a DASH file in the VAST
---
# Google creative status code 171: Creative filtered because it lacks a 3GPP file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/171/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 171: Creative filtered because it lacks a 3GPP file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a 3GPP file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 171 is this status.
## What was checked
Google looked in the VAST for a 3GPP media file and did not find one.
## What to change
Add a 3GPP MediaFile to the VAST, or stop bidding this creative on requests that require 3GPP.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 169 : Creative filtered because it lacks a AUDIO (audio) file in the VAST
Google creative status code 170 : Creative filtered because it lacks a MOV file in the VAST
Google creative status code 172 : Creative filtered because it lacks a DASH file in the VAST
Google creative status code 173 : Creative filtered because it lacks an HLS file in the VAST
---
# Google creative status code 172: Creative filtered because it lacks a DASH file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/172/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 172: Creative filtered because it lacks a DASH file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks a DASH file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 172 is this status.
## What was checked
Google looked in the VAST for a DASH media file and did not find one.
## What to change
Add a DASH MediaFile to the VAST, or stop bidding this creative on requests that require DASH.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 170 : Creative filtered because it lacks a MOV file in the VAST
Google creative status code 171 : Creative filtered because it lacks a 3GPP file in the VAST
Google creative status code 173 : Creative filtered because it lacks an HLS file in the VAST
Google creative status code 174 : Creative filtered because it lacks an MP4A file in the VAST
---
# Google creative status code 173: Creative filtered because it lacks an HLS file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/173/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 173: Creative filtered because it lacks an HLS file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks an HLS file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 173 is this status.
## What was checked
Google looked in the VAST for a HLS media file and did not find one.
## What to change
Add a HLS MediaFile to the VAST, or stop bidding this creative on requests that require HLS.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 171 : Creative filtered because it lacks a 3GPP file in the VAST
Google creative status code 172 : Creative filtered because it lacks a DASH file in the VAST
Google creative status code 174 : Creative filtered because it lacks an MP4A file in the VAST
Google creative status code 175 : Creative filtered because it has an empty VAST XML document.
---
# Google creative status code 174: Creative filtered because it lacks an MP4A file in the VAST · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/174/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 174: Creative filtered because it lacks an MP4A file in the VAST
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it lacks an MP4A file in the VAST
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 174 is this status.
## What was checked
Google looked in the VAST for a MP4A media file and did not find one.
## What to change
Add a MP4A MediaFile to the VAST, or stop bidding this creative on requests that require MP4A.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 172 : Creative filtered because it lacks a DASH file in the VAST
Google creative status code 173 : Creative filtered because it lacks an HLS file in the VAST
Google creative status code 175 : Creative filtered because it has an empty VAST XML document.
Google creative status code 176 : Creative filtered because the VAST document can't be parsed.
---
# Google creative status code 175: Creative filtered because it has an empty VAST XML document. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/175/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 175: Creative filtered because it has an empty VAST XML document.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it has an empty VAST XML document.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 175 is this status.
## What was checked
Google parsed the VAST document and found it empty.
## What to change
Send a VAST document that contains the ad. An empty XML document returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 173 : Creative filtered because it lacks an HLS file in the VAST
Google creative status code 174 : Creative filtered because it lacks an MP4A file in the VAST
Google creative status code 176 : Creative filtered because the VAST document can't be parsed.
Google creative status code 177 : Creative filtered because request requires assets to have a bitrate within a specified range
---
# Google creative status code 176: Creative filtered because the VAST document can't be parsed. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/176/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 176: Creative filtered because the VAST document can't be parsed.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the VAST document can't be parsed.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 176 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 174 : Creative filtered because it lacks an MP4A file in the VAST
Google creative status code 175 : Creative filtered because it has an empty VAST XML document.
Google creative status code 177 : Creative filtered because request requires assets to have a bitrate within a specified range
Google creative status code 178 : Creative filtered because request requires assets to have a resolution within a specified range
---
# Google creative status code 177: Creative filtered because request requires assets to have a bitrate within a specified range · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/177/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 177: Creative filtered because request requires assets to have a bitrate within a specified range
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because request requires assets to have a bitrate within a specified range
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 177 is this status.
## What was checked
Google compared the media bitrate with the range on the request.
## What to change
Send a rendition inside the requested bitrate range.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 175 : Creative filtered because it has an empty VAST XML document.
Google creative status code 176 : Creative filtered because the VAST document can't be parsed.
Google creative status code 178 : Creative filtered because request requires assets to have a resolution within a specified range
Google creative status code 179 : Creative filtered because the required field amp_ad_url was missing or empty.
---
# Google creative status code 178: Creative filtered because request requires assets to have a resolution within a specified range · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/178/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 178: Creative filtered because request requires assets to have a resolution within a specified range
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because request requires assets to have a resolution within a specified range
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 178 is this status.
## What was checked
Google compared the media resolution with the range on the request.
## What to change
Send a rendition inside the requested resolution range.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 176 : Creative filtered because the VAST document can't be parsed.
Google creative status code 177 : Creative filtered because request requires assets to have a bitrate within a specified range
Google creative status code 179 : Creative filtered because the required field amp_ad_url was missing or empty.
Google creative status code 180 : Video ad VAST version is not one of the supported versions in the video ad request
---
# Google creative status code 179: Creative filtered because the required field amp_ad_url was missing or empty. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/179/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 179: Creative filtered because the required field amp_ad_url was missing or empty.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the required field amp_ad_url was missing or empty.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 179 is this status.
## What was checked
Google checked the amp_ad_url field on the creative.
## What to change
Creative filtered because the required field amp_ad_url was missing or empty. That is the whole constraint for status 179.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 177 : Creative filtered because request requires assets to have a bitrate within a specified range
Google creative status code 178 : Creative filtered because request requires assets to have a resolution within a specified range
Google creative status code 180 : Video ad VAST version is not one of the supported versions in the video ad request
Google creative status code 181 : Creative filtered because the VAST XML document is larger than the set maximum size.
---
# Google creative status code 180: Video ad VAST version is not one of the supported versions in the video ad request · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/180/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 180: Video ad VAST version is not one of the supported versions in the video ad request
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Video ad VAST version is not one of the supported versions in the video ad request
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 180 is this status.
## What was checked
Google compared the VAST version with the versions the video request allows.
## What to change
Serve a VAST version the request listed. A higher or lower version than that list returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 178 : Creative filtered because request requires assets to have a resolution within a specified range
Google creative status code 179 : Creative filtered because the required field amp_ad_url was missing or empty.
Google creative status code 181 : Creative filtered because the VAST XML document is larger than the set maximum size.
Google creative status code 182 : Creative filtered beacuse the publisher blocklisted the deal ID it targeted
---
# Google creative status code 181: Creative filtered because the VAST XML document is larger than the set maximum size. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/181/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 181: Creative filtered because the VAST XML document is larger than the set maximum size.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the VAST XML document is larger than the set maximum size.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 181 is this status.
## What was checked
Google measured the VAST XML against its maximum document size.
## What to change
Shrink the VAST document under Google's maximum. Wrappers that pull in a large chain are a common way to cross it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 179 : Creative filtered because the required field amp_ad_url was missing or empty.
Google creative status code 180 : Video ad VAST version is not one of the supported versions in the video ad request
Google creative status code 182 : Creative filtered beacuse the publisher blocklisted the deal ID it targeted
Google creative status code 183 : Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
---
# Google creative status code 182: Creative filtered beacuse the publisher blocklisted the deal ID it targeted · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/182/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 182: Creative filtered beacuse the publisher blocklisted the deal ID it targeted
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered beacuse the publisher blocklisted the deal ID it targeted
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 182 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 180 : Video ad VAST version is not one of the supported versions in the video ad request
Google creative status code 181 : Creative filtered because the VAST XML document is larger than the set maximum size.
Google creative status code 183 : Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
Google creative status code 184 : Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
---
# Google creative status code 183: Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/183/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 183: Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 183 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 181 : Creative filtered because the VAST XML document is larger than the set maximum size.
Google creative status code 182 : Creative filtered beacuse the publisher blocklisted the deal ID it targeted
Google creative status code 184 : Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
Google creative status code 185 : Creative filtered because the field amp_ad_url could not be parsed
---
# Google creative status code 184: Creative filtered because the field amp_ad_url is too short, must be at least 11 characters · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/184/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 184: Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 184 is this status.
## What was checked
Google checked the amp_ad_url field on the creative.
## What to change
Creative filtered because the field amp_ad_url is too short, must be at least 11 characters. That is the whole constraint for status 184.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 182 : Creative filtered beacuse the publisher blocklisted the deal ID it targeted
Google creative status code 183 : Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
Google creative status code 185 : Creative filtered because the field amp_ad_url could not be parsed
Google creative status code 186 : Creative filtered because the field amp_ad_url has a domain consisting of all digits
---
# Google creative status code 185: Creative filtered because the field amp_ad_url could not be parsed · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/185/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 185: Creative filtered because the field amp_ad_url could not be parsed
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field amp_ad_url could not be parsed
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 185 is this status.
## What was checked
Google checked the amp_ad_url field on the creative.
## What to change
Creative filtered because the field amp_ad_url could not be parsed. That is the whole constraint for status 185.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 183 : Creative filtered beacuse the publisher enabled the deal ID it targeted for a different deal type
Google creative status code 184 : Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
Google creative status code 186 : Creative filtered because the field amp_ad_url has a domain consisting of all digits
Google creative status code 187 : Creative filtered because of creative policy violations
---
# Google creative status code 186: Creative filtered because the field amp_ad_url has a domain consisting of all digits · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/186/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 186: Creative filtered because the field amp_ad_url has a domain consisting of all digits
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because the field amp_ad_url has a domain consisting of all digits
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 186 is this status.
## What was checked
Google checked the amp_ad_url field on the creative.
## What to change
Creative filtered because the field amp_ad_url has a domain consisting of all digits. That is the whole constraint for status 186.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 184 : Creative filtered because the field amp_ad_url is too short, must be at least 11 characters
Google creative status code 185 : Creative filtered because the field amp_ad_url could not be parsed
Google creative status code 187 : Creative filtered because of creative policy violations
Google creative status code 188 : Creative filtered due to publisher's app exclusion settings
---
# Google creative status code 187: Creative filtered because of creative policy violations · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/187/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 187: Creative filtered because of creative policy violations
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because of creative policy violations
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 187 is this status.
## What was checked
Google's creative policy, or the inventory context, rejected the ad.
## What to change
Replace the creative. Policy statuses stay on the asset until the violating content is gone.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 185 : Creative filtered because the field amp_ad_url could not be parsed
Google creative status code 186 : Creative filtered because the field amp_ad_url has a domain consisting of all digits
Google creative status code 188 : Creative filtered due to publisher's app exclusion settings
Google creative status code 189 : Filtered due to unknown SDK identifier
---
# Google creative status code 188: Creative filtered due to publisher's app exclusion settings · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/188/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 188: Creative filtered due to publisher's app exclusion settings
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered due to publisher's app exclusion settings
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 188 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 186 : Creative filtered because the field amp_ad_url has a domain consisting of all digits
Google creative status code 187 : Creative filtered because of creative policy violations
Google creative status code 189 : Filtered due to unknown SDK identifier
Google creative status code 190 : Filtered due to disallowed SDK identifier
---
# Google creative status code 189: Filtered due to unknown SDK identifier · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/189/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 189: Filtered due to unknown SDK identifier
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Filtered due to unknown SDK identifier
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 189 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 187 : Creative filtered because of creative policy violations
Google creative status code 188 : Creative filtered due to publisher's app exclusion settings
Google creative status code 190 : Filtered due to disallowed SDK identifier
Google creative status code 191 : Creative filtered because it contains an invalid OMSDK script URL.
---
# Google creative status code 190: Filtered due to disallowed SDK identifier · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/190/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 190: Filtered due to disallowed SDK identifier
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Filtered due to disallowed SDK identifier
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 190 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 188 : Creative filtered due to publisher's app exclusion settings
Google creative status code 189 : Filtered due to unknown SDK identifier
Google creative status code 191 : Creative filtered because it contains an invalid OMSDK script URL.
Google creative status code 192 : Rejected due to Coppa/KFA being filtered for demand syndication.
---
# Google creative status code 191: Creative filtered because it contains an invalid OMSDK script URL. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/191/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 191: Creative filtered because it contains an invalid OMSDK script URL.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative filtered because it contains an invalid OMSDK script URL.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 191 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 189 : Filtered due to unknown SDK identifier
Google creative status code 190 : Filtered due to disallowed SDK identifier
Google creative status code 192 : Rejected due to Coppa/KFA being filtered for demand syndication.
Google creative status code 193 : Filtered due to missing SDK identifier
---
# Google creative status code 192: Rejected due to Coppa/KFA being filtered for demand syndication. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/192/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 192: Rejected due to Coppa/KFA being filtered for demand syndication.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Rejected due to Coppa/KFA being filtered for demand syndication.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 192 is this status.
## What was checked
Google checked COPPA and kids-and-families flags on syndicated demand.
## What to change
Do not send this creative on COPPA or kids-and-families traffic. The status is that filter.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 190 : Filtered due to disallowed SDK identifier
Google creative status code 191 : Creative filtered because it contains an invalid OMSDK script URL.
Google creative status code 193 : Filtered due to missing SDK identifier
Google creative status code 194 : Filtered due to missing SDK rendering data
---
# Google creative status code 193: Filtered due to missing SDK identifier · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/193/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 193: Filtered due to missing SDK identifier
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Filtered due to missing SDK identifier
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 193 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 191 : Creative filtered because it contains an invalid OMSDK script URL.
Google creative status code 192 : Rejected due to Coppa/KFA being filtered for demand syndication.
Google creative status code 194 : Filtered due to missing SDK rendering data
Google creative status code 195 : Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
---
# Google creative status code 194: Filtered due to missing SDK rendering data · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/194/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 194: Filtered due to missing SDK rendering data
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Filtered due to missing SDK rendering data
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 194 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 192 : Rejected due to Coppa/KFA being filtered for demand syndication.
Google creative status code 193 : Filtered due to missing SDK identifier
Google creative status code 195 : Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
Google creative status code 196 : The publisher has blocked the buyer for this bid.
---
# Google creative status code 195: Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/195/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 195: Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 195 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 193 : Filtered due to missing SDK identifier
Google creative status code 194 : Filtered due to missing SDK rendering data
Google creative status code 196 : The publisher has blocked the buyer for this bid.
Google creative status code 197 : The response did not comply with demand syndication guidelines
---
# Google creative status code 196: The publisher has blocked the buyer for this bid. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/196/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 196: The publisher has blocked the buyer for this bid.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The publisher has blocked the buyer for this bid.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 196 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 194 : Filtered due to missing SDK rendering data
Google creative status code 195 : Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
Google creative status code 197 : The response did not comply with demand syndication guidelines
Google creative status code 198 : The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed...
---
# Google creative status code 197: The response did not comply with demand syndication guidelines · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/197/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 197: The response did not comply with demand syndication guidelines
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The response did not comply with demand syndication guidelines
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 197 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 197 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 197.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 195 : Creative lost to a Private Auction, Preferred Deal, or Programmatic Guaranteed Deal.
Google creative status code 196 : The publisher has blocked the buyer for this bid.
Google creative status code 198 : The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed...
Google creative status code 199 : Filtered due to experimental changes
---
# Google creative status code 198: The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/198/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 198: The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed Deals) on the request.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 198 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 196 : The publisher has blocked the buyer for this bid.
Google creative status code 197 : The response did not comply with demand syndication guidelines
Google creative status code 199 : Filtered due to experimental changes
Google creative status code 200 : iOS requests disallow video ads missing the playsinline attribute
---
# Google creative status code 199: Filtered due to experimental changes · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/199/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 199: Filtered due to experimental changes
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Filtered due to experimental changes
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 199 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 199 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 199.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 197 : The response did not comply with demand syndication guidelines
Google creative status code 198 : The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed...
Google creative status code 200 : iOS requests disallow video ads missing the playsinline attribute
Google creative status code 201 : The TC string doesn't contain consent for one of the vendors included in this ad creative.
---
# Google creative status code 200: iOS requests disallow video ads missing the playsinline attribute · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/200/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 200: iOS requests disallow video ads missing the playsinline attribute
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
iOS requests disallow video ads missing the playsinline attribute
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 200 is this status.
## What was checked
Google looked for the playsinline attribute on an iOS video ad.
## What to change
Set playsinline on the video element for iOS requests. A video without it is rejected.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 198 : The publisher has blocked all open auction bids (which does not include Private Auction, Preferred Deals, or Programmatic Guaranteed...
Google creative status code 199 : Filtered due to experimental changes
Google creative status code 201 : The TC string doesn't contain consent for one of the vendors included in this ad creative.
Google creative status code 202 : Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
---
# Google creative status code 201: The TC string doesn't contain consent for one of the vendors included in this ad creative. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/201/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 201: The TC string doesn't contain consent for one of the vendors included in this ad creative.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The TC string doesn't contain consent for one of the vendors included in this ad creative.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 201 is this status.
## What was checked
Google checked the GDPR consent macro and the Global Vendor List id inside the creative.
## What to change
Use a GVL id that is a positive integer and present on the current Global Vendor List, and make sure the TC string consents to the vendors in the creative.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 199 : Filtered due to experimental changes
Google creative status code 200 : iOS requests disallow video ads missing the playsinline attribute
Google creative status code 202 : Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
Google creative status code 203 : Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
---
# Google creative status code 202: Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/202/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 202: Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 202 is this status.
## What was checked
Google checked the GDPR consent macro and the Global Vendor List id inside the creative.
## What to change
Use a GVL id that is a positive integer and present on the current Global Vendor List, and make sure the TC string consents to the vendors in the creative.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 200 : iOS requests disallow video ads missing the playsinline attribute
Google creative status code 201 : The TC string doesn't contain consent for one of the vendors included in this ad creative.
Google creative status code 203 : Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
Google creative status code 204 : The creative's instream format is not allowed (i.e. linear vs. non-linear)
---
# Google creative status code 203: Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/203/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 203: Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 203 is this status.
## What was checked
Google checked the GDPR consent macro and the Global Vendor List id inside the creative.
## What to change
Use a GVL id that is a positive integer and present on the current Global Vendor List, and make sure the TC string consents to the vendors in the creative.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 201 : The TC string doesn't contain consent for one of the vendors included in this ad creative.
Google creative status code 202 : Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
Google creative status code 204 : The creative's instream format is not allowed (i.e. linear vs. non-linear)
Google creative status code 205 : Creative was disapproved
---
# Google creative status code 204: The creative's instream format is not allowed (i.e. linear vs. non-linear) · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/204/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 204: The creative's instream format is not allowed (i.e. linear vs. non-linear)
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The creative's instream format is not allowed (i.e. linear vs. non-linear)
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 204 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 204 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 204.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 202 : Ad contains an invalid IAB GVL macro, for instance a consent macro with a GVL ID anything other than a positive integer
Google creative status code 203 : Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
Google creative status code 205 : Creative was disapproved
Google creative status code 206 : Ad filtered because it does not match the format of the chosen deal
---
# Google creative status code 205: Creative was disapproved · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/205/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 205: Creative was disapproved
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Creative was disapproved
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 205 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 205 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 205.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 203 : Ad contains a GDPR consent macro with a GVL ID not present in the latest version of the Global Vendor List
Google creative status code 204 : The creative's instream format is not allowed (i.e. linear vs. non-linear)
Google creative status code 206 : Ad filtered because it does not match the format of the chosen deal
Google creative status code 207 : Ad filtered because publisher does not support the iOS SKAdNetwork API
---
# Google creative status code 206: Ad filtered because it does not match the format of the chosen deal · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/206/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 206: Ad filtered because it does not match the format of the chosen deal
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because it does not match the format of the chosen deal
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 206 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 204 : The creative's instream format is not allowed (i.e. linear vs. non-linear)
Google creative status code 205 : Creative was disapproved
Google creative status code 207 : Ad filtered because publisher does not support the iOS SKAdNetwork API
Google creative status code 208 : Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
---
# Google creative status code 207: Ad filtered because publisher does not support the iOS SKAdNetwork API · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/207/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 207: Ad filtered because publisher does not support the iOS SKAdNetwork API
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because publisher does not support the iOS SKAdNetwork API
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 207 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 205 : Creative was disapproved
Google creative status code 206 : Ad filtered because it does not match the format of the chosen deal
Google creative status code 208 : Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
Google creative status code 209 : Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
---
# Google creative status code 208: Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/208/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 208: Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 208 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 206 : Ad filtered because it does not match the format of the chosen deal
Google creative status code 207 : Ad filtered because publisher does not support the iOS SKAdNetwork API
Google creative status code 209 : Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
Google creative status code 210 : Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's...
---
# Google creative status code 209: Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/209/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 209: Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 209 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 207 : Ad filtered because publisher does not support the iOS SKAdNetwork API
Google creative status code 208 : Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
Google creative status code 210 : Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's...
Google creative status code 211 : Ad filtered because the provided iOS SKAdNetwork is missing required fields
---
# Google creative status code 210: Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/210/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 210: Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's Info.plist
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 210 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 208 : Ad filtered because the provided iOS SKAdNetwork version does not match the publisher's version
Google creative status code 209 : Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
Google creative status code 211 : Ad filtered because the provided iOS SKAdNetwork is missing required fields
Google creative status code 212 : The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
---
# Google creative status code 211: Ad filtered because the provided iOS SKAdNetwork is missing required fields · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/211/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 211: Ad filtered because the provided iOS SKAdNetwork is missing required fields
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided iOS SKAdNetwork is missing required fields
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 211 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 211 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 211.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 209 : Ad filtered because the provided iOS SKAdNetwork publisher app ID does not match the publisher's app ID
Google creative status code 210 : Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's...
Google creative status code 212 : The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
Google creative status code 213 : A provided ad load notification URL is too short to be a valid URL.
---
# Google creative status code 212: The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/212/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 212: The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 212 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 210 : Ad filtered because the provided iOS SKAdNetwork ad network ID does not match one of the publisher's supported network IDs in the app's...
Google creative status code 211 : Ad filtered because the provided iOS SKAdNetwork is missing required fields
Google creative status code 213 : A provided ad load notification URL is too short to be a valid URL.
Google creative status code 214 : A provided ad load notification URL cannot be parsed as a valid URL.
---
# Google creative status code 213: A provided ad load notification URL is too short to be a valid URL. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/213/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 213: A provided ad load notification URL is too short to be a valid URL.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
A provided ad load notification URL is too short to be a valid URL.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 213 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 213 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 213.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 211 : Ad filtered because the provided iOS SKAdNetwork is missing required fields
Google creative status code 212 : The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
Google creative status code 214 : A provided ad load notification URL cannot be parsed as a valid URL.
Google creative status code 215 : A provided ad load notification URL has a domain that is all digits.
---
# Google creative status code 214: A provided ad load notification URL cannot be parsed as a valid URL. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/214/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 214: A provided ad load notification URL cannot be parsed as a valid URL.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
A provided ad load notification URL cannot be parsed as a valid URL.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 214 is this status.
## What was checked
Google tried to parse the VAST XML and failed.
## What to change
Fix the VAST so it parses. A broken document returns this status on every bid that carries it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 212 : The ad is filtered because the bid is for a PG deal with publisher-managed creatives and contains bidder-provided creative information.
Google creative status code 213 : A provided ad load notification URL is too short to be a valid URL.
Google creative status code 215 : A provided ad load notification URL has a domain that is all digits.
Google creative status code 216 : Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
---
# Google creative status code 215: A provided ad load notification URL has a domain that is all digits. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/215/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 215: A provided ad load notification URL has a domain that is all digits.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
A provided ad load notification URL has a domain that is all digits.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 215 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 215 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 215.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 213 : A provided ad load notification URL is too short to be a valid URL.
Google creative status code 214 : A provided ad load notification URL cannot be parsed as a valid URL.
Google creative status code 216 : Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
Google creative status code 217 : Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
---
# Google creative status code 216: Ad load notification URLs are not supported for non mobile-app SDK rendered ads. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/216/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 216: Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 216 is this status.
## What was checked
Google checked the SDK identifier and the rendering data that goes with it.
## What to change
Send an SDK id Google allows for this request, with the rendering data it expects. A missing, unknown, or disallowed id returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 214 : A provided ad load notification URL cannot be parsed as a valid URL.
Google creative status code 215 : A provided ad load notification URL has a domain that is all digits.
Google creative status code 217 : Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
Google creative status code 218 : Ad contains a vendor domain that could not be attributed to any known vendor.
---
# Google creative status code 217: Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/217/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 217: Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 217 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 215 : A provided ad load notification URL has a domain that is all digits.
Google creative status code 216 : Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
Google creative status code 218 : Ad contains a vendor domain that could not be attributed to any known vendor.
Google creative status code 219 : The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad...
---
# Google creative status code 218: Ad contains a vendor domain that could not be attributed to any known vendor. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/218/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 218: Ad contains a vendor domain that could not be attributed to any known vendor.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad contains a vendor domain that could not be attributed to any known vendor.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 218 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 216 : Ad load notification URLs are not supported for non mobile-app SDK rendered ads.
Google creative status code 217 : Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
Google creative status code 219 : The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad...
Google creative status code 220 : Native ad filtered because it contains both video URL and VAST tag.
---
# Google creative status code 219: The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/219/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 219: The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad creative.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 219 is this status.
## What was checked
Google checked the vendors declared on the creative against the request and against Ad Exchange eligibility.
## What to change
Remove the excluded or ineligible vendor from the creative, or skip requests that exclude it.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 217 : Click tracking URLs are supported only for native ads or PG deals with publisher-hosted creatives and rejected otherwise.
Google creative status code 218 : Ad contains a vendor domain that could not be attributed to any known vendor.
Google creative status code 220 : Native ad filtered because it contains both video URL and VAST tag.
Google creative status code 221 : Native ad filtered because the VAST XML document is empty.
---
# Google creative status code 220: Native ad filtered because it contains both video URL and VAST tag. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/220/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 220: Native ad filtered because it contains both video URL and VAST tag.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad filtered because it contains both video URL and VAST tag.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 220 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 220 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 220.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 218 : Ad contains a vendor domain that could not be attributed to any known vendor.
Google creative status code 219 : The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad...
Google creative status code 221 : Native ad filtered because the VAST XML document is empty.
Google creative status code 222 : Native ad filtered because the VAST XML document is too large.
---
# Google creative status code 221: Native ad filtered because the VAST XML document is empty. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/221/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 221: Native ad filtered because the VAST XML document is empty.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad filtered because the VAST XML document is empty.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 221 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 221 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 221.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 219 : The list of ad technology providers used by the publisher to collect consent doesn't contain one of the vendors included in this ad...
Google creative status code 220 : Native ad filtered because it contains both video URL and VAST tag.
Google creative status code 222 : Native ad filtered because the VAST XML document is too large.
Google creative status code 223 : Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
---
# Google creative status code 222: Native ad filtered because the VAST XML document is too large. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/222/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 222: Native ad filtered because the VAST XML document is too large.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Native ad filtered because the VAST XML document is too large.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 222 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 222 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 222.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 220 : Native ad filtered because it contains both video URL and VAST tag.
Google creative status code 221 : Native ad filtered because the VAST XML document is empty.
Google creative status code 223 : Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
Google creative status code 224 : Multiple bids submitted for a single deal ID on a bid response.
---
# Google creative status code 223: Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/223/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 223: Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 223 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 223 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 223.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 221 : Native ad filtered because the VAST XML document is empty.
Google creative status code 222 : Native ad filtered because the VAST XML document is too large.
Google creative status code 224 : Multiple bids submitted for a single deal ID on a bid response.
Google creative status code 225 : Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
---
# Google creative status code 224: Multiple bids submitted for a single deal ID on a bid response. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/224/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 224: Multiple bids submitted for a single deal ID on a bid response.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Multiple bids submitted for a single deal ID on a bid response.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 224 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 222 : Native ad filtered because the VAST XML document is too large.
Google creative status code 223 : Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
Google creative status code 225 : Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
Google creative status code 226 : Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
---
# Google creative status code 225: Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/225/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 225: Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 225 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 225 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 225.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 223 : Bid filtered due to malformed frequency caps or because frequency capping was specified for a request which doesn't support it.
Google creative status code 224 : Multiple bids submitted for a single deal ID on a bid response.
Google creative status code 226 : Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
Google creative status code 227 : Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
---
# Google creative status code 226: Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/226/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 226: Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 226 is this status.
## What was checked
Google checked the currency on the bid response.
## What to change
Bid in a currency the request allows. An invalid currency returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 224 : Multiple bids submitted for a single deal ID on a bid response.
Google creative status code 225 : Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
Google creative status code 227 : Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
Google creative status code 228 : Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
---
# Google creative status code 227: Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/227/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 227: Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 227 is this status.
## What was checked
Google detected a sensitive category on the creative and compared it with the exclusions on the request.
## What to change
The request excludes that sensitive category. Bid a different creative on this impression.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 225 : Ad filtered because the provided iOS SKAdNetwork fidelity type is not supported by the ad query.
Google creative status code 226 : Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
Google creative status code 228 : Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
Google creative status code 229 : Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
---
# Google creative status code 228: Ad rejected because bidder specified an unexpected billing ID when bidding on a deal. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/228/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 228: Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 228 is this status.
## What was checked
Google checked the deal id on the bid against the publisher's deal settings.
## What to change
Bid a deal the publisher enabled for this exchange and this deal type. An open-auction bid on a deal-only request, or a blocklisted deal id, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 226 : Ad filtered because the provided currency on the OpenRTB bid response is different from the bidding currency.
Google creative status code 227 : Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
Google creative status code 229 : Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
Google creative status code 230 : A provided ad load notification URL exceeded the maximum length.
---
# Google creative status code 229: Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/229/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 229: Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 229 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 229 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 229.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 227 : Ad filtered because it has been detected to contain at least one sensitive category that is disallowed on Multiplex ad slot.
Google creative status code 228 : Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
Google creative status code 230 : A provided ad load notification URL exceeded the maximum length.
Google creative status code 231 : Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
---
# Google creative status code 230: A provided ad load notification URL exceeded the maximum length. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/230/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 230: A provided ad load notification URL exceeded the maximum length.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
A provided ad load notification URL exceeded the maximum length.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 230 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 230 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 230.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 228 : Ad rejected because bidder specified an unexpected billing ID when bidding on a deal.
Google creative status code 229 : Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
Google creative status code 231 : Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
Google creative status code 232 : Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in...
---
# Google creative status code 231: Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/231/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 231: Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 231 is this status.
## What was checked
Google compared the creative on the bid with the constraint named in this status.
## What to change
Status 231 names the constraint. It clears when that condition is gone. Bidding the same creative again returns 231.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 229 : Ad rejected because billable event rate adjustment computed from bid and payment doesn't match adjustment sent in bid request.
Google creative status code 230 : A provided ad load notification URL exceeded the maximum length.
Google creative status code 232 : Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in...
Google creative status code 233 : Ad rejected because the publisher blocked non-instream video in protections.
---
# Google creative status code 232: Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in... · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/232/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 232: Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in...
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in landscape.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 232 is this status.
## What was checked
Google compared the declared width and height with the request.
## What to change
Declare the width and height the request asked for. A mismatch, or a missing dimension, returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 230 : A provided ad load notification URL exceeded the maximum length.
Google creative status code 231 : Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
Google creative status code 233 : Ad rejected because the publisher blocked non-instream video in protections.
Google creative status code 234 : Ad rejected because the publisher blocked display ads in protections.
---
# Google creative status code 233: Ad rejected because the publisher blocked non-instream video in protections. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/233/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 233: Ad rejected because the publisher blocked non-instream video in protections.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because the publisher blocked non-instream video in protections.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 233 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 231 : Ad rejected because the vast lacks an MP4A media file and the request requires an ad with an MP4A media file.
Google creative status code 232 : Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in...
Google creative status code 234 : Ad rejected because the publisher blocked display ads in protections.
Google creative status code 235 : Ad filtered because the currency specified in the bid response is invalid.
---
# Google creative status code 234: Ad rejected because the publisher blocked display ads in protections. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/234/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 234: Ad rejected because the publisher blocked display ads in protections.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad rejected because the publisher blocked display ads in protections.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 234 is this status.
## What was checked
The publisher's controls blocked this creative, buyer, or bid type.
## What to change
The block is on the publisher's settings. Another creative or another buyer is the way through it. Resending the same bid returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 232 : Ad rejected because the device screen orientation is landscape (width > height) but no single media asset of the returned video ad is in...
Google creative status code 233 : Ad rejected because the publisher blocked non-instream video in protections.
Google creative status code 235 : Ad filtered because the currency specified in the bid response is invalid.
---
# Google creative status code 235: Ad filtered because the currency specified in the bid response is invalid. · RTBlint
URL: https://rtblint.org/docs/openrtb/loss/exchange/google-creative-status/235/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · What is OpenRTB + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
## Google creative status code 235: Ad filtered because the currency specified in the bid response is invalid.
Google creative status Returned in ${CREATIVE_STATUS_CODE}
## What Google creative status says
Ad filtered because the currency specified in the bid response is invalid.
Google returns this number in ${CREATIVE_STATUS_CODE} on the loss notice. It is not an ${AUCTION_LOSS} value. A search for Google creative status code 235 is this status.
## What was checked
Google checked the currency on the bid response.
## What to change
Bid in a currency the request allows. An invalid currency returns this status.
## Related
All Google creative status codes
The OpenRTB loss reason table
Google Authorized Buyers creative status codes
Google creative status code 233 : Ad rejected because the publisher blocked non-instream video in protections.
Google creative status code 234 : Ad rejected because the publisher blocked display ads in protections.
---
# OpenRTB banner bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/banner-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## OpenRTB banner bid request example
A minimal, valid display bid request: one banner impression with primary and fallback sizes, a site object with publisher, and an explicit floor.
## The payload
{
"id": "req-banner-1",
"at": 1,
"cur": ["USD"],
"tmax": 300,
"site": {
"id": "site-1",
"domain": "news.example.com",
"page": "https://news.example.com/article/123",
"publisher": { "id": "pub-9" }
},
"device": {
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"devicetype": 2,
"ip": "203.0.113.7"
},
"imp": [
{
"id": "1",
"secure": 1,
"bidfloor": 0.85,
"bidfloorcur": "USD",
"banner": {
"w": 300,
"h": 250,
"format": [{ "w": 300, "h": 250 }, { "w": 336, "h": 280 }],
"pos": 1
}
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
id and imp are the only required top-level fields; everything else here is what makes the request biddable in practice.
banner.format lists acceptable sizes beyond the primary w/h, so multi-size demand can compete.
secure: 1 requires HTTPS creative assets, which any site on HTTPS should declare explicitly.
bidfloorcur is spelled out even though USD is the default; implicit defaults are where floor bugs hide.
## More examples
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
Bid request example with GPP privacy signals
All examples
---
# OpenRTB video bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/video-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## OpenRTB video bid request example
A minimal valid video request with an impression id and supported MIME type. Use it to start testing before adding placement and duration constraints.
## The payload
{
"id": "req-0a1b2c",
"imp": [
{
"id": "1",
"video": {
"mimes": ["video/mp4"]
}
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
video.mimes is required; a video object without it is invalid.
This minimal payload does not declare placement or duration bounds. Add plcmt and duration constraints when the inventory requires them.
## More examples
OpenRTB banner bid request example
CTV ad pod bid request example
OpenRTB native bid request example
Bid request example with GPP privacy signals
All examples
---
# CTV ad pod bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/ctv-pod-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## CTV ad pod bid request example
A connected-TV ad pod request using the 2.6 pod bidding fields: pod identity, slot sequencing, and duration bounds.
## The payload
{
"id": "9d2f3a7e-ctv-pod",
"at": 1,
"tmax": 300,
"cur": ["USD"],
"source": {
"schain": {
"complete": 1,
"ver": "1.0",
"nodes": [
{ "asi": "exchange.example.com", "sid": "pub-4491", "hp": 1 }
]
}
},
"regs": { "coppa": 0, "gdpr": 0 },
"app": {
"id": "app-552",
"name": "StreamBox",
"bundle": "com.streambox.tv",
"storeurl": "https://apps.example.com/streambox",
"publisher": { "id": "pub-4491", "name": "StreamBox Media" },
"content": {
"id": "ep-2201",
"title": "Chef's Table",
"series": "Kitchen Stories",
"season": "Season 4",
"episode": 12,
"genre": "documentary",
"livestream": 0,
"len": 2700,
"language": "en",
"network": { "id": "net-7", "name": "StreamBox Originals" },
"channel": { "id": "ch-12", "name": "Food" }
}
},
"device": {
"ua": "Mozilla/5.0 (SMART-TV; Linux; Tizen 7.0)",
"ip": "203.0.113.42",
"devicetype": 3,
"make": "Samsung",
"model": "QN90C",
"os": "Tizen",
"osv": "7.0",
"ifa": "38c1a2f0-52b6-4c9e-9a41-d0f83a6c1e11",
"lmt": 0,
"connectiontype": 2,
"geo": { "country": "USA", "region": "CA", "type": 2 }
},
"user": { "id": "u-92fd6c1b" },
"imp": [
{
"id": "1",
"secure": 1,
"bidfloor": 12.5,
"bidfloorcur": "USD",
"rwdd": 0,
"video": {
"mimes": ["video/mp4"],
"protocols": [3, 7, 8],
"w": 1920,
"h": 1080,
"linearity": 1,
"plcmt": 1,
"pos": 7,
"podid": "pod-1",
"podseq": 0,
"maxseq": 4,
"poddur": 120,
"slotinpod": 1,
"minduration": 15,
"maxduration": 30,
"startdelay": 0,
"playbackmethod": [1],
"playbackend": 1,
"delivery": [2],
"api": [7]
},
"pmp": {
"private_auction": 0,
"deals": [
{ "id": "deal-777", "bidfloor": 18.0, "bidfloorcur": "USD", "at": 1 }
]
}
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
podid ties multiple impressions to one commercial break; slotinpod positions each slot.
minduration and maxduration allow creatives from 15 to 30 seconds; poddur caps the whole break at 120 seconds.
devicetype 3 plus an app object is the classic CTV shape; buyers key CTV classification off both.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
OpenRTB native bid request example
Bid request example with GPP privacy signals
All examples
---
# OpenRTB native bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/native-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## OpenRTB native bid request example
A valid native impression showing the trickiest encoding in OpenRTB: the Native Markup Request as a JSON string encoded exactly once.
## The payload
{
"id": "req-native-1",
"at": 1,
"tmax": 300,
"app": {
"id": "app-77",
"bundle": "com.example.newsreader",
"storeurl": "https://play.google.com/store/apps/details?id=com.example.newsreader",
"publisher": { "id": "pub-12" }
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14)",
"devicetype": 4,
"os": "Android"
},
"imp": [
{
"id": "1",
"bidfloor": 1.5,
"native": {
"request": "{\"ver\":\"1.2\",\"context\":1,\"plcmttype\":1,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":90}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":1200,\"h\":627}},{\"id\":3,\"required\":0,\"data\":{\"type\":2,\"len\":140}}],\"eventtrackers\":[{\"event\":1,\"methods\":[1]}]}",
"ver": "1.2"
}
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
imp.native.request is a string, not an object: the Native Ads 1.2 request is JSON-encoded once and embedded.
The inner request declares title, main image, and data assets with required flags per asset.
eventtrackers replaces the legacy imptrackers for impression tracking in Native 1.2.
Double-encoding this string is the most common native bug; the validator flags it as openrtb.native.request.double_encoded.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
Bid request example with GPP privacy signals
All examples
---
# Bid request example with GPP privacy signals · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/gdpr-consent-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## Bid request example with GPP privacy signals
A mobile banner request carrying a synthetic GPP string and matching section IDs at the OpenRTB 2.6 regs paths.
## The payload
{
"id": "req-banner-8842",
"test": 0,
"at": 2,
"tmax": 200,
"cur": ["USD"],
"bcat": ["IAB25", "IAB26"],
"cattax": 1,
"badv": ["competitor.example"],
"regs": { "coppa": 0, "gpp": "DBABMA~CPXxRfAPXxRfAAfKABENB", "gpp_sid": [2] },
"app": {
"id": "app-201",
"bundle": "com.example.dailynews",
"storeurl": "https://play.example.com/dailynews",
"cat": ["IAB12"],
"publisher": { "id": "pub-88", "name": "Daily News Group" }
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 8)",
"sua": {
"browsers": [{ "brand": "Chromium", "version": ["124"] }],
"platform": { "brand": "Android", "version": ["14"] },
"mobile": 1,
"source": 2
},
"ip": "198.51.100.7",
"devicetype": 4,
"make": "Google",
"model": "Pixel 8",
"os": "Android",
"osv": "14",
"language": "en",
"js": 1,
"connectiontype": 6,
"ifa": "5c9b2a44-9d1e-4f6a-8a3d-72cb0e9a1f02"
},
"user": {
"eids": [
{
"source": "liveramp.com",
"uids": [{ "id": "XY1122334455", "atype": 3 }]
}
]
},
"imp": [
{
"id": "1",
"instl": 0,
"secure": 1,
"bidfloor": 0.5,
"banner": {
"format": [
{ "w": 320, "h": 50 },
{ "w": 300, "h": 250 }
],
"w": 320,
"h": 50,
"pos": 1,
"btype": [4],
"battr": [1, 3],
"api": [3, 5]
}
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
regs.gpp and regs.gpp_sid travel together; either one alone is an uninterpretable signal.
gpp_sid: [2] matches the TCF EU v2 section encoded in this synthetic GPP string.
This is a transport example. It does not establish consent or verify privacy compliance.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
All examples
---
# DOOH bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/dooh-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## DOOH bid request example
A digital out-of-home request: the dooh distribution channel added in 2.6-202211, with quantity-based impression counting.
## The payload
{
"id": "req-dooh-3301",
"at": 1,
"tmax": 400,
"cur": ["USD"],
"dooh": {
"id": "screen-88",
"name": "Airport Arrivals Billboard",
"venuetype": ["transit.airports"],
"venuetypetax": 1,
"publisher": { "id": "pub-oh-4", "name": "CityScreens" },
"domain": "cityscreens.example",
"keywords": "billboard,airport,arrivals"
},
"device": {
"devicetype": 8,
"geo": { "lat": 40.6413, "lon": -73.7781, "type": 1, "country": "USA" }
},
"imp": [
{
"id": "1",
"banner": { "w": 1080, "h": 1920, "pos": 7 },
"qty": { "multiplier": 42.0, "sourcetype": 1, "vendor": "geopath.org" }
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
dooh replaces site/app as the distribution channel; the three are mutually exclusive.
qty models multi-viewer impressions: one play counts as multiple impressions with a declared multiplier.
Buyers reconcile DOOH wins with the AUCTION_MULTIPLIER macro in notice URLs.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
All examples
---
# OpenRTB 3.0 bid request example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/openrtb-3-bid-request/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## OpenRTB 3.0 bid request example
A layered 3.0 request: the openrtb envelope, item in place of imp, and the AdCOM placement under item.spec.
## The payload
{
"openrtb": {
"ver": "3.0",
"domainspec": "adcom",
"domainver": "1.0",
"request": {
"id": "req-3-0-layered-001",
"tmax": 250,
"cur": ["USD"],
"item": [
{
"id": "item-1",
"qty": 1,
"flr": 18.5,
"flrcur": "USD",
"spec": {
"placement": {
"tagid": "video-preroll-3-0",
"video": {
"mime": ["video/mp4"],
"mindur": 15,
"maxdur": 30
}
}
}
}
]
}
}
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
Everything sits under the openrtb envelope with ver, domainspec, and domainver.
The 2.x imp becomes item, carrying commercial terms; what is for sale moves to the AdCOM Placement in item.spec.
Validate with the version selector on 3.0; a 2.x payload sent to a 3.0 validator gets a migration diagnostic.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
All examples
---
# OpenRTB video bid response example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/video-bid-response/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## OpenRTB video bid response example
A realistic CTV video bid response: VAST markup inline in adm, mtype declared, and win/billing/loss notices carrying macros.
## The payload
{
"id": "9d2f3a7e-ctv-pod",
"bidid": "resp-77120",
"cur": "USD",
"seatbid": [
{
"seat": "dsp-acme",
"group": 0,
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 21.4,
"adid": "cr-90341",
"nurl": "https://dsp.example.com/win?p=${AUCTION_PRICE}",
"burl": "https://dsp.example.com/bill?p=${AUCTION_PRICE}",
"lurl": "https://dsp.example.com/loss?r=${AUCTION_LOSS}",
"adm": "acme-dsp",
"adomain": ["acmesnacks.com"],
"crid": "cr-90341",
"cid": "camp-221",
"cat": ["IAB8"],
"cattax": 1,
"language": "en",
"w": 1920,
"h": 1080,
"dur": 30,
"mtype": 2,
"apis": [7],
"protocol": 8
}
]
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
adm carries the VAST document itself; mtype: 2 declares it as video so nothing downstream has to sniff.
nurl, burl, and lurl each carry substitution macros; the exchange expands them at win, billing, and loss time.
impid echoes the request's imp.id exactly; a response is only as valid as the request it answers.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
All examples
---
# Matched bid request and response example · RTBlint
URL: https://rtblint.org/docs/openrtb-examples/request-response-pair/
RTBlint Alpha ⌕ Search ⌘K Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
⌕ Search ⌘K Menu Tester ARTF sim Docs Guides Answers FAQ Blog GitHub
Documentation · Example payloads + Start here
Overview What is OpenRTB OpenRTB FAQ OpenRTB protocol
Bid request anatomy Bid response anatomy Enum reference Privacy signals Supply chain (schain) AdCOM objects Native ads Video object plcmt (video placement) Audio object CTV & ad pods tmax & timeouts Bid floors Substitution macros Guides
All guides Validate a bid request Common mistakes placement vs plcmt No-bid reasons (nbr) Loss reason codes 2.5 vs 2.6 2.6 vs 3.0 Validation in CI Bid request best practices Agentic buying IAB agentic standards ARTF explained AdCP explained AdCP to OpenRTB OpenRTB vs Prebid SSP, DSP, exchange First vs second price SupplyChain 1.1 migration Supply chain trust stack Deals and PMP What is AdCOM adm vs nurl Identity and eids VAST and OpenRTB Programmatic explained tmax and timeouts Answers
All answers Supply path optimization Bid shading Curation MFA sites Build a bidder endpoint DOOH in OpenRTB Audio ads ID bridging Low fill rate Bidstream data and GDPR User-Agent deprecation Find the spec Validate anywhere
Online (browser) CLI Node.js Rust MCP (AI agents) Example payloads Validation
What RTBlint checks Rule catalog Rule reference OpenRTB versions JSON Schemas Run it
Bid request tester ARTF simulator CLI and library GitHub Action for CI Deployment options MCP server
OpenRTB examples
## Matched bid request and response example
A request/response pair that cross-validates clean: seat allowed, deal echoed, currency permitted, and markup matching the offer.
## The payload
{
"id": "auc-5521",
"bidid": "resp-88231",
"cur": "USD",
"seatbid": [
{
"seat": "dsp-acme",
"group": 0,
"bid": [
{
"id": "bid-1",
"impid": "1",
"price": 22.75,
"dealid": "deal-77",
"adm": "acme-dsp",
"adomain": ["acmesnacks.com"],
"crid": "cr-90341",
"w": 1920,
"h": 1080,
"dur": 30,
"mtype": 2
}
]
}
]
}
Open this payload in the tester to validate it live, change fields, and watch which rules fire.
## What to notice
The response's seat appears in the request's wseat allowlist, and cur is among the request's currencies.
dealid echoes a Deal from imp.pmp.deals, so the bid gets deal treatment.
This is the pair-validation mode: rtblint validate --type response --request request.json response.json.
## More examples
OpenRTB banner bid request example
OpenRTB video bid request example
CTV ad pod bid request example
OpenRTB native bid request example
All examples