GeminiGemini
Demo environmentGet API key
  • Overview
  • Crypto Trading
  • Prediction Markets
  • Perpetuals
  • Stocks
  • API Reference
  • SDKs & Tools
Changelog
Gemini logoGemini logo

© 2026 Gemini Space Station, Inc.

Overview
Core Concepts
    Events, contracts, and outcomesCombo contracts
Market Data
    OverviewFetching Markets
    Ticker formats
      OverviewCryptoSportsSports Market TaxonomyCommoditiesWeather
Trading
    QuickstartOrder lifecycle and settlement
    Full REST reference
      Combo RFQ
      Events
      Volume
      Terms
      Order Management
      Positions
      Rewards
    WebSocket APIs
      OverviewAuthenticationMessage format
      Streams
        Book tickerL2 partial depthL2 differential depthTrade streamOrder eventsBalance updatesPosition updatesContract statusPrediction
      Utility
      Subscriptions
      L2 Data
      Order management
      Combo RFQ
        OverviewWebSocket streamsQuote methodsMaker integrationExamples
Market Makers
    Maker Fee-Free Trading PromoTaker Rewards ProgramMaker Rebate ProgramLiquidity Rewards ProgramMarket Maker Program
Resources
    SchemasDemo environmentRate limitsErrors
Combo RFQ

Examples

The combo RFQ WebSocket streams and quote methods used in these examples are available in production for beta testing. Quoting requires an eligible account with the capabilities described in Quote Methods.

A complete two-leg auction from the winning maker's perspective. All timestamps are milliseconds; all prices and quantities are string decimals.

1. Discovery

A taker opens a $50,000 notional RFQ on a two-leg combo. The anonymous broadcast arrives on requestForQuote:

Code
{ "e": "requestForQuote", "E": 1780000000000, "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "l": [ { "c": "123456", "o": "YES", "s": "GEMI-XRPUSD-260828" }, { "c": "123789", "o": "NO" } ], "n": "50000.00", "S": "OPEN", "w": 1780000001000, "x": 1780000120000, "c": 1780000000000 }

The quoting window closes at w — 1 second after creation.

2. Submit a quote

The maker prices the combo at 0.55 per contract and will cover up to 100,000 contracts:

Code
{ "id": 1, "method": "rfq.submit_quote", "params": { "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "price": "0.55", "quantity": "100000", "clientId": "maker-fill-123" } }
Code
{ "id": 1, "status": 200, "result": { "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6" } }

The maker supplied clientId to correlate the eventual maker order with its own records. Gemini returns the same value as c on the maker's authenticated orderUpdate fill event.

The quote is immutable — there is no revise. If the maker needs out before the window closes, rfq.withdraw_quote pulls it — permanently, for this RFQ (the one-quote-per-account slot is not freed).

The submission response is private to the maker. Neither submission nor withdrawal produces a customer stream delivery while the RFQ is open.

Because the maker omitted validUntil, the service assigns w (1780000001000). That makes the quote eligible at the logical close; validUntil is not checked again in later lifecycle stages.

3. Winner disclosed to the requester

At or after w, the venue selects the best eligible quote. This example closes 100 milliseconds after w. The requester receives one private CLOSED delivery containing only that quote; losing quotes remain undisclosed:

Code
{ "e": "requestForQuote", "i": "b16097e9-3d7f-5910-9820-eeedf51a8be3", "E": 1780000001100, "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "x": "CLOSED", "S": "PENDING_ACCEPTANCE", "q": "01J9Z2K7Q2N8M4P6R8T0V2W4X6", "p": "0.55", "sz": "100000", "qs": "ACTIVE", "vu": 1780000001000 }

The transition to PENDING_ACCEPTANCE starts the requester's 5-second decision window. Notice that vu is already at the logical auction close; that does not prevent post-close acceptance.

4. Acceptance arrives

In this example, the requester accepts 3 seconds after the CLOSED transition. The maker's requestForQuote@account stream delivers:

Code
{ "e": "requestForQuote", "i": "88bfe6b3-be05-56c6-bd1b-51b25fafb27a", "E": 1780000004100, "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "x": "ACCEPTED", "S": "CONFIRMING", "q": "01J9Z2K7Q2N8M4P6R8T0V2W4X6", "p": "0.55", "sz": "100000", "qs": "ACTIVE", "vu": 1780000001000 }

On the whole-contract quantity grid used in this example, at $50,000 notional and a price of 0.55, the fill is floor(50000 / 0.55) = 90,909 contracts.

The ACCEPTED transition and matching quoteId identify the winner. The quote remains ACTIVE until execution finalizes, when its status becomes WON.

5. Last-look confirm

The transition to CONFIRMING starts the winning maker's 1-second deadline to confirm or decline. The maker should act immediately on the ACCEPTED delivery.

Code
{ "id": 2, "method": "rfq.confirm_quote", "params": { "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6", "confirm": true } }
Code
{ "id": 2, "status": 200, "result": { "rfqId": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "quoteId": "01J9Z2K7Q2N8M4P6R8T0V2W4X6", "confirmed": true } }

Confirming places the maker's collateral hold, authorizes execution, and hands the trade to settlement (S moves to FINALIZING).

Declining instead ("confirm": false) fails the RFQ: the requester is notified, and no trade occurs.

6. Finalization

The public feed (and the maker's private stream) reports the terminal state, now carrying the filled quantity:

Code
{ "e": "requestForQuote", "E": 1780000004500, "r": "01J9Z3K7Q2N8M4P6R8T0V2W4X6", "l": [ { "c": "123456", "o": "YES", "s": "GEMI-XRPUSD-260828" }, { "c": "123789", "o": "NO" } ], "n": "50000.00", "f": "90909", "S": "FINALIZED", "c": 1780000000000 }

The resulting combo position and balance changes flow through the standard authenticated streams — see the Stream Reference.

:::caution Maker fill can differ from the requester fill f: "90909" is the requester's full-size execution quantity; it does not guarantee that the selected maker filled 90,909 contracts. The maker's post-only order executes first on the normal order book and can fill partially against other participants, while the requester can obtain some or all of its fill from other resting liquidity. If requester execution fails after a maker partial fill, the completed maker fill remains even though the RFQ ends in FAILED; only the unfilled maker-order remainder is cancelled. :::

Error example: quoting a closed auction

Submitting after the window closes:

Code
{ "id": 3, "status": 400, "error": { "code": -2010, "msg": "RFQ is not in a valid state for this operation" } }

See also

  • Quote Methods — full parameter and error tables.
  • Maker Integration — the workflow these messages belong to.
Maker integrationMaker Fee-Free Trading Promo
On this page
  • 1. Discovery
  • 2. Submit a quote
  • 3. Winner disclosed to the requester
  • 4. Acceptance arrives
  • 5. Last-look confirm
  • 6. Finalization
  • Error example: quoting a closed auction
  • See also
JSON
JSON
JSON
JSON
JSON
JSON
JSON
JSON
JSON