Programmatic broadsheet · Set in real time
adon3
The Real-Time Bidding Exchange
Integration Docs
Supply side · XML feed · OpenRTB 2.6 / 2.5

Errors & No-Bids

Two things are easy to conflate: a request that failed, and an auction where nobody bid. A 204 is not an error. At any real volume it is the majority of what you will see.

HTTP status codes

StatusMeaningWhat to do
200A bid. Body carries a BidResponseRender it, fire the notices
204No bid, empty bodyNothing, this is normal and expected
400Malformed JSON or failed validationFix the request, see the codes below
401Unknown or revoked endpoint keyCheck the key in the path
403Account suspended, or endpoint not enabledContact the integration office
413Body exceeds the 256 KB limitTrim the request, usually user.data or content
415Wrong Content-TypeSend application/json; charset=utf-8
429Above your provisioned request rateBack off, and ask for a higher limit if sustained
500Exchange errorTreat as a no-bid, do not retry the same auction
503Exchange shedding loadTreat as a no-bid, reduce rate briefly

A healthy integration is mostly 204 with a minority of 200, and essentially nothing else. Anything above roughly 1% in the 4xx range is a bug in the request rather than a property of the traffic.

Error responses

A 400 carries a JSON body identifying what failed.

JSON
{
  "error": {
    "code": "MISSING_REQUIRED",
    "message": "device.ua is required",
    "id": "8f2a1c30-6b4e-4d9a-9f11-2c7e3b5a8d40"
  }
}
CodeMeaning
MALFORMED_JSONThe body is not valid JSON. Check trailing commas and unescaped quotes.
MISSING_REQUIREDA required field is absent. message names it.
MISSING_UAdevice.ua is absent or empty.
MISSING_IPNeither device.ip nor device.ipv6 is present.
MISSING_INVENTORY_IDNeither site.domain nor app.bundle is present.
BOTH_SITE_AND_APPThe request carries both site and app.
NO_IMP_OBJECTThe single imp carries none of banner, video, audio or native.
MULTI_IMPMore than one entry in imp.
UNSUPPORTED_VERSIONx-openrtb-version is neither 2.6 nor 2.5.
UNSUPPORTED_CURRENCYcur contains no currency we settle in.
INVALID_FLOORbidfloor is negative, or bidfloorcur is not a known currency.
SCHAIN_INVALIDA supply chain node does not resolve against sellers.json.
SCHAIN_INCOMPLETEcomplete is 0 where a full chain is required.
RATE_LIMITEDAbove your provisioned request rate.
ACCOUNT_INACTIVEAccount suspended, or not yet enabled for production.

id on the error is the BidRequest.id you sent, when we were able to parse it. Quote it in support requests, since we retain full bodies for seven days and can replay the auction.

No-bid reason codes

On the occasional 200 we send with nbr and no seatbid, the code says why the auction produced nothing. None of these is an error, and none of them needs handling beyond treating the response as a no-bid.

CodeReason
0Unknown
1Technical error
2Invalid request
3Known web crawler
4Suspected non-human traffic
5Cloud, datacentre or proxy IP
6Unsupported device
7Blocked publisher or site
8Unmatched user
9Daily reader cap met
10Daily domain cap met
11Ads.txt authorisation unavailable
12Ads.txt authorisation violation

Codes 3, 4 and 5 are worth watching over time. A rising share of them on one tagid usually means something upstream has changed, and it is easier to find while the volume is small.

Rate limiting

429 carries a Retry-After header in seconds. Honour it. Requests sent inside the window are counted against you and returned 429 again.

HTTP
HTTP/1.1 429 Too Many Requests
Retry-After: 2
Content-Type: application/json

Rate is provisioned per endpoint key. If you are hitting the ceiling on real traffic rather than on a retry loop, ask the integration office for a raise.

Next: Bid Request Samples.

sellers.json · schain enforced · OpenRTB 2.5 / 2.6 / 3.0 · XML
Printed on the Open Exchange
—  Integration Docs  —