> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.paradex.trade/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.paradex.trade/_mcp/server.

# Create RFQ

POST https://api.prod.paradex.trade/v1/rfqs
Content-Type: application/json

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.


Reference: https://docs.paradex.trade/api/prod/rfqs/rfq-create

## Authentication

- `Authorization` header (required) — API Key authentication via header

## Request

### Body (application/json)

This endpoint expects a requests.RfqCreateRequest.

- `legs` (list of requests.RfqLeg, required) — Strategy and optional fixed-price hedge legs; maximum 25
- `quantity` (string, required) — Positive total strategy size
- `counterparties` (list of string, optional) — Reserved for future use; currently ignored for RFQ creation and drafts
- `is_anonymous` (boolean, optional) — Whether to hide the taker desk name from RFQ counterparties; ignored for drafts
- `label` (string, optional) — User-defined RFQ label; ignored for drafts
- `max_slippage` (string, optional) — 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.
- `side` (enum, optional) — 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.
  - Allowed values: `BUY`, `SELL`
- `strategy` (string, optional) — Draft strategy label; maximum 64 bytes and defaults to custom for drafts; ignored on RFQ create

## Response

### 202

Accepted

- `accepted_at` (integer, optional) — Unix milliseconds when the request was queued
- `request_id` (string, optional) — 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.

## Errors

### 400 Bad Request Error

Bad Request

- `data` (ResponsesApiErrorData, optional) — any additional data related to the error
- `error` (enum, optional) — unique immutable string identifier for specific error
  - Allowed values: `VALIDATION_ERROR`, `BINDING_ERROR`, `INTERNAL_ERROR`, `NOT_FOUND`, `SERVICE_UNAVAILABLE`, `INVALID_REQUEST_PARAMETER`, `ORDER_ID_NOT_FOUND`, `ORDER_IS_CLOSED`, `ORDER_IS_NOT_OPEN`, `INVALID_ORDER_SIZE`, `CLIENT_ORDER_ID_NOT_FOUND`, `DUPLICATED_CLIENT_ID`, `INVALID_SYMBOL`, `INVALID_TOKEN`, `INVALID_ETHEREUM_ADDRESS`, `INVALID_ETHEREUM_SIGNATURE`, `INVALID_STARKNET_ADDRESS`, `INVALID_STARKNET_SIGNATURE`, `STARKNET_SIGNATURE_VERIFICATION_FAILED`, `ETHEREUM_SIGNER_MISMATCH`, `ETHEREUM_HASH_MISMATCH`, `NOT_ONBOARDED`, `INVALID_TIMESTAMP`, `INVALID_BLOCK_EXPIRATION`, `ACCOUNT_NOT_FOUND`, `MEDIA_NOT_FOUND`, `INVALID_ORDER_SIGNATURE`, `PUBLIC_KEY_INVALID`, `UNAUTHORIZED_ETHEREUM_ADDRESS`, `UNAUTHORIZED_ERROR`, `ETHEREUM_ADDRESS_ALREADY_ONBOARDED`, `EVM_ADDRESS_ALREADY_ONBOARDED`, `MARKET_NOT_FOUND`, `ALLOWLIST_ENTRY_NOT_FOUND`, `USERNAME_IN_USE`, `GEO_IP_BLOCK`, `ETHEREUM_ADDRESS_BLOCKED`, `PROGRAM_NOT_FOUND`, `PROGRAM_NOT_SUPPORTED`, `INVALID_DASHBOARD`, `MARKET_NOT_OPEN`, `MARKET_NOT_SETTLED`, `INVALID_REFERRAL_CODE`, `REQUEST_NOT_ALLOWED`, `PARENT_ADDRESS_ALREADY_ONBOARDED`, `INVALID_PARENT_ACCOUNT`, `INVALID_VAULT_OPERATOR_CHAIN`, `VAULT_OPERATOR_ALREADY_ONBOARDED`, `VAULT_NAME_IN_USE`, `VAULT_NOT_FOUND`, `VAULT_STRATEGY_NOT_FOUND`, `VAULT_LIMIT_REACHED`, `VAULT_DATA_PRIVATE`, `BATCH_SIZE_OUT_OF_RANGE`, `ISOLATED_MARKET_ACCOUNT_MISMATCH`, `NO_ACCESS_TO_MARKET`, `POINTS_SUMMARY_NOT_FOUND`, `ALGO_ID_NOT_FOUND`, `INVALID_DERIVATION_PATH`, `PROFILE_STATS_NOT_FOUND`, `INVALID_CHAIN`, `INVALID_LAYERSWAP_SWAP`, `SOCIAL_USERNAME_IN_USE`, `INVALID_OAUTH_REQUEST`, `RPI_ACCOUNT_NOT_WHITELISTED`, `SYSTEM_STATUS_POST_ONLY`, `SYSTEM_STATUS_CANCEL_ONLY`, `INVALID_MARKETING_CODE`, `OFFER_NOT_FOUND`, `MARKET_MARGIN_RESTRICTED`, `NOT_UNIQUE`, `ACCOUNT_ALREADY_REFERRED`, `ONBOARDING_PERIOD_EXPIRED`, `ONBOARDING_RATE_LIMITED`, `SUBACCOUNTS_LIMIT_EXCEEDED`, `INSUFFICIENT_MIN_CHAIN_BALANCE`, `INSUFFICIENT_EVM_BALANCE`, `PORTFOLIO_MARGIN_ONBOARDING_DISABLED`, `PORTFOLIO_MARGIN_INVALID_ACCOUNT_KIND`, `EVM_VAULT_OPERATORS_DISABLED`, `INVALID_EVM_SIGNATURE`, `EVM_SIGNATURE_VERIFICATION_FAILED`, `INVALID_SUBKEY`, `SUBKEY_NOT_ACTIVATABLE`, `TOKEN_LIMIT_REACHED`, `INVALID_TOKEN_SCOPE`, `IP_NOT_ALLOWED`, `INSUFFICIENT_TRANSFERRABLE_XP`, `TRANSFER_LIMIT_REACHED`, `XP_TRANSFERS_DISABLED`, `BLOCK_TRADE_NOT_FOUND`, `BLOCK_TRADE_NOT_ENABLED`, `BLOCK_TRADE_EXPIRED`, `BLOCK_TRADE_ALREADY_CANCELLED`, `BLOCK_TRADE_INVALID_STATUS`, `BLOCK_TRADE_UNAUTHORIZED`, `BLOCK_TRADE_MISSING_TRADES`, `BLOCK_TRADE_MISSING_SIGNERS`, `BLOCK_TRADE_MISSING_SIGNATURE`, `BLOCK_TRADE_ACCOUNT_MISMATCH`, `BLOCK_TRADE_INVALID_SIGNATURE`, `BLOCK_TRADE_SIGNER_KEY_UNAUTHORIZED`, `BLOCK_TRADE_REPLAYED_SIGNATURE`, `BLOCK_TRADE_SELF_TRADE`, `OFFER_ALREADY_CANCELLED`, `OFFER_INVALID_STATUS`, `OFFER_UNAUTHORIZED`, `OFFER_PARENT_MISMATCH`, `OFFER_PARENT_NOT_ACCEPTING`, `PORTFOLIO_MARGIN_CONFIG_NOT_FOUND`, `MARGIN_CONFIG_NOT_FOUND`, `MMP_CONFIG_INVALID`, `MMP_NOT_ENABLED`, `MMP_MIN_FREEZE_NOT_ELAPSED`, `MMP_NOT_CONFIGURED`
- `message` (string, optional) — detailed description of error and how to address it

### 401 Unauthorized Error

Unauthorized

- `data` (ResponsesApiErrorData, optional) — any additional data related to the error
- `error` (enum, optional) — unique immutable string identifier for specific error
  - Allowed values: `VALIDATION_ERROR`, `BINDING_ERROR`, `INTERNAL_ERROR`, `NOT_FOUND`, `SERVICE_UNAVAILABLE`, `INVALID_REQUEST_PARAMETER`, `ORDER_ID_NOT_FOUND`, `ORDER_IS_CLOSED`, `ORDER_IS_NOT_OPEN`, `INVALID_ORDER_SIZE`, `CLIENT_ORDER_ID_NOT_FOUND`, `DUPLICATED_CLIENT_ID`, `INVALID_SYMBOL`, `INVALID_TOKEN`, `INVALID_ETHEREUM_ADDRESS`, `INVALID_ETHEREUM_SIGNATURE`, `INVALID_STARKNET_ADDRESS`, `INVALID_STARKNET_SIGNATURE`, `STARKNET_SIGNATURE_VERIFICATION_FAILED`, `ETHEREUM_SIGNER_MISMATCH`, `ETHEREUM_HASH_MISMATCH`, `NOT_ONBOARDED`, `INVALID_TIMESTAMP`, `INVALID_BLOCK_EXPIRATION`, `ACCOUNT_NOT_FOUND`, `MEDIA_NOT_FOUND`, `INVALID_ORDER_SIGNATURE`, `PUBLIC_KEY_INVALID`, `UNAUTHORIZED_ETHEREUM_ADDRESS`, `UNAUTHORIZED_ERROR`, `ETHEREUM_ADDRESS_ALREADY_ONBOARDED`, `EVM_ADDRESS_ALREADY_ONBOARDED`, `MARKET_NOT_FOUND`, `ALLOWLIST_ENTRY_NOT_FOUND`, `USERNAME_IN_USE`, `GEO_IP_BLOCK`, `ETHEREUM_ADDRESS_BLOCKED`, `PROGRAM_NOT_FOUND`, `PROGRAM_NOT_SUPPORTED`, `INVALID_DASHBOARD`, `MARKET_NOT_OPEN`, `MARKET_NOT_SETTLED`, `INVALID_REFERRAL_CODE`, `REQUEST_NOT_ALLOWED`, `PARENT_ADDRESS_ALREADY_ONBOARDED`, `INVALID_PARENT_ACCOUNT`, `INVALID_VAULT_OPERATOR_CHAIN`, `VAULT_OPERATOR_ALREADY_ONBOARDED`, `VAULT_NAME_IN_USE`, `VAULT_NOT_FOUND`, `VAULT_STRATEGY_NOT_FOUND`, `VAULT_LIMIT_REACHED`, `VAULT_DATA_PRIVATE`, `BATCH_SIZE_OUT_OF_RANGE`, `ISOLATED_MARKET_ACCOUNT_MISMATCH`, `NO_ACCESS_TO_MARKET`, `POINTS_SUMMARY_NOT_FOUND`, `ALGO_ID_NOT_FOUND`, `INVALID_DERIVATION_PATH`, `PROFILE_STATS_NOT_FOUND`, `INVALID_CHAIN`, `INVALID_LAYERSWAP_SWAP`, `SOCIAL_USERNAME_IN_USE`, `INVALID_OAUTH_REQUEST`, `RPI_ACCOUNT_NOT_WHITELISTED`, `SYSTEM_STATUS_POST_ONLY`, `SYSTEM_STATUS_CANCEL_ONLY`, `INVALID_MARKETING_CODE`, `OFFER_NOT_FOUND`, `MARKET_MARGIN_RESTRICTED`, `NOT_UNIQUE`, `ACCOUNT_ALREADY_REFERRED`, `ONBOARDING_PERIOD_EXPIRED`, `ONBOARDING_RATE_LIMITED`, `SUBACCOUNTS_LIMIT_EXCEEDED`, `INSUFFICIENT_MIN_CHAIN_BALANCE`, `INSUFFICIENT_EVM_BALANCE`, `PORTFOLIO_MARGIN_ONBOARDING_DISABLED`, `PORTFOLIO_MARGIN_INVALID_ACCOUNT_KIND`, `EVM_VAULT_OPERATORS_DISABLED`, `INVALID_EVM_SIGNATURE`, `EVM_SIGNATURE_VERIFICATION_FAILED`, `INVALID_SUBKEY`, `SUBKEY_NOT_ACTIVATABLE`, `TOKEN_LIMIT_REACHED`, `INVALID_TOKEN_SCOPE`, `IP_NOT_ALLOWED`, `INSUFFICIENT_TRANSFERRABLE_XP`, `TRANSFER_LIMIT_REACHED`, `XP_TRANSFERS_DISABLED`, `BLOCK_TRADE_NOT_FOUND`, `BLOCK_TRADE_NOT_ENABLED`, `BLOCK_TRADE_EXPIRED`, `BLOCK_TRADE_ALREADY_CANCELLED`, `BLOCK_TRADE_INVALID_STATUS`, `BLOCK_TRADE_UNAUTHORIZED`, `BLOCK_TRADE_MISSING_TRADES`, `BLOCK_TRADE_MISSING_SIGNERS`, `BLOCK_TRADE_MISSING_SIGNATURE`, `BLOCK_TRADE_ACCOUNT_MISMATCH`, `BLOCK_TRADE_INVALID_SIGNATURE`, `BLOCK_TRADE_SIGNER_KEY_UNAUTHORIZED`, `BLOCK_TRADE_REPLAYED_SIGNATURE`, `BLOCK_TRADE_SELF_TRADE`, `OFFER_ALREADY_CANCELLED`, `OFFER_INVALID_STATUS`, `OFFER_UNAUTHORIZED`, `OFFER_PARENT_MISMATCH`, `OFFER_PARENT_NOT_ACCEPTING`, `PORTFOLIO_MARGIN_CONFIG_NOT_FOUND`, `MARGIN_CONFIG_NOT_FOUND`, `MMP_CONFIG_INVALID`, `MMP_NOT_ENABLED`, `MMP_MIN_FREEZE_NOT_ELAPSED`, `MMP_NOT_CONFIGURED`
- `message` (string, optional) — detailed description of error and how to address it

### 403 Forbidden Error

Forbidden

- `data` (ResponsesApiErrorData, optional) — any additional data related to the error
- `error` (enum, optional) — unique immutable string identifier for specific error
  - Allowed values: `VALIDATION_ERROR`, `BINDING_ERROR`, `INTERNAL_ERROR`, `NOT_FOUND`, `SERVICE_UNAVAILABLE`, `INVALID_REQUEST_PARAMETER`, `ORDER_ID_NOT_FOUND`, `ORDER_IS_CLOSED`, `ORDER_IS_NOT_OPEN`, `INVALID_ORDER_SIZE`, `CLIENT_ORDER_ID_NOT_FOUND`, `DUPLICATED_CLIENT_ID`, `INVALID_SYMBOL`, `INVALID_TOKEN`, `INVALID_ETHEREUM_ADDRESS`, `INVALID_ETHEREUM_SIGNATURE`, `INVALID_STARKNET_ADDRESS`, `INVALID_STARKNET_SIGNATURE`, `STARKNET_SIGNATURE_VERIFICATION_FAILED`, `ETHEREUM_SIGNER_MISMATCH`, `ETHEREUM_HASH_MISMATCH`, `NOT_ONBOARDED`, `INVALID_TIMESTAMP`, `INVALID_BLOCK_EXPIRATION`, `ACCOUNT_NOT_FOUND`, `MEDIA_NOT_FOUND`, `INVALID_ORDER_SIGNATURE`, `PUBLIC_KEY_INVALID`, `UNAUTHORIZED_ETHEREUM_ADDRESS`, `UNAUTHORIZED_ERROR`, `ETHEREUM_ADDRESS_ALREADY_ONBOARDED`, `EVM_ADDRESS_ALREADY_ONBOARDED`, `MARKET_NOT_FOUND`, `ALLOWLIST_ENTRY_NOT_FOUND`, `USERNAME_IN_USE`, `GEO_IP_BLOCK`, `ETHEREUM_ADDRESS_BLOCKED`, `PROGRAM_NOT_FOUND`, `PROGRAM_NOT_SUPPORTED`, `INVALID_DASHBOARD`, `MARKET_NOT_OPEN`, `MARKET_NOT_SETTLED`, `INVALID_REFERRAL_CODE`, `REQUEST_NOT_ALLOWED`, `PARENT_ADDRESS_ALREADY_ONBOARDED`, `INVALID_PARENT_ACCOUNT`, `INVALID_VAULT_OPERATOR_CHAIN`, `VAULT_OPERATOR_ALREADY_ONBOARDED`, `VAULT_NAME_IN_USE`, `VAULT_NOT_FOUND`, `VAULT_STRATEGY_NOT_FOUND`, `VAULT_LIMIT_REACHED`, `VAULT_DATA_PRIVATE`, `BATCH_SIZE_OUT_OF_RANGE`, `ISOLATED_MARKET_ACCOUNT_MISMATCH`, `NO_ACCESS_TO_MARKET`, `POINTS_SUMMARY_NOT_FOUND`, `ALGO_ID_NOT_FOUND`, `INVALID_DERIVATION_PATH`, `PROFILE_STATS_NOT_FOUND`, `INVALID_CHAIN`, `INVALID_LAYERSWAP_SWAP`, `SOCIAL_USERNAME_IN_USE`, `INVALID_OAUTH_REQUEST`, `RPI_ACCOUNT_NOT_WHITELISTED`, `SYSTEM_STATUS_POST_ONLY`, `SYSTEM_STATUS_CANCEL_ONLY`, `INVALID_MARKETING_CODE`, `OFFER_NOT_FOUND`, `MARKET_MARGIN_RESTRICTED`, `NOT_UNIQUE`, `ACCOUNT_ALREADY_REFERRED`, `ONBOARDING_PERIOD_EXPIRED`, `ONBOARDING_RATE_LIMITED`, `SUBACCOUNTS_LIMIT_EXCEEDED`, `INSUFFICIENT_MIN_CHAIN_BALANCE`, `INSUFFICIENT_EVM_BALANCE`, `PORTFOLIO_MARGIN_ONBOARDING_DISABLED`, `PORTFOLIO_MARGIN_INVALID_ACCOUNT_KIND`, `EVM_VAULT_OPERATORS_DISABLED`, `INVALID_EVM_SIGNATURE`, `EVM_SIGNATURE_VERIFICATION_FAILED`, `INVALID_SUBKEY`, `SUBKEY_NOT_ACTIVATABLE`, `TOKEN_LIMIT_REACHED`, `INVALID_TOKEN_SCOPE`, `IP_NOT_ALLOWED`, `INSUFFICIENT_TRANSFERRABLE_XP`, `TRANSFER_LIMIT_REACHED`, `XP_TRANSFERS_DISABLED`, `BLOCK_TRADE_NOT_FOUND`, `BLOCK_TRADE_NOT_ENABLED`, `BLOCK_TRADE_EXPIRED`, `BLOCK_TRADE_ALREADY_CANCELLED`, `BLOCK_TRADE_INVALID_STATUS`, `BLOCK_TRADE_UNAUTHORIZED`, `BLOCK_TRADE_MISSING_TRADES`, `BLOCK_TRADE_MISSING_SIGNERS`, `BLOCK_TRADE_MISSING_SIGNATURE`, `BLOCK_TRADE_ACCOUNT_MISMATCH`, `BLOCK_TRADE_INVALID_SIGNATURE`, `BLOCK_TRADE_SIGNER_KEY_UNAUTHORIZED`, `BLOCK_TRADE_REPLAYED_SIGNATURE`, `BLOCK_TRADE_SELF_TRADE`, `OFFER_ALREADY_CANCELLED`, `OFFER_INVALID_STATUS`, `OFFER_UNAUTHORIZED`, `OFFER_PARENT_MISMATCH`, `OFFER_PARENT_NOT_ACCEPTING`, `PORTFOLIO_MARGIN_CONFIG_NOT_FOUND`, `MARGIN_CONFIG_NOT_FOUND`, `MMP_CONFIG_INVALID`, `MMP_NOT_ENABLED`, `MMP_MIN_FREEZE_NOT_ELAPSED`, `MMP_NOT_CONFIGURED`
- `message` (string, optional) — detailed description of error and how to address it

## Types

### requests.RfqLeg

- `market` (string, required) — Paradex market symbol
- `ratio` (string, required) — Positive decimal multiplier for the leg
- `side` (enum, required) — Leg direction
  - Allowed values: `BUY`, `SELL`
- `price` (string, optional) — Any positive value marks a hedge leg; the leg is then fixed at the market's mark price at creation

### ResponsesApiErrorData

any additional data related to the error

## Examples

**Request**

```json
{
  "legs": [
    {
      "market": "BTC-USD-PERP",
      "ratio": "1",
      "side": "BUY"
    }
  ],
  "quantity": "100"
}
```

**Response**

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

**SDK Code**

```python
import requests

url = "https://api.prod.paradex.trade/v1/rfqs"

payload = {
    "legs": [
        {
            "market": "BTC-USD-PERP",
            "ratio": "1",
            "side": "BUY"
        }
    ],
    "quantity": "100"
}
headers = {
    "Authorization": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.prod.paradex.trade/v1/rfqs';
const options = {
  method: 'POST',
  headers: {Authorization: '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"legs":[{"market":"BTC-USD-PERP","ratio":"1","side":"BUY"}],"quantity":"100"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.prod.paradex.trade/v1/rfqs"

	payload := strings.NewReader("{\n  \"legs\": [\n    {\n      \"market\": \"BTC-USD-PERP\",\n      \"ratio\": \"1\",\n      \"side\": \"BUY\"\n    }\n  ],\n  \"quantity\": \"100\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.prod.paradex.trade/v1/rfqs")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"legs\": [\n    {\n      \"market\": \"BTC-USD-PERP\",\n      \"ratio\": \"1\",\n      \"side\": \"BUY\"\n    }\n  ],\n  \"quantity\": \"100\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.prod.paradex.trade/v1/rfqs")
  .header("Authorization", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"legs\": [\n    {\n      \"market\": \"BTC-USD-PERP\",\n      \"ratio\": \"1\",\n      \"side\": \"BUY\"\n    }\n  ],\n  \"quantity\": \"100\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.prod.paradex.trade/v1/rfqs', [
  'body' => '{
  "legs": [
    {
      "market": "BTC-USD-PERP",
      "ratio": "1",
      "side": "BUY"
    }
  ],
  "quantity": "100"
}',
  'headers' => [
    'Authorization' => '<apiKey>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.prod.paradex.trade/v1/rfqs");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"legs\": [\n    {\n      \"market\": \"BTC-USD-PERP\",\n      \"ratio\": \"1\",\n      \"side\": \"BUY\"\n    }\n  ],\n  \"quantity\": \"100\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "legs": [
    [
      "market": "BTC-USD-PERP",
      "ratio": "1",
      "side": "BUY"
    ]
  ],
  "quantity": "100"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.prod.paradex.trade/v1/rfqs")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```