---
title: Discovering Markets
description: Read and follow the FIX instrument catalog, select market tickers, and subscribe to trading status.
---

Use the FIX market-data session to discover market tickers and follow changes to their catalog membership and trading status. Complete logon as described in [FIX Sessions and Recovery](/reference/fix-sessions-and-recovery) before sending these requests.

The examples show decoded FIX fields. Your FIX engine encodes the numeric tags and raw values and supplies the header and trailer. Indentation marks repeating-group entries. Replace `<ticker>` with a ticker returned by the catalog. See [Markets and Trading](/concepts/markets-and-trading) for single-leg and multi-leg markets and pricing units.

## Read the Catalog

Send [SecurityListRequest(x)](/api-reference/fix/market-data/messages/security-list-request) to read every listed instrument:

```text
MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-1
SecurityListRequestType(559)=ALL_SECURITIES(4)
SubscriptionRequestType(263)=SNAPSHOT(0)
```

The exchange answers with [SecurityList(y)](/api-reference/fix/market-data/messages/security-list). Match `SecurityReqID(320)` to your request; `SecurityResponseID(322)` carries the same value. Read the instrument entries under `NoRelatedSym(146)` and copy each `Symbol(55)` as the market's ticker.

| Result | Next step |
| --- | --- |
| `SecurityRequestResult(560)=VALID_REQUEST(0)` | Read the returned instrument entries. |
| `SecurityRequestResult(560)=NO_INSTRUMENTS_FOUND(2)` | The selected catalog is empty; there are no instrument entries. |
| `SecurityRequestResult(560)=INVALID_OR_UNSUPPORTED_REQUEST(1)` | Correct the request's fields before retrying. |
| `SecurityRequestResult(560)=NOT_SUPPORTED(5)` | Select supported catalog criteria from the request reference. |

An empty catalog is an explicit answer, not silence:

```text
MsgType(35)=SecurityList(y)
SecurityReqID(320)=catalog-1
SecurityResponseID(322)=catalog-1
SecurityRequestResult(560)=NO_INSTRUMENTS_FOUND(2)
NoRelatedSym(146)=0
```

Each instrument entry includes `MinPriceIncrement(969)`, the price tick in dollars. Apply any returned minimum quantity and price limits when preparing orders. A multi-leg entry also contains a nested `NoLegs(555)` group identifying its component tickers; single-leg entries omit that group. Use the returned market ticker rather than constructing one from the component tickers.

## Narrow the Catalog

To read only multi-leg markets, select one security type:

```text
MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-multi
SecurityListRequestType(559)=SECURITYTYPE_AND_OR_CFICODE(1)
SecurityType(167)=MLEG
SubscriptionRequestType(263)=SNAPSHOT(0)
```

Use `SecurityType(167)=EVENT` for single-leg markets. The filter reads `SecurityType(167)` only. To look up one ticker, use `SecurityListRequestType(559)=SYMBOL(0)` and include `Symbol(55)` with that ticker.

Catalog membership and book availability are separate. The all-instrument and security-type queries can list a market before its book state is available. A named lookup or book request can therefore report that the ticker is unknown even though it appeared in the catalog. Do not treat catalog presence as confirmation that the market is ready to trade; read its trading status below.

## Follow Catalog Changes

To keep a catalog current, use the same request shape with a new request ID and `SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)`:

```text
MsgType(35)=SecurityListRequest(x)
SecurityReqID(320)=catalog-live
SecurityListRequestType(559)=ALL_SECURITIES(4)
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)
```

Build your starting catalog from SecurityList(y). Later [SecurityListUpdateReport(BK)](/api-reference/fix/market-data/messages/security-list-update-report) messages carry `SecurityReqID(320)=catalog-live`, so you can associate each change with this subscription.

| Update | Apply it to your catalog |
| --- | --- |
| `SecurityUpdateAction(980)=ADD(A)` | Add or replace the named instrument using the returned entry. It carries the same details as a catalog snapshot, including any legs and configured limits. |
| `SecurityUpdateAction(980)=DELETE(D)` | Remove the named ticker. The entry carries the ticker alone, without its former limits or legs. |

Apply these entries to the existing catalog; an update is not a replacement for the entire catalog. Catalog subscriptions report additions and deletions, not general metadata edits or changes in trading status. Track status separately.

To cancel, repeat the subscription request with its original `SecurityReqID(320)=catalog-live` and `SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2)`. Keep the original selection fields so the request remains valid. The exchange sends no application-level cancellation acknowledgment; messages already in transit can still arrive.

## Follow One Market's Status

Send [SecurityStatusRequest(e)](/api-reference/fix/market-data/messages/security-status-request) with the selected ticker:

```text
MsgType(35)=SecurityStatusRequest(e)
SecurityStatusReqID(324)=status-1
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)
Symbol(55)=<ticker>
```

The initial [SecurityStatus(f)](/api-reference/fix/market-data/messages/security-status) and subsequent status changes echo `SecurityStatusReqID(324)=status-1` and name the ticker in `Symbol(55)`.

| Answer | Meaning |
| --- | --- |
| `SecurityTradingStatus(326)=READY_TO_TRADE(17)` | The market's book is open for trading. |
| `SecurityTradingStatus(326)=TRADING_HALT(2)` | The market's book is closed for trading. |
| `Text(58)=no such instrument`, with `SecurityTradingStatus(326)` omitted | The exchange has no book state for that ticker. Check the ticker and catalog; a newly listed market may not have book state yet. |

A status subscription for an unknown ticker remains registered. It can receive a status when the market's book becomes available. For a one-time status read, use `SubscriptionRequestType(263)=SNAPSHOT(0)` instead.

To cancel the subscription, repeat the request with `SecurityStatusReqID(324)=status-1`, the original ticker, and `SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2)`. No application-level cancellation acknowledgment is sent.

## Follow Status Across Markets

Use [SecurityMassStatusRequest(CN)](/api-reference/fix/market-data/messages/security-mass-status-request) to follow trading status across markets without opening a separate subscription for each ticker. This example selects multi-leg markets:

```text
MsgType(35)=SecurityMassStatusRequest(CN)
SecurityStatusReqID(324)=status-multi
SubscriptionRequestType(263)=SNAPSHOT_PLUS_UPDATES(1)
NoInstrumentScopes(1656)=1
  InstrumentScopeOperator(1535)=INCLUDE(1)
  InstrumentScopeSecurityType(1547)=MULTILEG_INSTRUMENT(MLEG)
```

Omit `NoInstrumentScopes(1656)` to include both instrument kinds. To include only single-leg markets, use `InstrumentScopeSecurityType(1547)=EVENT_CONTRACT(EVENT)` in the scope entry. For a one-time read, use `SubscriptionRequestType(263)=SNAPSHOT(0)`.

The exchange answers with [SecurityMassStatus(CO)](/api-reference/fix/market-data/messages/security-mass-status), echoing `SecurityStatusReqID(324)`. Its `NoRelatedSym(146)` entries contain a ticker and trading status. Build the initial status map from that response; subsequent messages update the entries they name. Do not replace the entire status map with each change message. `NoRelatedSym(146)=0` means no matching book states were found.

This is a view of known book states, not a second instrument catalog. Do not infer catalog membership from this response. Use different `SecurityStatusReqID(324)` values for status subscriptions you want to keep active at the same time.

Cancel by repeating the mass-status request with its original request ID, scope, and `SubscriptionRequestType(263)=DISABLE_PREVIOUS_SNAPSHOT_PLUS_UPDATE_REQUEST(2)`. No application-level cancellation acknowledgment is sent.

## Read Books and Trades

Continue with [Reading Market Data](/walkthroughs/fix/reading-market-data) to request book snapshots, maintain a top-of-book view, or receive trades. Book and trade subscriptions do not supply trading status.

After a disconnection, recreate the catalog and status subscriptions you still need. Follow the fresh market-data logon procedure in [FIX Sessions and Recovery](/reference/fix-sessions-and-recovery#reconnect-to-market-data).
