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

XML Feed Status & Errors

Two things are easy to conflate on this wire: a no-fill and a failure. A 204 is not an error. It is the auction telling you nobody bid, and at any real volume you will see a great many of them.

HTTP status codes

StatusMeaningWhat to do
200A fill. Body carries one or more adsServe it, fire imp_url
204No fill, empty bodyNothing, this is normal and expected
400A parameter is missing or malformedFix the call, see the codes below
401Unknown or revoked feed keyCheck the key in the path
403Supply type mismatch, or account suspendedAsk for the right key, or check your account
410The ad you are notifying on has expiredStop firing notices past exp
429Above the provisioned request rateBack off, and ask for a higher limit if it is sustained
500Exchange errorTreat as a no-fill, do not retry the same call
503Exchange shedding loadTreat as a no-fill, reduce rate briefly

A healthy feed is mostly 200 and 204, with a 4xx rate under 1%. Anything above that is a bug in the integration rather than a property of the traffic.

Error bodies

A 4xx carries a body naming what failed. It follows the format you asked for.

JSON
{
  "error": {
    "code": "MISSING_PARAM",
    "message": "ua is required",
    "rid": "8f2a1c30-6b4e-4d9a-9f11-2c7e3b5a8d40"
  }
}
XML
<?xml version="1.0" encoding="UTF-8"?>
<error>
  <code>MISSING_PARAM</code>
  <message>ua is required</message>
  <rid>8f2a1c30-6b4e-4d9a-9f11-2c7e3b5a8d40</rid>
</error>

Error codes

CodeStatusMeaning
MISSING_PARAM400A required parameter is absent. message names it.
INVALID_IP400ip is not a routable IPv4 or IPv6 address.
INVALID_UA400ua is empty, or was not URL-encoded.
INVALID_SUBID400subid exceeds 64 characters or uses disallowed characters.
INVALID_FORMAT400format is neither json nor xml.
INVALID_SIZE400img_size or icon_size is not WxH.
UNKNOWN_KEY401The feed key does not exist.
KEY_REVOKED401The feed key was rotated or withdrawn.
TYPE_MISMATCH403Parameters do not match the key's supply type.
ACCOUNT_INACTIVE403Account suspended, or not yet enabled for production.
AD_EXPIRED410The notice fired after exp.
RATE_LIMITED429Above the provisioned rate for this key.

rid is echoed on every error. Quote it in support requests, since we retain full request and response bodies for seven days and can replay any call from that window.

Rate limiting

429 carries a Retry-After header in seconds. Honour it. Requests sent inside the window are not queued; they 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 feed key rather than per account, so a spike on one placement does not starve the others. If you are hitting the ceiling on real traffic rather than on a retry loop, ask the integration office for a raise.

Traffic quality holds

Separate from status codes, a feed can be throttled or paused on quality grounds. You will see it as a rising 204 rate rather than as an error, and your integration engineer will be in touch before it happens. The triggers, in the order we hit them:

  • Impression notices far below the number of ads requested, which usually means ads are being requested and not shown
  • Billable clicks well below recorded clicks, sustained over a few days
  • Traffic from datacentre ranges arriving with residential user agents
  • A single uid or ip clicking at a rate no person achieves

None of these is fatal on its own, and all of them are easier to fix while the volume is small.

Next: SSP Report.

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