# Live prices from the account's broker

URL: https://docs.fxapis.com/api-reference/market-data/live-prices-from-the-accounts-broker

> Live prices from the account's broker. Bid, ask and spread for up to 20 symbols or instruments, read from the account's own MetaTrader terminal — the prices…

`GET https://api.fxapis.com/v1/accounts/{id}/quotes`

Bid, ask and spread for up to 20 symbols or instruments, read from the account's own MetaTrader terminal — the prices this account trades at. The account must be online (409 `ACCOUNT_NOT_READY` otherwise).

Every quote carries `time`, `brokerTime` and `ageMs`; judge freshness from them. `stale` is true only while the market is open and the last tick is over 60 seconds old; a closed market answers its last price with `marketOpen: false`. A symbol the broker does not have answers `status: unknown_symbol` in its place. Poll this; there is no stream. Calls that reach the terminal are charged to the account's live budget (300 a minute + 50, across every caller; cached answers are free), and past it this answers 429 `RATE_LIMITED` with `retry-after`. An account whose terminal predates quotes answers 501 `CAPABILITY_UNAVAILABLE` until it is updated.

Authentication: `Authorization: Bearer <API key>`.

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `symbols` | query | string | no | Broker symbols, comma-separated, exactly as this broker names them: `EURUSD.a,XAUUSD.a`. |
| `instruments` | query | string | no | Instruments (`GET /v1/instruments`), comma-separated; each is quoted as this account's own symbol for it. |
| `id` | path | string (uuid) | yes |  |

#### Responses

- `200`
- `400`
- `401`
- `404`
- `409`
- `422`
- `429`
- `501`
- `503`

Failures return `{ "error": { "code", "message" } }`; every code is listed at https://docs.fxapis.com/errors.

#### 200 response fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object[] | no |  |
| `data[].symbol` | string | yes | Example: `"EURUSD"` |
| `data[].instrument` | null \| string | no | The instrument you asked by, when you asked by one. |
| `data[].status` | "ok" \| "no_price" \| "unknown_symbol" | yes | `no_price`: the broker has sent no price for it yet. `unknown_symbol`: this broker has no such symbol. |
| `data[].bid` | null \| string | no | Example: `"1.08450000"` |
| `data[].ask` | null \| string | no | Example: `"1.08462000"` |
| `data[].spread` | null \| integer | no | Ask minus bid, in points. Example: `12` |
| `data[].digits` | null \| integer | no | Decimal places the broker quotes this symbol to. Example: `5` |
| `data[].brokerTime` | null \| string | no | The last tick's time on the broker's own clock, as its terminal shows it. Not UTC. Example: `"2026-10-15 15:00:00.123"` |
| `data[].time` | null \| string (date-time) | no | The last tick's time, in UTC. Always given when there is a tick, closed market included. |
| `data[].observedAt` | string (date-time) | no | When the terminal was read. |
| `data[].ageMs` | null \| integer | no | How old the tick was when it was read. |
| `data[].stale` | boolean | yes | True only when the market is open (by the broker's sessions) and the last tick is more than 60 seconds old. A closed market's last price is not stale. Judge freshness for your own purposes from `time` and `ageMs`. |
| `data[].marketOpen` | null \| boolean | no | From the broker's own trading sessions. Null until the terminal has reported them (a minute or so after it first comes online). |
| `data[].tradeMode` | "full" \| "longOnly" \| "shortOnly" \| "closeOnly" \| "disabled" \| null | no | What the broker allows on this symbol right now, read with the price: `closeOnly` and `disabled` allow no new positions. Null for an unknown symbol. |