Rfqs

Creates an RFQ for the authenticated account.

RFQ creation is asynchronous. Subscribe to the private WebSocket channel rfq before sending the request. A successful HTTP response is 202 Accepted and contains a Paradex request_id; it confirms only that the command was queued. The later WebSocket RESULT event with the same request_id reports whether the venue accepted the command. On success, the event's top-level rfq_id is the venue-issued identifier used by the read, execute, cancel, and filtered-subscription APIs.

The request accepts up to 25 legs. It must contain at least one strategy leg, represented by omitting price. At least one strategy leg must have side=BUY, and at least one must have ratio=1. A hedge leg is marked by any strictly positive price; the value is ignored and the leg is fixed at the market's mark price when the RFQ is created, rounded to the nearest price increment. A mark below half an increment is rejected. All quantities and ratios are positive decimal strings. Every leg market must exist on Paradex and be available for RFQ. The strategy quantity must be at least the largest minimum block size among its strategy legs.

The optional side commits the RFQ to one direction of the strategy, BUY or SELL, read the same way as a leg's side. Omitting it leaves the RFQ two-way. Makers always quote both directions either way; what the commitment changes is the taker's own side. A committed RFQ may only be executed in that direction, an execute on the other one is rejected, and the collateral held against it covers that direction alone instead of the more expensive of the two. So committing is cheaper for a taker who already knows which way they are going.

An account may hold only one two-way RFQ open at a time, and any number of committed ones up to a total limit. An RFQ stays open until the venue closes it. Cancelling is what closes it, but the cancellation is asynchronous: an account is normally free to create its next two-way RFQ once the WebSocket RESULT event for the cancel reports success, not when the cancel request is sent. A create issued before that, or immediately after it, may be rejected by a RESULT event saying the account already has an RFQ open, and can be retried.

The platform selects eligible counterparties; a client-supplied counterparties value is ignored. The optional strategy field is a draft label and is not sent to the venue.

The optional max_slippage sets the collateral held against this RFQ while it is open, as a fraction of the underlying's spot price. It replaces the configured bound, must be greater than zero and at most 1, and applies to every underlying the strategy touches; the market's own price band caps it, so a value beyond the band holds no more. A wider value holds more collateral.

It does not limit the price this RFQ may execute at. A quote worse than it may still be executed: what the execution actually costs is charged against the account at that point, so it is accepted while the account meets its margin requirement at the agreed price. The market's price band is what bounds the execution, applied to the resulting trade.

Validation or risk-check failures that occur after queueing are reported by the WebSocket RESULT event. Its result.allowed_side is the direction the RFQ was accepted for: the committed side when the request carried one, TWO_WAY when it did not, and BUY or SELL when a two-way request was accepted for one direction only because the account cannot sustain the other.

result.allowed_side is what the commitment and the reserve above are stated in, so it, and not the side that was sent, is the answer to read. Where Paradex does not risk-check the create it is empty, and a side sent with that request commits nothing: the RFQ is two-way, and either direction may be executed.

While the RFQ venue is AVAILABLE_CANCEL_ONLY or UNAVAILABLE for Paradex, the request is rejected with 400 and error RFQ_VENUE_UNAVAILABLE. The current state is readable at GET /rfqs/platform-state.

post/rfqs

Request

  • Base URL
    https://api.prod.paradex.trade/v1
  • URL
    https://api.prod.paradex.trade/v1/rfqs
  • Auth
    API key in header Authorization

Request body

counterpartiesstring[]

Reserved for future use; currently ignored for RFQ creation and drafts

is_anonymousboolean

Whether to hide the taker desk name from RFQ counterparties; ignored for drafts

labelstring

User-defined RFQ label; ignored for drafts

max_slippagestring

MaxSlippage sets the collateral held against this RFQ while it is open, as a fraction of underlying spot, replacing the configured bound for this RFQ only. It does not limit the price the RFQ may execute at. Empty leaves the configured one in place. Ignored for drafts.

quantitystring required

Positive total strategy size

side'BUY' | 'SELL'

Side commits the RFQ to one direction of the strategy, which is then the only direction it may be executed in. Empty leaves it two-way. Ignored for drafts.

strategystring

Draft strategy label; maximum 64 bytes and defaults to custom for drafts; ignored on RFQ create

Example request

{
  "is_anonymous": true,
  "label": "my-rfq",
  "legs": [
    {
      "market": "BTC-USD-PERP",
      "price": "30000.00",
      "ratio": "1",
      "side": "BUY"
    }
  ],
  "max_slippage": "0.002",
  "quantity": "100",
  "side": "BUY",
  "strategy": "straddle"
}

Response

Accepted

accepted_atinteger

Unix milliseconds when the request was queued

request_idstring

request_id identifies this request. It is echoed on the RESULT event delivered later on the WebSocket rfq channel, so a client with several requests in flight can match each outcome to the request that caused it. On Create it is the only identifier available until the venue issues the rfq_id.

Example response

{
  "accepted_at": 1640995200000,
  "request_id": "1739923200000000000"
}

Changes

    • warning

      added the new ADDRESS_BOOK_NOT_PARADEX_ACCOUNT enum value to the //// response property for the response status

    • warning

      added the new ADDRESS_BOOK_NOT_PARADEX_ACCOUNT enum value to the //// response property for the response status

    • warning

      added the new ADDRESS_BOOK_NOT_PARADEX_ACCOUNT enum value to the //// response property for the response status

    • warning

      added the new ADDRESS_BOOK_REPEATED_IN_IMPORT enum value to the //// response property for the response status

    • warning

      added the new ADDRESS_BOOK_REPEATED_IN_IMPORT enum value to the //// response property for the response status

    • warning

      added the new ADDRESS_BOOK_REPEATED_IN_IMPORT enum value to the //// response property for the response status

    • warning

      added the new STARKNET_PARENT_ONBOARDING_DISABLED enum value to the //// response property for the response status

    • warning

      added the new STARKNET_PARENT_ONBOARDING_DISABLED enum value to the //// response property for the response status

    • warning

      added the new STARKNET_PARENT_ONBOARDING_DISABLED enum value to the //// response property for the response status

    • warning

      added the new SESSION_EXPIRED enum value to the //// response property for the response status

    • warning

      added the new SESSION_EXPIRED enum value to the //// response property for the response status

    • warning

      added the new SESSION_REVOKED enum value to the //// response property for the response status

    • warning

      added the new SESSION_REVOKED enum value to the //// response property for the response status

    • info

      added the non-success response with the status