Skip to main content

Quote rejection

Return one of these error_type values on the quotes WebSocket to reject a quote request:
error_typeWhen to useCounts toward maker standing
liquidityInsufficient inventory or approval to fill the request.Yes
min_sizeQuote below your minimum trade size.No
denylistorigin_address, taker_address, or source is on your block list.No
rejectedRefused for any other reason.Yes
unavailableTransient maker outage.Yes
Use the most specific type that fits. Avoid unavailable for policy rejections. See Toxic flow for denylist patterns and Requirements for thresholds context.

Signature rejection

Return one of these error_type values on the signature WebSocket to reject a signature request:
error_typeWhen to use
expiredThe quote has expired before the signature was requested.
last_lookMaker chooses not to proceed with this quote.
unavailableMaker is unable to respond.

Pricing stream errors

When the pricing WebSocket rejects an individual update, Bebop sends an error message on the same connection:
{
  "chain_id": 1,
  "msg_topic": "pricing",
  "msg_type": "error",
  "msg": {
    "code": 1,
    "text": "Unparsable message",
    "reason": "Price or size from levels is zero or negative"
  }
}
Common reasons: unparsable Protobuf, zero or negative prices/sizes, duplicate prices in the same update, bid ≥ ask, spread wider than 1000 bps. Errors on individual updates do not close the connection. A non-Protobuf message on the Protobuf endpoint does close the connection.

Disable messages

If Bebop temporarily disables your maker, you receive a message on any active connection:
{
  "chain_id": 1,
  "msg_topic": "websocket",
  "msg_type": "disabled",
  "msg": {
    "code": 8,
    "text": "Disabled",
    "reason": "Exceeded quality thresholds",
    "data": { "ban_expiry": 1728038000 }
  }
}
data.ban_expiry is a Unix timestamp. Stop sending messages until it passes. See Requirements › Performance.