Skip to main content

Quote types

Bebop sends a single request type: taker_quote. The maker fills in the amount and signs in one response. Each request identifies the flow source via source (when the request comes from an authenticated partner) and always includes taker_address and receiver. Authenticated partners may additionally pass through origin_address and related fields. See Toxic flow for how to use these fields. RFQA requests are identified by source: rfqa, with taker_address and receiver both set to the BebopRouter. They can also carry a signed hooks array in your response; see Maker hooks.

Quote expiry

Each quote is valid for a specific duration. The value depends on request source (public or authorised) and chain. Expiry can also vary per authorised source (e.g. CowSwap solvers get 30 seconds).
ChainSourceExpiry (seconds)
DefaultPublic10
DefaultAuthorised60
DefaultShort expiry3
EthereumPublic30
EthereumAuthorised75
EthereumShort expiry5
Short expiry (“fast mode” in some UIs) is optional. Short-expiry credentials receive quote requests with 3-5 second TTLs, typically from latency-sensitive authorised sources; pricing on short-expiry streams must be highly competitive.

Request shape

Bebop routes on the levels you stream, but requests can include any token combinations. A request arrives with null maker_amount, maker_address, and reference_price: fill these in and sign before responding.
  • order_type: 121 (one to one), 12M (one to many), M21 (many to one). A 121 can still have multiple entries in quotes when the router uses middle-token routing; see Routing › Middle-token routing. For 12M and M21, entries in the quotes array describe each leg.
  • fee_usd: USD value of the fee to deduct from your quote, rounded up to a $0.001 minimum. See Fees.
  • fee_native: the same fee in the chain’s native token. Deprecated - removed 31 Aug 2026; use fee_usd.

One to one

{
  "chain_id": 137,
  "msg_topic": "taker_quote",
  "msg_type": "request",
  "msg": {
    "quote_id": "121-32277716788970320581293338615492295410",
    "event_id": "32277716788970320581293338615492295400",
    "order_signing_type": "MultiOrder",
    "order_type": "121",
    "onchain_partner_id": 0,
    "expiry": 1714741331,
    "taker_address": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    // Origin of the quote if different to taker
    "origin_address": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
    "maker_address": null,
    "maker_nonce": "2754390008155048000",
    "quotes": [
        {
            "taker_token": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
            "maker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
            "taker_amount": "2108069820989740012",
            "maker_amount": null
        }
    ],
    "receiver": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    "commands": "0x0000",
    "packed_commands": "0",
    "fee_native": 0.004284179051471471,
    "fee_usd": 0.002,
    "taker_tokens": ["0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"],
    "maker_tokens": ["0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"],
    "taker_tokens_indices": [0],
    "maker_tokens_indices": [0],
    "is_aggregate_order": true
  }
}

Many to one

Each quotes entry specifies the exact amount of a taker token to convert to the destination token (maker_token).
{
  "chain_id": 137,
  "msg_topic": "taker_quote",
  "msg_type": "request",
  "msg": {
    "quote_id": "M21-87321267253817213266641969626775917190",
    "event_id": "87321267253817213266641969626775917100",
    "order_signing_type": "MultiOrder",
    "order_type": "M21",
    "onchain_partner_id": 0,
    "expiry": 1714741333,
    "taker_address": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    // Origin of the quote if different to taker
    "origin_address": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
    "maker_address": null,
    "maker_nonce": "2754390008155048000",
    "quotes": [
        {
            "taker_token": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
            "maker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
            "taker_amount": "50000000000000000",
            "maker_amount": null
        },
        {
            "taker_token": "0xD6DF932A45C0f255f85145f286eA0b292B21C90B",
            "maker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
            "taker_amount": "10000000000000000",
            "maker_amount": null
        }
    ],
    "receiver": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    "commands": "0x000000",
    "packed_commands": "0",
    "fee_native": 0.00673237878670395,
    "fee_usd": 0.003,
    "taker_tokens": ["0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", "0xD6DF932A45C0f255f85145f286eA0b292B21C90B"],
    "maker_tokens": ["0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"],
    "taker_tokens_indices": [0, 1],
    "maker_tokens_indices": [0, 0],
    "is_aggregate_order": true
  }
}

One to many

Each quotes entry specifies the amount of taker_token to convert to the desired maker_token.
{
  "chain_id": 137,
  "msg_topic": "taker_quote",
  "msg_type": "request",
  "msg": {
    "quote_id": "12MPercentages-318365011499883371488311884461841516686",
    "event_id": "318365011499883371488311884461841516600",
    "order_signing_type": "MultiOrder",
    "order_type": "12M",
    "onchain_partner_id": 0,
    "expiry": 1714741333,
    "taker_address": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    // Origin of the quote if different to taker
    "origin_address": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
    "maker_address": null,
    "maker_nonce": "2754390008155048000",
    "quotes": [
        {
            "taker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
            "maker_token": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
            "taker_amount": "500000",
            "maker_amount": null
        },
        {
            "taker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
            "maker_token": "0xD6DF932A45C0f255f85145f286eA0b292B21C90B",
            "taker_amount": "500000",
            "maker_amount": null
        }
    ],
    "receiver": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    "commands": "0x000000",
    "packed_commands": "0",
    "fee_native": 0.007287673390469325,
    "fee_usd": 0.004,
    "taker_tokens": ["0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"],
    "maker_tokens": ["0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", "0xD6DF932A45C0f255f85145f286eA0b292B21C90B"],
    "taker_tokens_indices": [0, 0],
    "maker_tokens_indices": [0, 1],
    "is_aggregate_order": true
  }
}

Responding

Fill in every null field and sign the payload before responding:
  • maker_amount / taker_amount: your output amount. A request specifies exactly one of these; fill in the other.
  • maker_address: your address with approvals for maker_amount.
  • reference_price: the pre-fee price (not maker_amount / taker_amount).
Sign using SingleOrder or MultiOrder per the quote’s order_signing_type. See Signing for EIP-712 schemas and an example.
reference_price is pre-fee. Set it to the price you would have quoted with no fee applied, not maker_amount / taker_amount. See Fees › How to apply fees to a quote for the worked example.

Minimum required fields

The response msg body only needs to contain:
  • quote_id
  • maker_address
  • maker_nonce
  • quotes (with maker_amount / taker_amount and reference_price filled in)
  • signature
Echoing the rest of the request is accepted but not required.

Example response

{
  "chain_id": 137,
  "msg_topic": "taker_quote",
  "msg_type": "response",
  "msg": {
    "quote_id": "121-243740023226959892823951410689882036089",
    "event_id": "243740023226959892823951410689882036000",
    "order_signing_type": "SingleOrder",
    "order_type": "121",
    "onchain_partner_id": 0,
    "expiry": 1714741857,
    "taker_address": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    // Origin of the quote if different to taker
    "origin_address": "0x95222290DD7278Aa3Ddd389Cc1E1d165CC4BAfe5",
    "maker_address": "0xB9383B9c78d0D6319B1eF2cf41A3A65c5c484DA6",
    "maker_nonce": "2754390008155048000",
    "quotes": [
      {
        "taker_token": "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
        "maker_token": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
        "taker_amount": "1000000000000000000",
        "maker_amount": "509157",
        "reference_price": 0.509157499653
      }
    ],
    "receiver": "0xF36bC73f9783539E1DAC8Cf6d2bfd74e0663699C",
    "commands": "0x",
    "packed_commands": "0",
    "fee_native": 0,
    "fee_usd": 0.0,
    "is_aggregate_order": false,
    "signature": {
      "signature": "0xc7aedf8a098ed8637a6837ae25db3a4ec5e41f73dbdc890b11f159c3a81f52974818e94a6631a32e5ab499aae51628c6f83a3bc6a27774ef79b792a2bc584d331b",
      "sign_scheme": "EIP712"
    }
  }
}

Rejecting a request

To reject a quote:
{
    "chain_id": 137,
    "msg_topic": "taker_quote",
    "msg_type": "error",
    "msg": {
        "quote_id": "121-203002129962136014394512846922049241068",
        "error_type": "unavailable",
        "error_msg": "the maker is unavailable"
    }
}
error_type must be one of the defined values; see Error codes for the full list and their effect on maker standing. error_msg is freeform: include as much detail as you want.