Forex and Crypto come together on one subscription but behave like two different products, and that is what to plan around. They are separate WebSocket clusters, they use different ticker prefixes and different channel names, and forex has no trade feed at all because the market has no consolidated tape. Gold and silver are in here too, quoted as currency pairs.
Applies to
- Plans: any Currencies subscription. The tier sets your history window and whether quotes are real time.
- Endpoints: every forex and crypto REST endpoint, plus the wss://socket.massive.com/forex and wss://socket.massive.com/crypto clusters.
- Asset classes: forex and crypto. Precious metals are quoted as forex pairs, so they are included too.
What each half covers
Each half covers a different market, with its own ticker format and its own streaming channel names:
| What | Forex | Crypto |
|---|---|---|
| Pairs | Over 1,200 | Over 600 |
| Ticker prefix, REST | C: as in C:EURUSD | X: as in X:BTCUSD |
| Ticker prefix, WebSocket | C:EUR-USD, hyphenated | X:BTC-USD, hyphenated |
| WebSocket cluster | /forex | /crypto |
| Quote channel | C | XQ |
| Per-minute bars | CA | XA |
| Per-second bars | CAS | XAS |
| Trades | Not published | XT |
| Trading week | Sessions run around the clock on weekdays | Every day, including weekends |
The hyphen is not cosmetic, and each side fails differently when you get it wrong. Use the unhyphenated form everywhere on REST and the hyphenated form everywhere on the WebSocket.
REST mostly refuses the hyphenated form outright, which at least tells you: /v3/reference/ tickers?ticker=X:BTC-USD returns Invalid ticker parameter and the crypto snapshot returns a 404. Two endpoints are lenient and accept both, range aggregates and /v3/quotes, which is where the habit comes from. One is worse than either: /v2/aggs/ticker/X:BTC-USD/prev returns HTTP 200 with resultsCount: 0, so the hyphen reads as a ticker with no data.
The WebSocket is the silent one. Subscribing to XAS.X:BTCUSD is answered with "subscribed to: XAS.X:BTCUSD" and then delivers nothing at all, while XAS.X:BTC-USD streams normally.
Forex has no trade feed because the market has no consolidated tape: there is no central exchange printing executions, so quotes are the primary data. Crypto exchanges do publish trades, so crypto has both.
Gold and silver are in here too
Gold and silver are quoted as forex pairs, so the Currencies subscription is also how you get them: C:XAUUSD and C:XAGUSD, plus gold against 14 other currencies and silver against 15. There is no separate commodities product.
Platinum and palladium were quoted this way once, as C:XPTUSD and C:XPDUSD. Those pairs are retired, with a last bar dated 1 February 2024, so use the PL and PA futures contracts instead.
How to list the pairs you can reach
curl -X GET "https://api.massive.com/v3/reference/tickers?market=fx&limit=5&apiKey=YOUR_API_KEY"
Response
{
"results": [
{ "ticker": "C:AEDAUD", "market": "fx", "locale": "global", "active": true }
],
"status": "OK"
}
Change market=fx to market=crypto for the crypto side. Both are paged, so follow next_url rather than raising limit.
If you see an error
{"status":"NOT_AUTHORIZED"} on a forex or crypto endpoint means the key has no Currencies subscription. A Stocks subscription does not reach either half.
{"ev":"status","status":"error","message":"not authorized"} after subscribing to A.* on the crypto or forex cluster is a channel-name problem, not a plan problem. Those clusters use XAS and CAS for per-second bars.
An empty results array for a pair you expected means that pair is not published. Search the tickers endpoint by one side of the pair to see what is.

