Introduction
Welcome to the Synquote RFQ Rest API for options market makers.
You can use our API specification to receive and respond to RFQs from the end user of our web/mobile apps.
Register as a Market Maker
We have a manual whitelisting process for qualified market makers. You must supply us with:
The public ETH address of the market maker
The HTTPS endpoint which will be responding to RFQs
Market makers will receive requests and are expected to send responses in the format specified below.
Quote Server API
requestQuote
Receive RFQs
The HTTP server hosted by a MM that is responding to RFQs should support POST requests to the /requestQuote interface.
Users of our app send RFQs directly to this endpoint in the format specified below.
HTTP Request
POST https://{REGISTERED_HTTPS_ENDPOINT}/requestQuote
{
"chain": "arbitrum",
"market": "ETH",
"expiry_time": 1648195200,
"strike_price": 3000,
"is_call": true,
"size": 2,
"direction": "buy",
"address": "0xc730b0287a66efb14f20e67c68dd809fdc49890d",
"current_account_health_factor": 3.56,
"projected_account_health_factor": 2.98
}
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| chain | string | The chain the RFQ is being sent for (e.g. "arbitrum", "polygon") |
| market | string | The underlying asset the user wants to trade options on (e.g. "ETH", "BTC") |
| expiry_time | number | Expiry time in epoch seconds. This will be at 8AM UTC on the expiry date |
| strike_price | number | The strike price of the option |
| is_call | boolean | A boolean, true for calls and false for puts. |
| size | number | Contract size the user wishes to trade. Our minimum contract size is 1/100th of the underlying asset |
| direction | string | Direction the user wants to go, 'buy' if they are long and 'sell' if they are short |
| address | string | The address of the user requesting the quote. |
| current_account_health_factor | number | The current account health factor of your account. This is the ratio of your account equity to maintenance margin requirement. An account health factor of 2+ is healthy, accounts with a health factor of <=1 can be liquidated. |
| projected_account_health_factor | number | The projected account health factor of your account, so that you can preview how filling the trade will affect your account risk status. The projection is made using the deribit mark price. |
HTTP Response
Your HTTP server must respond with the following fields.
Response Parameters
{
"quote_available": true,
"usd_cost": 138,
"quote_identifier": 1234
}
| Parameter | Type | Description |
|---|---|---|
| quote_available | boolean | True if the MM has sent a quote, false otherwise. The remaining fields are only required if this is true. |
| usd_cost | number | (Optional) The premium at which MM is willing to buy/sell the instrument in the specified size. The maximum precision is 1 cent. |
| quote_identifier | number | (Optional) A numerical unique identifier for the quote, can be a randomly generated number |
acceptQuote
Sign Quotes
This endpoint is hit when the user accepts the quote, and allows the market maker to indicate whether it is still valid. If the quote is still valid, you supply a signature for the quote details using our signing library.
To sign the quote, you need a signer which can be constructed using your private key.
We recommend issuing quotes that are valid for at least 60 seconds for a good user experience, and monitor expired quote metrics.
Our Websocket API will enable real-time quote streaming.
HTTP Request
POST https://{REGISTERED_HTTPS_ENDPOINT}/acceptQuote
Query Parameters
{
"quote_identifier": 1234
}
| Parameter | Type | Description |
|---|---|---|
| quote_identifier | number | The identifier of the quote, which was returned in response to /requestQuote |
HTTP Response
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| quote_available | boolean | True if the MM has sent a quote, false otherwise. The remaining fields are only required if this is true. |
| signature | string | (Optional) An order signed through using our signing library, which takes as parameters the quote details and a signer |
| settlement_deadline | number | (Optional) A deadline for the transaction to be settled on chain in epoch seconds. |
txConfirmation
HTTP Request
POST https://{REGISTERED_HTTPS_ENDPOINT}/txConfirmation
Query Parameters
{
"quote_identifier": 1234,
"transaction_hash": "0xa8218dc38bf5ddb2ca8c51262b4cf306e91aca17e7d3f681aaa51387bab5b9bb"
}
| Parameter | type | Description |
|---|---|---|
| quote_identifier | number | The identifier of the quote, which was returned in response to /requestQuote |
| transaction_hash | string | Transaction hash of the TX submitted on-chain |
HTTP Response
No response is required from the market maker - the transaction hash is supplied for convenience only.
MMs are not required to support this endpoint in order to respond to RFQs.
listChainsAndMarkets
HTTP Request
GET https://{REGISTERED_HTTPS_ENDPOINT}/listChainsAndMarkets
{
"arbitrum": ["BTC", "ETH"]
"polygon": ["ETH"]
}
HTTP Response
The market maker should respond with a JSON object mapping chains (e.g. "polygon", "arbitrum") to markets (e.g. "BTC", "ETH").
The example to the right shows a market maker who wishes to quote BTC+ETH options on Polygon but only ETH on Avalanche.
requestMarkets
HTTP Request
POST https://{REGISTERED_HTTPS_ENDPOINT}/requestMarkets
Query Parameters
{
"chain": "arbitrum",
"size": 1
}
| Parameter | type | Description |
|---|---|---|
| chain | string | The chain the sampling request is being sent for (e.g. "arbitrum", "polygon") |
| size | number | The size of the sample, currently this is '1' so the server return the cost of 1 contract for each instrument |
HTTP Response
The market maker should respond with a JSON object mapping instruments (e.g. "ETH-2SEP22-1600-C") to bids and asks in USD terms with a max precision of one cent (e.g. {"bid" : 12.12, "ask": 14.14})
If only one side is quoted that's fine, and the server can deside which instruments it wants to quote.
To the right is an example response for a server which quotes 3 instruments, 2 on both sides of the market and one sell-side only.
// Example requestMarkets response
{
"ETH-2SEP22-1600-C": {"bid": 12.12, "ask": 14.14},
"ETH-2SEP22-1700-C": {"bid": 8.23, "ask": 10.42},
"ETH-2SEP22-1800-C": {"ask": 7.23},
}
Account Client API
For programmatic access to trade data, we expose HTTP endpoints at https://staging-api.synquote.com/positions/*
account/status
Account Status Endpoint
Make a GET request to /account/status to access the account status endpoint, which returns data pertinent to the account health.
Note that you can set up account health notifications on a particular address via Hal.
GET https://staging-api.synquote.com/account/status?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=arbitrum
HTTP Request
GET https://staging-api.synquote.com/account/status?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=arbitrum
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| address | string | Address of the user for which positions info is requested |
| network | string | Name of the network for which positions info is requested |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| account_health_factor | number | Number between 0 and 10 representing the account health factor. An account health factor <=1 means that positions can be liquidated. |
| maintenance_margin | number | Number representing the maintenance margin of the account (USDC) |
| initial_margin | number | Number representing the initial margin of the account (USDC) |
| usdc_balance | number | USDC balance of the account |
account/positions/open
Open Positions Endpoint
Make a GET request to /account/positions/open to access the open positions endpoint.
GET https://staging-api.synquote.com/positions/account/positions/open?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=arbitrum
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| address | string | Address of the user for which positions info is requested |
| network | string | Name of the network for which positions info is requested |
| offset | number | Optional, defaults to 0. Offset of the request to get the next page of items, each page contains up to 1000 results |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| instrument_name | string | Name of the the instrument, in the form ETH-1APR22-3600-C (COIN-EXPIRY-STRIKE-PUT/CALL) |
| side | string | LONG or SHORT |
| size | number | Size of the position |
| average_basis | number | Average basis of the position (total premium/size) |
account/positions/settled
Settled Positions Endpoint
Make a GET request to /account/positions/settled to access the open positions endpoint.
GET https://staging-api.synquote.com/account/positions/settled?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=arbitrum
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| address | string | Address of the user for which positions info is requested |
| network | string | Name of the network for which positions info is requested |
| offset | number | Optional, defaults to 0. Offset of the request to get the next page of items, each page contains up to 1000 results |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| instrument_name | string | Name of the the instrument, for example ETH-1APR22-3600-C (COIN-EXPIRY-STRIKE-PUT/CALL) |
| side | string | LONG or SHORT |
| size | number | Size of the position |
| average_basis | number | Average basis of the position (total premium/size) |
| settlement_price | number | Price of the underlying upon which settlement is based |
| pl | number | Total P&L for the settled position |
account/trades
Trade History Endpoint
Make a GET request to /account/trades to access historical trades.
GET https://staging-api.synquote.com/account/trades?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=arbitrum
HTTP Request
GET https://staging-api.synquote.com/account/trades?address=0xc730b0287a66efb14f20e67c68dd809fdc49890d&network=polygon
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| address | string | Address of the user for which positions info is requested |
| network | string | Name of the network for which positions info is requested |
| offset | number | Optional, defaults to 0. Offset of the request to get the next page of items, each page contains up to 1000 results |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| instrument_name | string | Name of the the instrument, for example ETH-1APR22-3600-C (COIN-EXPIRY-STRIKE-PUT/CALL) |
| side | string | LONG or SHORT |
| size | number | Size of the position |
| basis | number | Basis for the trade in USD |
| timestamp | number | Time the trade was executed in epoch seconds |
| pnl | number | Realized PnL of the trade, rounded to the nearest cent. Zero if it is an opening trade. |
Listings Client API
For programmatic access to instruments we have displayed in our options chain, we expose an HTTP endpoint at https://staging-api.synquote.com/listings
listings
Listings Endpoint
Make a GET request to /listings to access the set of instruments currently displayed in the options chain in our UI.
This will return the set of instruments that have a live bid or ask.
GET https://staging-api.synquote.com/listings?network=arbitrum&market=ETH
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| network | string | Name of the network for which positions info is requested, for e.g. "arbitrum" |
| market | string | The coin for which you are requesting listings, for e.g. "ETH", "BTC" |
Response Parameters
The response is an array of instruments. Each instrument currently has the following fields:
| Parameter | Type | Description |
|---|---|---|
| instrument_name | string | Name of the the instrument, in the form ETH-1APR22-3600-C (COIN-EXPIRY-STRIKE-PUT/CALL) |
We will be adding more market detials to each instrument returned by the 'listings' endpoint but all changes will be backwards compatible.
Staging Integration
We have a staging environment on Fuji testnet which uses mock USDC & wrapped assets.
It can be used for integration/testing before you start quoting in production with real assets.
Reach out to get set up in staging, include your ETH address to receive faucet USDC, WETH, WBTC.