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:EURUSDGET /v1/history?symbol=WMMARKETS:ZERO:EURUSD&resolution=60- WebSocket
subscribemessage
Examples
| Compound Key | Broker | Account | Instrument |
|---|---|---|---|
WMMARKETS:ZERO:EURUSD | WM Markets | Hedge | EUR/USD |
WMMARKETS:ZERO:XAUUSD | WM Markets | Hedge | Gold/USD |
WMMARKETS:ZERO:BTCUSD | WM Markets | Hedge | Bitcoin/USD |
WMMARKETS:ZERO:US30 | WM Markets | Hedge | Dow Jones |
WMMARKETS:ZERO:AAPL | WM Markets | Hedge | Apple Inc. CFD |
OANDA:LIVE:EURUSD | OANDA | Live | EUR/USD |
OANDA:LIVE:XAUUSD | OANDA | Live | Gold/USD |
OANDA:LIVE:AAPL_CFD.US | OANDA | Live | Apple Inc. CFD (NASDAQ) |
OANDA:LIVE:ASML_CFD.NL | OANDA | Live | ASML CFD (Euronext Amsterdam) |
OANDA:LIVE:ERICb_CFD.SE | OANDA | Live | Ericsson 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 Symbol | API Compound Key |
|---|---|
EURUSD | WMMARKETS:ZERO:EURUSD |
EURUSDm | WMMARKETS: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)}")