Reject codes

Every reason a ping can end without a bid, every warning a bid can carry, every reason a bid did not become a call and every payout term — by number, with what to do about each.

After this page you can look up any number the RTB surface gave you, tell at a glance whether it is yours to fix or somebody else's, and write code that branches on the outcome rather than on a sentence.

When a ping gets no bid, the response carries a reject object: a numeric code, a short machine-readable reason and a description in words.

A no-bid
{
  "ok": false,
  "bidId": null,
  "payout": 0,
  "payoutCents": 0,
  "reject": {
    "code": 1006,
    "reason": "outside_hours",
    "description": "Outside hours of operation"
  },
  "auctionId": "AU-100483"
}

A no-bid is a 200. Three refusals keep their own status so an HTTP client notices them — 429 for 1024, and 409 for 1025 and for a caller who already holds a live bid on the campaign — and the authentication refusals at the foot of this page are 401 and 403.

The campaign, the account and the lane

CodeReasonWhat it meansWhat to do
1001campaign_disabledThat campaign is not live.Nothing sent to it can be bought. Ask the buyer when it reopens.
1002publisher_not_liveThat publisher is not live.The account itself is stopped. The buyer can say why and switch it back on.
1015lane_inactiveYou do not have an active lane on this campaign.The lane has been removed or switched off. Ask for it to be re-opened before sending more traffic.
1003no_capacityNo target had capacity for that call.Nobody had room at that moment. Capacity changes minute to minute — keep pinging.
1004caller_blockedThat caller is suppressed.That number cannot be sold. Suppress it your side too.
1005tag_filterA bid rule rejected that call.The tags on the ping did not pass the campaign's filters. Check the values you send against what the campaign asks for.
1006outside_hoursOutside hours of operation.The ping arrived outside the hours the campaign, or your lane on it, is open. Schedule your media, or ask for the hours.
1008state_not_targetedThat state is not being bought.Filter that state out of your own traffic, or ask for it to be added to the lane.
1009duplicate_callerThat caller is inside the duplicate window.They already reached the campaign recently and would not be paid again. De-duplicate before pinging.
1010below_floorThe best bid was below the floor.The best price offered for that caller was under the campaign's minimum. Nothing to fix; it changes call by call.
1011no_bidsNo target returned a bid.Nobody wanted that caller. Keep pinging.
1012margin_floorThe best bid does not clear the margin floor.No price offered was high enough to pay you for the call.
1013concurrencyYour concurrency limit is full.Your lane is already carrying its maximum simultaneous calls. Wait for one to end, or ask for a higher limit.
1014publisher_cappedYour cap for this campaign is filled.A cap on your lane has been reached. It reopens when the window rolls over.
1016workspace_inactiveThat campaign's account is not active.The buyer's own subscription has lapsed, so nothing on their campaigns can be bought. Nothing to fix your side — ask them when it is back.
1017workspace_unfundedThat campaign's account cannot take calls right now.The buyer's balance will not cover a call. It clears when they fund it; keep pinging, or ask them.
1001 and 1002 are the numeric forms of two refusals that are answered at the door as 403 campaign_not_live and 403 publisher_not_live, before an auction exists. They are what the ping ledger and the publisher portal record for those requests.

Too many requests

CodeReasonWhat it meansWhat to do
1024rate_limitedToo many requests.Answered 429 with a Retry-After header. Wait that long — pinging through a limit only uses up the next window.
1025bid_in_flightAn identical request is being scored.Answered 409. Wait for the first answer rather than sending the same request twice. A lock left behind by a crashed request clears itself after ten seconds.
1026too_many_live_bidsToo many live bids for that caller.Post or release one of the bids you already hold for that caller. The limit is per key.
The key's limits and the headers that report them are in Keys and security.

The caller

CodeReasonWhat it meansWhat to do
1100caller_id_requiredThis campaign requires a caller ID.Send callerId on every ping. whoami reports whether the campaign requires it.
1101caller_id_invalidThat caller ID is not a usable number.Ten digits, eleven digits starting with 1, or E.164 are all accepted. Anything else is refused.

At post time

CodeReasonWhat it meansWhat to do
1000no_capacity_at_postThe winning target filled before you posted.The winner filled in the seconds between the ping and the post, and no runner-up could take the caller. Ping again for a fresh bid.
1007caller_id_mismatchThe caller ID does not match the bid.Post the same caller the bid was quoted for. Leaving callerId out counts as a mismatch when the campaign requires one.
1018no_destinationThat lane has no number or SIP address to send the caller to.The bid would have been yours, but there is nowhere to transfer the caller. Ask for a number to be attached to your lane — the same condition warns as 250 when a claim does succeed.
1040terms_changedThose tags would have changed the price.Send the tags on the ping, where the price is decided, not for the first time on the post.
1040 is defined in the protocol and is not returned by any endpoint today: a post's tags are accepted and the call keeps the tags from the ping, because those are what the price was quoted on.

The request itself

CodeReasonWhat it meansWhat to do
3024missing_required_tagsRequired tags were not supplied.The names that were missing come back under details.missing. whoami lists what the campaign requires.
3025malformed_requestThe request could not be parsed.Answered 400. The body is not valid JSON, or not the content type it claims to be.
4005wrong_protocolThat key is not enabled for this protocol.Answered 403. The key belongs to another surface. Ask for its protocol to be changed.

Authentication

These are refused before an auction exists, so they carry no reject object — the body is { "ok": false, "error": "…", "message": "…" }, with code on the four signature failures. Each one is still a row in the ping ledger.

CodeerrorStatusWhat to do
missing_key401Send the key as Authorization: Bearer b3k_live_….
invalid_key401The key is not recognised, or was revoked and its grace period is over. Ask for a new one.
4000signature_missing401One of the three signature headers, or the v1 field, is absent.
4001signature_invalid401Sign the exact bytes you send, with the current secret. A library that re-serialises after signing fails here.
4002signature_stale401The timestamp is more than 300 seconds from the platform's clock. Check the sending server's time.
4003nonce_replay401That nonce has been used. Mint a new one for every request, retries included.
ip_not_allowed403The request came from an address that is not on the key's allowlist.
compat_disabled403The single-step ping URL for that lane is switched off.
idempotency_key_required400Every post needs an Idempotency-Key header.
Only the four signature failures carry a numeric code. The rest are identified by error alone, so match on that string. Full detail is in Keys and security.

Warnings

A warning never changes the outcome. It exists so an integrator can see a problem before it becomes a support ticket. Warnings arrive as a warnings array of { code, description } and are present only when there is something to say.

CodeWhat it meansWhat to do
200A bid cannot be guaranteed without a caller ID.Send callerId. Without it the platform cannot hold the bid against a person, and the post can be refused.
205SIP delivery is preferred over the number.Send sipOk: true and transfer to the sipAddress you are given. A SIP leg always reaches the platform; a number only does when it is one of the platform's own.
220Test mode — real pricing, a destination that cannot be dialled.The key is a test key. The auction ran and a slot is genuinely held, so release the bid rather than leaving it to expire.
222Sandbox mode — synthetic pricing, a destination that cannot be dialled.The key is a sandbox key. Nothing here reflects real demand.
230A cached bid — your previous bid for this request has not expired.You asked again for a caller you already hold a bid on and were given the same bid, not a second reservation. Post the one you have.
240One or more targets exceeded the ping timeout and were excluded.Nothing to do on your side. The price you were quoted is from the buyers who answered in time.
250The bid was won, but this lane has no number or SIP address to send the caller to.There is nowhere to transfer the caller. Ask for a number to be attached to the lane before sending traffic.

Why a bid did not become a call

A bid that was made and then lost carries a loss code. It is on the bid in the ledger and is sent to external bidders on a loss notice. 0 is a win, which keeps "did this bid convert" a single comparison.

CodeWhat it meansWhat to do
0Won. The bid became the call.
100The bid was below the campaign's floor.Bid higher, or accept that this campaign is not for you.
102Outbid. Another target offered more.Nothing is wrong. Price is the lever.
104Suppressed before the hold was taken.Something about the caller disqualified them after bidding.
1000The winner's capacity was gone by the time the caller was posted.A race between the ping and the post. The runner-up takes the call where one has room.
1001The hold expired before the caller was posted.Post sooner. The expiry is on every bid.
1002The caller hung up before delivery.Release a bid you are not going to use, so the slot reopens at once.
1003Nobody answered before the dial timed out.The buyer's line did not pick up inside the campaign's dial timeout.
1004The buyer declined the whisper.The buyer heard the call's summary and refused it.
1005The call failed on the SIP leg.A carrier or endpoint failure. The call waterfall has the SIP result in words.
1006A duplicate caller inside the dedupe window.The same caller had already been sold recently.
1007The caller ID did not match the bid.The caller who arrived is not the one the bid was quoted for.
1008The buyer was at their concurrency limit.Their line was full when the call was offered.
1009The call ended below the billable duration.It connected and did not last long enough to count.
Four of these are defined for completeness and are not set by the platform today: 100, 104, 1006 and 1009. A ledger row written by a newer build than this page still renders, so treat an unfamiliar number as informational rather than as an error.

What a payout depends on

A bid carries a terms array. Those terms are frozen onto the bid when it is quoted and read back by settlement, so the conditions that decide the money are the ones you were quoted — not whatever the campaign says by the time the call ends.

The terms on a bid
"terms": [
  { "code": 101, "description": "Call must connect" },
  { "code": 100, "description": "Minimum connected duration 90 seconds", "seconds": 90 },
  { "code": 110, "description": "Duplicate callers are not paid within 86400 seconds", "seconds": 86400 }
]
CodeWhat it meansCarries
101The call must connect. It is on every bid.
100A minimum connected duration.seconds
102The call must be marked converted — a postback or a sale disposition is required.
110Duplicate callers are not paid inside a window.seconds

Reading a refusal from the other side

The descriptions above are written for the publisher who receives them, which is why a handful are in the second person. A workspace reading its own ping ledger sees the same codes reworded — 1014 reads "The publisher's cap for this campaign was filled" — because "your" would point at the wrong party. The code is the same number either way.

Each refusal also carries an owner: whose move it is. It is the fastest way to triage a bad afternoon.

OwnerCodes it coversMeans
publisher1005, 1008, 1009, 1024, 1025, 1026, 1100, 1101, 1007, 3024, 3025, the signature codesSomething in the request, or on the sender's side, to change.
network1001, 1002, 1006, 1013, 1014, 1015, 1016, 1017, 1018, 4005A rule the buyer set, or a state of their account. Ask them.
demand1003, 1010, 1011, 1012, 1000Nobody wanted that caller, or nobody had room. It changes call by call.
platformAnything elseOurs.

A worked example

Northwind Media send 400 pings on a Friday and win 90. Their ping summary ranks the refusals:

  1. 1008 state_not_targeted, 210 pings, owner publisher. They are sending states the lane does not buy. That is theirs to filter, and it is most of the gap.
  2. 1006 outside_hours, 61 pings, owner network. Their evening traffic arrives after the lane closes. They ask the buyer, who widens the hours.
  3. 1011 no_bids, 33 pings, owner demand. Nobody wanted those callers. Nothing to fix.
  4. 1024 rate_limited, 6 pings, owner publisher. A burst went over the minute limit. They honour Retry-After instead of retrying immediately.

Two of the four are theirs, one is the buyer's and one is nobody's. The conversation that follows is about the two that can be changed.

Next steps