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