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.

Validation runs in your browser. Entered payloads may be stored; choose whether to share them before pasting. See privacy details.

cargo install rtblintnpm install rtblint-corertblint validate request.json

Open source · Apache 2.0 · OpenRTB 2.0–3.0

RTBlint · bid_request.json2.6-202606
{
  "id": "req-banner-example",
  "at": "1",
  "imp": [
    {
      "id": "1",
      "banner": {
        "w": 300,
        "h": 250
      }
    }
  ]
}
Invalid1 error · 0 warnings · 0 info
  • error

    at expects integer but received string.

    openrtb.type.mismatchat

Change the string to an integer: "at": 1.

The corrected request has no findings against 2.6-202606.

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.

Add a note (optional)

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 trafficSeparate consumerLocal validatorFindings 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.

Topics openrtb.bid-request

4 partitions · 12.4M messages · 8.4k/s

OffsetPartitionTimestampKeyValueSize
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
      }
    }
  ]
}

erroropenrtb.type.mismatchatat expects integer but received string.

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.

AddedMoved, corrected, or restructuredDeprecated or removed

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.mismatchat

Rule IDLook up the diagnostic ID and use it to group recurring failures in reports.
JSON pathThe field to change. Here, at contains a string and needs the integer 1.
Validation contextOpenRTB 2.6-202606 · spec profile · same engine as the tester.
"at": "1""at": 1No findings against 2.6-202606Verify 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.

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
cargo install rtblint
rtblint validate request.json --version 2.6-202606 --format json

Prepare for protocol changes before you deploy.

Read the release context and integration implications behind specification and ecosystem changes.

See what you can use today and what is planned.

  1. Shipped

    Validate requests and responses across OpenRTB 2.x.

    Versioned catalogs, field checks, and paired response validation.

    Explore this capability →
  2. Shipped

    Run the same core in your preferred environment.

    CLI, Rust and Node libraries, gRPC, browser tester, and MCP.

    Explore this capability →
  3. Shipped

    Inspect the OpenRTB 3.0 envelope and AdCOM objects.

    Check the transport layer and the domain objects it references.

    Explore this capability →
  4. 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 →
  5. Shipped

    Find recurring issues in captured traffic.

    NDJSON batch reports and rule-frequency summaries run locally.

    Explore this capability →
  6. Shipped

    Apply a partner's documented protocol requirements.

    26 vendor and integration-direction profiles, including documented supplier and bidder contracts.

    Explore this capability →
  7. Shipped

    Fail CI when a fixture produces validation errors.

    The GitHub Action returns machine-readable findings and a failing exit code.

    Explore this capability →
  8. 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.