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.