Source: https://databento.com/docs/schemas/tbbo


# BBO on trade (TBBO)

**BBO on trade (TBBO)** provides every trade event alongside the BBO immediately *before* the effect of each trade. This is a subset of [MBP-1](https://databento.com/docs/schemas/mbp-1.md).

Databento groups this under [top of book](https://databento.com/docs/schemas/whats-a-schema.md#supported-schemas-and-their-fields) (L1).

### Fields (`tbbo`)

| Field | Type | Description |
| `ts_recv` | uint64\_t | The capture-server-received timestamp expressed as the number of nanoseconds since the UNIX epoch. See [ts_recv](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-recv). |
| `ts_event` | uint64\_t | The matching-engine-received timestamp expressed as the number of nanoseconds since the UNIX epoch. See [ts_event](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-event). |
| `rtype` | uint8\_t | A sentinel value indicating the record type. Always 1 in the TBBO schema. See [Rtype](https://databento.com/docs/conventions/common-fields-enums-types.md#rtype). |
| `publisher_id` | uint16\_t | The publisher ID assigned by Databento, which denotes the dataset and venue. See [Publishers](https://databento.com/docs/conventions/common-fields-enums-types.md#publishers-datasets-and-venues). |
| `instrument_id` | uint32\_t | The numeric instrument ID. See [Instrument identifiers](https://databento.com/docs/conventions/common-fields-enums-types.md#instrument-identifiers). |
| `action` | char | The event action. Always **T**rade in the TBBO schema. See [Action](https://databento.com/docs/conventions/common-fields-enums-types.md#action). |
| `side` | char | The side that initiates the trade. Can be **A**sk for a sell aggressor in a trade, **B**id for a buy aggressor in a trade, or **N**one where no side is specified. See [Side](https://databento.com/docs/conventions/common-fields-enums-types.md#side). |
| `depth` | uint8\_t | The book level where the update event occurred. |
| `price` | int64\_t | The order price where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `size` | uint32\_t | The order quantity. |
| `flags` | uint8\_t | A bit field indicating event end, message characteristics, and data quality. See [Flags](https://databento.com/docs/conventions/common-fields-enums-types.md#flags). |
| `ts_in_delta` | int32\_t | The matching-engine-sending timestamp expressed as the number of nanoseconds before `ts_recv`. See [ts_in_delta](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-in-delta). |
| `sequence` | uint32\_t | The message sequence number assigned at the venue. |
| `bid_px_00` | int64\_t | The bid price at the top level where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `ask_px_00` | int64\_t | The ask price at the top level where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `bid_sz_00` | uint32\_t | The bid size at the top level. |
| `ask_sz_00` | uint32\_t | The ask size at the top level. |
| `bid_ct_00` | uint32\_t | The bid order count at the top level. |
| `ask_ct_00` | uint32\_t | The ask order count at the top level. |

### Implementation differences between clients and encodings

Bid and ask depth messages (fields starting with `bid_` and `ask_`) are structured differently in the **C++ and Rust clients**, **the Python record interface**, and **JSON data**. Instead of using the `_N` suffix, they're stored in an array of structures named levels, with the top-of-book at index `0`.

For example, in C++, `levels[5].bid_px` corresponds to `bid_px_05` in the Python DataFrame API and CSV format.

> **See also**
>
> TBBO has many similarities to the MBP-1 and BBO schemas. The main distinction is that TBBO is in trade space, while MBP-1 is in book update space, and BBO is in time space. In particular, the `action` type of TBBO is always **T**rade. Learn about the differences between each in our [MBP-1 vs. TBBO vs. BBO schemas guide](https://databento.com/docs/faqs/difference-between-mbp-and-tbbo.md).

##### Consolidated BBO on trade (TCBBO)

**Consolidated BBO on trade (TCBBO)** provides every trade event alongside the consolidated BBO immediately *before* the effect of each trade. This is a subset of [CMBP-1](https://databento.com/docs/schemas/mbp-1.md#consolidated-market-by-price-cmbp-1).

### Fields (`tcbbo`)

| Field | Type | Description |
| `ts_recv` | uint64\_t | The capture-server-received timestamp expressed as the number of nanoseconds since the UNIX epoch. See [ts_recv](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-recv). |
| `ts_event` | uint64\_t | The matching-engine-received timestamp expressed as the number of nanoseconds since the UNIX epoch. See [ts_event](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-event). |
| `rtype` | uint8\_t | A sentinel value indicating the record type. Always 194 in the TCBBO schema. See [Rtype](https://databento.com/docs/conventions/common-fields-enums-types.md#rtype). |
| `publisher_id` | uint16\_t | The publisher ID indicating the venue where the trade executed on. See [Publishers](https://databento.com/docs/conventions/common-fields-enums-types.md#publishers-datasets-and-venues). |
| `instrument_id` | uint32\_t | The numeric instrument ID. See [Instrument identifiers](https://databento.com/docs/conventions/common-fields-enums-types.md#instrument-identifiers). |
| `action` | char | The event action. Always **T**rade in the TCBBO schema. See [Action](https://databento.com/docs/conventions/common-fields-enums-types.md#action). |
| `side` | char | The side that initiates the event. Can be **A**sk for a sell aggressor in a trade, **B**id for a buy aggressor in a trade, or **N**one where no side is specified. See [Side](https://databento.com/docs/conventions/common-fields-enums-types.md#side). |
| `price` | int64\_t | The order price where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `size` | uint32\_t | The order quantity. |
| `flags` | uint8\_t | A bit field indicating event end, message characteristics, and data quality. See [Flags](https://databento.com/docs/conventions/common-fields-enums-types.md#flags). |
| `ts_in_delta` | int32\_t | The matching-engine-sending timestamp expressed as the number of nanoseconds before `ts_recv`. See [ts_in_delta](https://databento.com/docs/conventions/common-fields-enums-types.md#ts-in-delta). |
| `bid_px_00` | int64\_t | The bid price at the top level where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `ask_px_00` | int64\_t | The ask price at the top level where every 1 unit corresponds to 1e-9, i.e. 1/1,000,000,000 or 0.000000001. See [Prices](https://databento.com/docs/conventions/common-fields-enums-types.md#prices). |
| `bid_sz_00` | uint32\_t | The bid size at the top level. |
| `ask_sz_00` | uint32\_t | The ask size at the top level. |
| `bid_pb_00` | uint16\_t | The publisher ID indicating the venue containing the best bid. See [Publishers](https://databento.com/docs/conventions/common-fields-enums-types.md#publishers-datasets-and-venues). |
| `ask_pb_00` | uint16\_t | The publisher ID indicating the venue containing the best ask. See [Publishers](https://databento.com/docs/conventions/common-fields-enums-types.md#publishers-datasets-and-venues). |

### TCBBO publisher

The `publisher_id` field will correspond to the venue the trade executed on.

`bid_pb_00` and `ask_pb_00` will represent the individual venues showing the NBBO.

### Implementation differences between clients and encodings

Bid and ask depth messages (fields starting with `bid_` and `ask_`) are structured differently in the **C++ and Rust clients**, **the Python record interface**, and **JSON data**. Instead of using the `_N` suffix, they're stored in an array of structures named levels, with the top-of-book at index `0`.

For example, in C++, `levels[5].bid_px` corresponds to `bid_px_05` in the Python DataFrame API and CSV format.

> **See also**
>
> TCBBO has many similarities to the CMBP-1 and CBBO schemas. The main distinction is that TCBBO is in trade space, while CMBP-1 is in book update space, and CBBO is in time space. In particular, the `action` type of TCBBO is always **T**rade. Learn about the differences between each in our [CMBP-1 vs. TCBBO vs. CBBO schemas guide](https://databento.com/docs/faqs/difference-between-mbp-and-tbbo.md).
