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

# Search and list instruments

GET /instruments

The instruments this environment serves, searched and filtered, sorted by symbol unless `sort` says otherwise. `search` matches word prefixes of the symbol; `symbol` looks up exact symbols, at most 100 per call. Page with `limit` and `cursor`; `include` adds the exact `total`, the `facets` behind the filter panels, or each row's `ticker`.

Reference: https://docs.immix.xyz/api-reference/rest-api/instruments/list

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Query parameters

- `search` (string, optional) — Case-insensitive word prefixes, matched against the symbol's tokens, the venue's own symbol, the type and the id: `btc usdt` matches `OKX@BTC/USDT:USDT`, `perp` matches every perpetual swap.
- `symbol` (string, optional) — Only these symbols, case-insensitive, at most 100; repeat the parameter or comma-separate. A symbol that does not exist is simply absent from the page.
- `venueId` (string, optional) — Only these venue ids; repeat the parameter or comma-separate.
- `venueId.notIn` (string, optional) — Every venue except these ids.
- `venue` (string, optional) — Only these venues, by code (`okx`, `binance_usd-m`), case-insensitive. A code no venue has matches nothing.
- `type` (string, optional) — Only these types: `SPOT`, `FUTURES`, `INVERSE_FUTURES`, `QUANTO_FUTURES`, `PERPETUAL_SWAP`, `INVERSE_PERPETUAL_SWAP`, `QUANTO_PERPETUAL_SWAP`, `OPTION`, `INVERSE_OPTION`, `INDEX`, or another type an instrument has. Any other value is 400.
- `status` (string, optional) — Only these statuses: `LISTED`, `OPEN`, `SUSPENDED`, `SETTLED`, `DELISTED`, or another status an instrument has; any other value is 400. No default: send `status=OPEN` for the markets trading now.
- `baseAssetId` (string, optional) — Only these base asset ids.
- `baseAsset` (string, optional) — Only these base assets, by symbol (`BTC`), case-insensitive. A symbol no asset has matches nothing.
- `quoteAssetId` (string, optional) — Only these quote asset ids.
- `quoteAsset` (string, optional) — Only these quote assets, by symbol (`USDT`), case-insensitive. A symbol no asset has matches nothing.
- `sort` (string, optional) — Comma-separated `symbol`, `instrumentId`, `type`, `listedAtNs`, `expiresAtNs`, `lastPx`, `pctChange24h`, `volume24h` or `turnover24h`; prefix `-` for descending. Default `symbol`. Absent values sort last in both directions: a time a row does not state, the statistics of an instrument that has never traded, a 24-hour statistic whose window is still warming, and any statistic the projection cannot state, such as a turnover it has no price to value.
- `limit` (integer, optional) — Page size, 1-100; larger values are clamped. Default 50.
- `cursor` (string, optional) — `nextCursor` or `prevCursor` from a previous page, sent with the same filters and sort.
- `include` (string, optional) — `total` adds the exact count; `facets` adds counts per venue, type, base and quote asset; `ticker` adds each row's latest statistics.

## Response

### 200

A page of instruments.

- `asOfSeqTsNs` (string, required, nullable) — The sequencer timestamp (epoch-ns) the data is complete through; also sent as X-Immix-As-Of-Seq-Ts. Null when unknown.
- `facets` (Facets, required, nullable) — Counts of matching instruments per dimension, null unless `include=facets`. Each dimension is counted under the request's filters minus that dimension's own filter, so a filter panel keeps showing the alternatives to the choice made in it. Each `value` is what the matching filter takes: `venues` feeds `venueId`, `types` feeds `type`, `baseAssets` feeds `baseAssetId` and `quoteAssets` feeds `quoteAssetId`. Values with no matches are omitted; counts sort descending.
- `items` (list of Instrument, required)
- `nextCursor` (string, required, nullable) — Pass as `cursor` for the next page. Null on the last page.
- `prevCursor` (string, required, nullable) — Pass as `cursor` for the previous page. Null on the first page.
- `total` (integer, required, nullable) — Exact count matching the filter. Null unless `include=total`.

## Errors

### 400 List Instruments Request Bad Request Error

The request is malformed, or its cursor is not valid for it.

- `error` (ErrorBody, required)

### 401 List Instruments Request Unauthorized Error

The bearer token is missing or not valid.

- `error` (ErrorBody, required)

### 501 List Instruments Request Not Implemented Error

Not implemented yet: `search`, `include=facets` and `include=ticker` are published for review. Every other parameter is served.

- `error` (ErrorBody, required)

### 503 List Instruments Request Service Unavailable Error

A store is temporarily unavailable; retry.

- `error` (ErrorBody, required)

## Types

### Facets

Counts of matching instruments per dimension, null unless `include=facets`. Each dimension is counted under the request's filters minus that dimension's own filter, so a filter panel keeps showing the alternatives to the choice made in it. Each `value` is what the matching filter takes: `venues` feeds `venueId`, `types` feeds `type`, `baseAssets` feeds `baseAssetId` and `quoteAssets` feeds `quoteAssetId`. Values with no matches are omitted; counts sort descending.

- `baseAssets` (list of FacetCount, required) — Matching instruments per base asset: `value` is the asset id, `label` the asset symbol.
- `quoteAssets` (list of FacetCount, required) — Matching instruments per quote asset: `value` is the asset id, `label` the asset symbol.
- `types` (list of FacetCount, required) — Matching instruments per instrument type: `value` is the type name, `label` is null.
- `venues` (list of FacetCount, required) — Matching instruments per venue: `value` is the venue id, `label` the venue code.

### Instrument

One market on one venue: a spot pair, a perpetual swap, a dated future, an option or an index. Foreign ids carry their display alias beside them.

- `baseAsset` (string, required) — The base asset's symbol, the display alias of `baseAssetId`.
- `baseAssetId` (string, required) — The base asset's id.
- `contractMultiplier` (string, required) — The contract multiplier: the base-asset quantity one unit of the instrument represents. `"1"` for spot.
- `contractValue` (string, required, nullable) — One contract's notional in the quote asset, for inverse futures and inverse perpetual swaps. Null for every other shape, and null where the catalog states none.
- `expiresAtNs` (string, required, nullable) — When a dated future or option stops trading, in epoch nanoseconds. Null for a product without an expiry.
- `feeAsset` (string, required, nullable) — The symbol of the asset trading fees are charged in, the display alias of `feeAssetId`. Null whenever `feeAssetId` is.
- `feeAssetId` (string, required, nullable) — The id of the asset trading fees are charged in. Null when unknown.
- `instrumentId` (string, required) — The instrument's id. Ids are opaque strings.
- `listedAtNs` (string, required, nullable) — When the catalog first knew the instrument (its `createdAt`), in epoch nanoseconds. Null when unknown.
- `makerFeeRate` (string, required) — The maker fee rate as a fraction of the notional: `"0.001"` is 10 basis points. `"0"` when the venue charges none; a rebate is negative.
- `minNotional` (string, required, nullable) — The smallest order notional, in the quote asset. Null when the venue states none.
- `priceDecimals` (integer, required) — The decimal places needed to render every valid price, derived from `tickSize`.
- `priceMax` (string, required, nullable) — The highest price the venue accepts. Null when the venue states none.
- `priceMin` (string, required, nullable) — The lowest price the venue accepts. Null when the venue states none.
- `qtyDecimals` (integer, required) — The decimal places needed to render every valid quantity, derived from `stepSize`.
- `qtyMax` (string, required, nullable) — The largest order quantity. Null when the venue states none.
- `qtyMin` (string, required, nullable) — The smallest order quantity. Null when the venue states none.
- `quoteAsset` (string, required) — The quote asset's symbol, the display alias of `quoteAssetId`.
- `quoteAssetId` (string, required) — The quote asset's id.
- `settleAsset` (string, required, nullable) — The settlement asset's symbol, the display alias of `settleAssetId`. Null whenever `settleAssetId` is.
- `settleAssetId` (string, required, nullable) — The id of the asset a derivative settles in. Null today for every row: the catalog does not state it, and the symbol's `:SETTLE` token names the settlement asset.
- `settlesAtNs` (string, required, nullable) — When a dated future or option settles, in epoch nanoseconds. Null for a product without a settlement.
- `status` (string, required) — The lifecycle status: `LISTED` (announced, not trading yet), `OPEN` (trading), `SUSPENDED` (trading halted), `SETTLED` (a dated product past settlement) or `DELISTED` (withdrawn). A halted market reads `LISTED` until the feed carries `SUSPENDED`. Append-only: tolerate values you don't know.
- `stepSize` (string, required) — The quantity increment: every valid quantity is a multiple of it.
- `symbol` (string, required) — The canonical symbol, `VENUE@BASE/QUOTE[:SETTLE[-DDMmmYY[-STRIKE-C|P]]]`: `OKX@BTC/USDT` (spot), `OKX@BTC/USDT:USDT` (linear perpetual), `BYBIT@BTC/USDT:USDT-25Jun27` (dated future), `BYBIT@BTC/USDC:USDC-26Sep26-100000-C` (call option). Byte-identical to the symbol on the market-data stream.
- `takerFeeRate` (string, required) — The taker fee rate as a fraction of the notional. `"0"` when the venue charges none; a rebate is negative.
- `tickSize` (string, required) — The price increment: every valid price is a multiple of it.
- `ticker` (Ticker, required, nullable) — An instrument's latest trade and rolling-window statistics, at display precision; the market-data stream carries the exact values. Null unless `include=ticker`, and null for an instrument that has never traded. A window that is still warming is null, never 0.
- `type` (string, required) — The product shape: `SPOT`, `FUTURES`, `INVERSE_FUTURES`, `QUANTO_FUTURES`, `PERPETUAL_SWAP`, `INVERSE_PERPETUAL_SWAP`, `QUANTO_PERPETUAL_SWAP`, `OPTION`, `INVERSE_OPTION` or `INDEX`. Append-only: tolerate values you don't know.
- `underlyingInstrumentId` (string, required, nullable) — The id of the instrument a derivative is written on. Null today for every row: the catalog does not state it.
- `updatedAtNs` (string, required, nullable) — When the instrument record last changed, as a sequencer timestamp in epoch nanoseconds. Statistics do not move it. Null when unknown.
- `venue` (string, required) — The venue's code, the display alias of `venueId`.
- `venueId` (string, required) — The venue's id.
- `venueSymbol` (string, required) — The venue's own symbol for the instrument, as its API spells it.

### ErrorBody

- `code` (string, required) — Machine-readable, UPPER_SNAKE and append-only; tolerate codes you don't know. Branch on this, never on the message.
- `message` (string, required) — For display only; its wording may change at any time.
- `requestId` (string, required) — The request's id, also sent as X-Request-Id; quote it to support.
- `retryable` (boolean, required) — Whether the same request may succeed if retried later.

### FacetCount

One value of a facet dimension and how many matching instruments carry it.

- `count` (integer, required) — The number of matching instruments with this value.
- `label` (string, required, nullable) — The value's display alias: the venue code in `venues`, the asset symbol in `baseAssets` and `quoteAssets`. Null in `types`.
- `value` (string, required) — The value, as the matching filter takes it: the venue id in `venues`, the asset id in `baseAssets` and `quoteAssets`, the type name in `types`.

### Ticker

An instrument's latest trade and rolling-window statistics, at display precision; the market-data stream carries the exact values. Null unless `include=ticker`, and null for an instrument that has never traded. A window that is still warming is null, never 0.

- `high24h` (string, required, nullable) — The highest price traded in the last 24 hours; the last price when the window had no trades. Null while the window warms.
- `lastPx` (string, required) — The last traded price, as a decimal string.
- `low24h` (string, required, nullable) — The lowest price traded in the last 24 hours; the last price when the window had no trades. Null while the window warms.
- `pctChange1h` (string, required, nullable) — The change over the last hour as a fraction of the hour's opening price: `"-0.0132"` is -1.32%. `"0"` for an hour with no trades; null while the window warms.
- `pctChange24h` (string, required, nullable) — The change over the last 24 hours as a fraction of the window's opening price. `"0"` for a window with no trades; null while the window warms.
- `turnover24h` (string, required, nullable) — The quote-asset notional traded in the last 24 hours. Null while the window warms, and null for a shape that cannot be valued in its quote asset (an option, an index).
- `volume24h` (string, required, nullable) — The base-asset quantity traded in the last 24 hours. Null while the window warms.
- `windowComplete` (boolean, required) — Whether the 24-hour window has a full 24 hours of history behind it. False after a restart until it does; the 24-hour fields are null meanwhile.

## Examples

**Response**

```json
{
  "asOfSeqTsNs": "asOfSeqTsNs",
  "facets": {
    "baseAssets": [
      {
        "count": 412,
        "label": "okx",
        "value": "300"
      }
    ],
    "quoteAssets": [
      {
        "count": 412,
        "label": "okx",
        "value": "300"
      }
    ],
    "types": [
      {
        "count": 412,
        "label": "okx",
        "value": "300"
      }
    ],
    "venues": [
      {
        "count": 412,
        "label": "okx",
        "value": "300"
      }
    ]
  },
  "items": [
    {
      "baseAsset": "BTC",
      "baseAssetId": "1",
      "contractMultiplier": "1",
      "contractValue": "100",
      "expiresAtNs": "1782460800000000000",
      "feeAsset": "USDT",
      "feeAssetId": "3",
      "instrumentId": "1234567",
      "listedAtNs": "1735689600000000000",
      "makerFeeRate": "0.001",
      "minNotional": "5",
      "priceDecimals": 1,
      "priceMax": "1000000",
      "priceMin": "0.1",
      "qtyDecimals": 2,
      "qtyMax": "10000",
      "qtyMin": "0.01",
      "quoteAsset": "USDT",
      "quoteAssetId": "3",
      "settleAsset": "USDT",
      "settleAssetId": "3",
      "settlesAtNs": "1782460800000000000",
      "status": "OPEN",
      "stepSize": "0.01",
      "symbol": "OKX@BTC/USDT:USDT",
      "takerFeeRate": "0.0015",
      "tickSize": "0.1",
      "ticker": {
        "high24h": "64010",
        "lastPx": "63125.5",
        "low24h": "61780.5",
        "pctChange1h": "-0.0132",
        "pctChange24h": "0.0245",
        "turnover24h": "9871204.35",
        "volume24h": "18234.51",
        "windowComplete": true
      },
      "type": "PERPETUAL_SWAP",
      "underlyingInstrumentId": "1234560",
      "updatedAtNs": "1758640000000000000",
      "venue": "okx",
      "venueId": "300",
      "venueSymbol": "BTC-USDT-SWAP"
    }
  ],
  "nextCursor": "nextCursor",
  "prevCursor": "prevCursor",
  "total": 1
}
```

**SDK Code**

```python
import requests

url = "https://api.example.com/instruments"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.example.com/instruments';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

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"
	"net/http"
	"io"
)

func main() {

	url := "https://api.example.com/instruments"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	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.example.com/instruments")

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

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

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.get("https://api.example.com/instruments")
  .header("Authorization", "Bearer <token>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.example.com/instruments', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.example.com/instruments");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.example.com/instruments")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

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()
```