Symbol Format

Every instrument in the API is identified by a compound key — a colon-separated string with three parts.


Structure

WMMARKETS:ZERO:EURUSD
─────────┬──────┬──────
         │      │
         │      └─ Display symbol (uppercase, no broker suffix)
         │
         └─ Account type (uppercase)

WMMARKETS ── Broker name (uppercase)

The compound key is used as the symbol parameter in every endpoint:

  • GET /v1/symbols?symbol=WMMARKETS:ZERO:EURUSD
  • GET /v1/history?symbol=WMMARKETS:ZERO:EURUSD&resolution=60
  • WebSocket subscribe message

Examples

Compound KeyBrokerAccountInstrument
WMMARKETS:ZERO:EURUSDWM MarketsHedgeEUR/USD
WMMARKETS:ZERO:XAUUSDWM MarketsHedgeGold/USD
WMMARKETS:ZERO:BTCUSDWM MarketsHedgeBitcoin/USD
WMMARKETS:ZERO:US30WM MarketsHedgeDow Jones
WMMARKETS:ZERO:AAPLWM MarketsHedgeApple Inc. CFD
OANDA:LIVE:EURUSDOANDALiveEUR/USD
OANDA:LIVE:XAUUSDOANDALiveGold/USD
OANDA:LIVE:AAPL_CFD.USOANDALiveApple Inc. CFD (NASDAQ)
OANDA:LIVE:ASML_CFD.NLOANDALiveASML CFD (Euronext Amsterdam)
OANDA:LIVE:ERICb_CFD.SEOANDALiveEricsson B CFD (Stockholm)

OANDA share CFDs — dots and mixed case

The OANDA:LIVE feed carries about 1,620 instruments, and roughly 1,540 of them are share CFDs across 12 exchanges. Their names differ from the FX-style symbols in two ways that will break naive parsing:

1. They contain a dot. The instrument part is <TICKER>_CFD.<EXCHANGE> — AAPL_CFD.US, ASML_CFD.NL, MC_CFD.FR, SAP_CFD.DE. A compound key therefore looks like:

OANDA:LIVE:AAPL_CFD.US
└──┬──┘ └┬─┘ └────┬────┘
broker  acct   instrument (contains a dot)

If you split a compound key, split on : and take at most 3 parts (split(':', 2) in Python, split(':') then re-join the tail in JS). Splitting on . or assuming the instrument is alphanumeric will corrupt these names.

2. Some tickers are mixed case, and the case is meaningful. Nordic share classes encode the class as a lower-case trailing letter: ERICb_CFD.SE (Ericsson B), VOLVb_CFD.SE, NOVOb_CFD.DK, MAERSKa_CFD.DK, SEBa_CFD.SE. Upper-casing these produces a symbol that does not exist.


Symbol Normalization

MT5 broker symbols sometimes include suffixes that differ between brokers. The API strips these and stores only the clean display symbol:

MT5 Raw SymbolAPI Compound Key
EURUSDWMMARKETS:ZERO:EURUSD
EURUSDmWMMARKETS:ZERO:EURUSD
EURUSD.WMMARKETS:ZERO:EURUSD
EURUSD@WMMARKETS:ZERO:EURUSD
EURUSD.sml (OANDA)OANDA:LIVE:EURUSD

You never need to handle broker-specific suffixes — the API always exposes the clean name. Note that the exchange suffix on an OANDA share CFD (.US, .NL, .SE) is not a broker suffix: it is part of the instrument's identity and is always present.


Case Sensitivity


Fetch the Full Symbol List

import requests

headers = {"X-API-Key": "fxd_your_key"}

resp = requests.get(
    "https://api.pipdata.net/v1/symbols",
    headers=headers,
    params={"limit": 1000}
)

for sym in resp.json()["symbols"]:
    print(f"{sym['symbol']:<45} | {sym['display_symbol']:<12} | {sym['type']}")

Sample output:

WMMARKETS:ZERO:AUDUSD                        | AUD/USD     | forex
WMMARKETS:ZERO:BTCUSD                        | BTC/USD     | crypto
WMMARKETS:ZERO:GER40                         | GER40       | index
WMMARKETS:ZERO:AAPL                          | AAPL        | cfd
WMMARKETS:ZERO:XAUUSD                        | XAU/USD     | forex

Filtering by Type

# Get only forex symbols
resp = requests.get(
    "https://api.pipdata.net/v1/symbols",
    headers=headers,
    params={"limit": 1000}
)
symbols = resp.json()["symbols"]
forex = [s for s in symbols if s["type"] == "forex"]
crypto = [s for s in symbols if s["type"] == "crypto"]
indices = [s for s in symbols if s["type"] == "index"]
cfds = [s for s in symbols if s["type"] == "cfd"]

print(f"Forex: {len(forex)} | Crypto: {len(crypto)} | Indices: {len(indices)} | CFDs: {len(cfds)}")