> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polaris.supply/llms.txt
> Use this file to discover all available pages before exploring further.

# Catalog

> Find public markets, symbols, historical bounds, and access metadata.

Search the public market catalog before querying data. Use the exact `source` and `market` values returned here in later requests. `market` requires `source`; `symbol` searches a normalized symbol across sources.

## Request

```bash theme={null}
curl "https://api.polaris.supply/catalog?source=hyperliquid&limit=2"
```

### Query parameters

| Parameter | Type | Required | Description |
| - | - | - | - |
| `source` | `string` | No | Exact source, venue, or recorder identifier |
| `market` | `string` | No | Exact market symbol; requires source |
| `symbol` | `string` | No | Exact normalized BASEQUOTE symbol across sources |
| `q` | `string` | No | Case-insensitive source, market, normalized symbol, or category search |
| `cursor` | `string` | No | Opaque cursor returned by the previous page; reuse with the same filters |
| `limit` | `integer` | No | Page size; defaults to 200 and values above 1000 are capped |

## Access and behavior

The response is paginated. `total` counts matching markets, while `markets` contains this page only. Each market includes a normalized `symbol`, dataset categories, access metadata, an `instrument` object, and optional statistics and instrument count. `statistics.fields` contains only currently available curated values, each with its own observation time. Account-specific catalog visibility is outside this public contract.

## Response

| Field | Type | Required | Description |
| - | - | - | - |
| `has_more` | `boolean` | Yes | — |
| `limit` | `integer` | Yes | — |
| `markets` | `CatalogMarket[]` | Yes | — |
| `next_cursor` | `string / null` | No | — |
| `total` | `integer` | Yes | — |
| `updatedAt` | `string` | Yes | — |

### `markets[]` fields

| Field | Type | Required | Description |
| - | - | - | - |
| `access` | `AccessMetadata` | Yes | — |
| `categories` | `string[]` | Yes | — |
| `end` | `string` | Yes | Latest standardized event collector timestamp across trades, L2 updates, and funding rates. |
| `image_url` | `string / null` | No | — |
| `instrument` | `InstrumentMetadata` | Yes | — |
| `instrument_count` | `integer / null` | No | — |
| `market` | `string` | Yes | — |
| `source` | `string` | Yes | — |
| `start` | `string` | Yes | Earliest standardized event collector timestamp across trades, L2 order books, and funding rates. |
| `statistics` | `null / CatalogStatistics` | No | — |
| `symbol` | `string` | Yes | Normalized BASEQUOTE symbol, falling back to the venue-native market identifier. |

`markets[].access` contains `status` (`open`, `preview`, or `restricted`) and nullable `public_cutoff_date`. `markets[].instrument` can contain nullable `base`, `quote`, `tick_size`, `lot_size`, and `min_notional` strings.

`markets[].instrument` is present even when individual metadata fields are null. `markets[].start` and `markets[].end` describe the available standardized event range, not a promise that every event type is present at every instant.

## Pagination

Pass `next_cursor` as `cursor` with the same filters. Stop when `has_more` is false, or when `next_cursor` is null for endpoints without `has_more`. A cursor is opaque; do not edit or reuse it with different filters.

## Errors

The OpenAPI contract lists `400`, `503`, `429`. Error responses use `error.code`, `error.message`, and `error.resolution`. Follow `Retry-After` after `429`.

For the machine-readable contract, see the [OpenAPI document](https://api.polaris.supply/openapi.json).
