A CTV mid-roll imp arrives with "skipafter": 5 and no "skip" field. The JSON parses. The exchange accepts it. The buyer reads five seconds and assumes a skippable pod.
The placement is not skippable. OpenRTB only defines skipmin and skipafter when video.skip is 1. Without that bit, the offsets are orphaned metadata. IAB's Redefining Media Types (RMT) standard plans to encode skip-enabled versus completion-required as one of eight impression-level attributes on the bid request. That attribute will read the same three fields. When skip is missing or zero and the offsets are present anyway, RMT gets a completion contract that the spec never defined.
What skip, skipmin, and skipafter actually mean
On the OpenRTB Video object, skip is an integer flag: 0 or absent means the placement does not offer a skip button; 1 means it does.
skipmin is the minimum ad duration in seconds before skip becomes available. skipafter is how many seconds into playback the skip control may appear. Both are AdCOM parameters for skippable video only. The spec ties them to skip: 1. They do not describe a generic "watch five seconds then decide" rule on non-skippable inventory.
RMT's operational layer maps its skip-versus-completion attribute onto this trio. The RMT overview on RTBlint lists video.skip, skipmin, and skipafter as fields that already exist and already carry the skip contract today. That is accurate when all three agree. It breaks when adapters copy VAST skip offsets into OpenRTB without setting skip: 1, or when a seller template always emits skipafter because the ad server defaults did.
A muted autoplay unit with "playbackmethod": [2] and "skipafter": 5 but no skip tells two different stories. playbackmethod says sound off at start. The orphan skipafter implies a skippable format. RMT would have to pick one signal or invent a third classification.
How the failure shows up on the wire
The common broken shape looks like this:
"video": {
"mimes": ["video/mp4"],
"minduration": 15,
"maxduration": 30,
"linearity": 1,
"protocols": [2, 3, 5, 6],
"playbackmethod": [2],
"skipmin": 5
}
No skip key. skipmin is present. Many exchanges do not reject this at ingress because unknown-field tolerance and partial Video objects are normal in the wild.
RTBlint flags it as a semantic error, not a syntax error:
$ rtblint validate --type request @bid.json
error openrtb.field.requires_skippable_video
imp[0].video.skipmin may only be present when skip is set to 1.
The rule id is openrtb.field.requires_skippable_video. The field reference states the contract plainly: both skipmin and skipafter parameterize skippable placements. Without skip: 1, a buyer cannot tell whether the slot is skippable, and some downstream parsers drop the entire video object rather than guess.
That is the ceiling RMT inherits. A classification bit derived from contradictory inputs produces a confident label on unknown ground.
How you catch it before RMT lands
Paste the request into the RTBlint bid request tester. It runs the same validator the CLI uses and prints rule ids with JSON paths.
For CI, pin a version and fail on semantic errors:
$ rtblint validate --type request --version 2.6-202606 @bid.json
Exit code 1 when any error-severity finding is present. Warnings do not fail the run.
Fix paths are binary. If the placement is skippable, set "skip": 1 alongside skipmin and skipafter. If it is not skippable, remove both dependent fields. Do not leave offsets "for documentation." RMT and buyers will treat them as operational.
When the bid wins, the creative still arrives as VAST. Paste the tag URL into the VAST tag tester to confirm player skip behavior matches what you declared on the imp. If the response is a wrapper chain, the VAST inspector shows each hop until InLine so you can see whether skip offsets on the request ever made it into the delivered tag.
Where to go next
The OpenRTB video field reference walks skip, duration bounds, plcmt, and how they interact on CTV pods. Skippability changes creative eligibility and pricing; it belongs in the same audit as format classification.
For patterns that survive exchange review but fail semantic checks, see common OpenRTB mistakes. Orphan skip fields sit next to deprecated placement copied onto plcmt and duration pairs that contradict each other.
When a buyer no-bids without explanation, cross-check whether your Video object contradicted itself. The no-bid reasons guide maps silent drops to field-level mismatches buyers filter on before the auction.
Video buys still terminate in VAST. The VAST and OpenRTB guide covers where player-side skip behavior must match what you declared on the imp.
The short version
skipmin and skipafter only mean something when video.skip is 1. Traffic that ships the offsets without declaring skippability validates as JSON and poisons any layer, RMT included, that tries to read a skip contract from those fields. Validate the trio together now; the taxonomy is coming whether the inputs are clean or not.
RTBlint is independent of IAB and IAB Tech Lab. Rule ids cite the OpenRTB and AdCOM specs because that is where the requirements live.
Top comments (0)