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.

What it does not do yet

The current core validates OpenRTB 2.6 bid requests. Bid response validation and OpenRTB 3.0 are tracked on the roadmap and not wired yet. 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.