> ## Documentation Index
> Fetch the complete documentation index at: https://octo-98895abd.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Cash instruments

> One endpoint per B3 cash instrument type — equities, BDRs, units, fund quotas and other cash paper, each with both lot sizes.

### Overview

[`quotes`](/api-docs/quotes) is the whole cash tape. These endpoints are the same rows split by instrument type, so you can ask for one class without filtering client-side.

| Endpoint | Instrument type | What it holds |
| - | - | - |
| `GET /equities` | `equity` | Ordinary and preferred shares (`especi` `ON*` / `PN*`) |
| `GET /bdrs` | `bdr` | Brazilian Depositary Receipts (`especi` `DR*`) |
| `GET /units` | `unit` | Units — bundled share packages (`especi` `UNT*`) |
| `GET /fund_quotas` | `fund_quota` | Listed fund quotas: ETFs, FIIs and other `CI*` paper |
| `GET /cash_securities` | `cash_security` | The residual. Subscription rights, bonus rights and index lines were split out in catalog v12 and are no longer here |
| `GET /auctions` | `auction` | Auction prints (`tpmerc` `017`), \~210 on the whole 2019–2026 tape. Same columns as `quotes`, minus `lot` / `share_class` / `fund_type`. Events, not a series — never compute returns over them |

The type comes from `vw_b3_instrument_typed`, which classifies **only** from B3's published `TPMERC` and `ESPECI`. Nothing is inferred from a ticker's shape.

`fund_quotas` rows carry **`fund_type`** — `etf` | `fii` | `fidc` | `fiagro` — from B3's published CODBDI (14 → etf, 05/12 → fii, 13 → fiagro), validated against the CVM ETF registry. `NULL` on boards that carry no family signal, never guessed from the ticker:

```
/fund_quotas?fund_type=eq.etf&lot=eq.standard
```

`equities` rows carry **`share_class`** (`ON` | `PN` | `PNA` | `PNB` | `PNC` | `PND`) and **`governance_segment`** (`NM` | `N1` | `N2` | `MA` | `M2` | `MB`), parsed from ESPECI and cross-checked against the ISIN class code — never inferred from the ticker's `3`/`4` suffix:

```
/equities?share_class=eq.ON&governance_segment=eq.NM&lot=eq.standard
```

### Lot size is part of the grain

These endpoints carry **both lot sizes**, with `lot` derived from `tpmerc`:

* `standard` — `tpmerc` `010`, the round lot
* `odd` — `tpmerc` `020` / `021`, the fractional market

The grain is **`(ticker, trade_date, board, term_days, lot)`** — one column wider than `quotes`. A query that ignores `lot` sees what look like duplicate dates.

<Warning>
  **Odd lot is not a rounding error.** Measured 2026-08-27, equities carry *more* odd-lot rows than standard-lot — 153,072 against 140,227, across 496 codnegs versus 476. Summing `volume` without pinning `lot` double-counts. For round lots only: `?lot=eq.standard`.
</Warning>

`api.quotes` is unchanged — still `tpmerc = 010` only. These endpoints are additive.

### Columns

Identical to [`quotes`](/api-docs/quotes) plus `lot` (and `share_class` + `governance_segment` on `equities`, `fund_type` on `fund_quotas`), minus `asset_class` — the endpoint *is* the type. Everything is unadjusted.

<CodeGroup>
  ```bash curl theme={null}
  curl -s -G "$SILO_URL/equities" \
    -H "apikey: $SILO_ANON_KEY" \
    --data-urlencode "select=ticker,trade_date,lot,close,volume" \
    --data-urlencode "lot=eq.standard" \
    --data-urlencode "trade_date=eq.2026-08-25" \
    --data-urlencode "order=volume.desc" \
    --data-urlencode "limit=5"
  ```

  ```python Python theme={null}
  params = {
      "select": "ticker,trade_date,lot,close,volume",
      "lot": "eq.standard",
      "trade_date": "eq.2026-08-25",
      "order": "volume.desc",
      "limit": 5,
  }
  rows = requests.get(f"{URL}/equities", headers=H, params=params).json()
  ```

  ```javascript JavaScript theme={null}
  const { data } = await supabase
    .from('equities')
    .select('ticker, trade_date, lot, close, volume')
    .eq('lot', 'standard')
    .eq('trade_date', '2026-08-25')
    .order('volume', { ascending: false })
    .limit(5)
  ```
</CodeGroup>

### Price series stay unified

There is deliberately **no** `equity_history` or `bdr_history`. A codneg belongs to exactly one instrument type, so [`quote_history('PETR4')`](/api-docs/quotes) is already unambiguous — and a typed history would force you to determine the type *before* you could ask for a price. Split the cross-section; keep whatever is keyed by id.

The same rule is why [options](/api-docs/options) and [termo](/api-docs/termo) *do* get their own history endpoints: those carry columns the cash shape has no room for.

### Empty and error behavior

* **No rows matching your filter → `200 []`.** Never a fabricated price.
* **A ticker on the wrong endpoint → `200 []`.** `BOVA11` is a `fund_quota`, not an `equity`. Use `/quotes`, which is untyped, or [`lookup`](/api-docs/lookup), which reports the type it resolved.
* **These views have no built-in cap** — always send a `limit`.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.