> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getcollate.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Ingest Exposures from dbt | Downstream Lineage Guide

> Ingest dbt exposures to extend lineage from your dbt models to the dashboards, ML models, and API endpoints that consume them.

# Ingest Exposures from dbt

Collate reads dbt [exposures](https://docs.getdbt.com/docs/build/exposures) from your `manifest.json` file and uses them to extend lineage from your dbt models to the dashboards, ML models, and API endpoints that consume them.

<Tip>
  **Tip**: The downstream entity referenced by an exposure must already exist in Collate before the dbt ingestion runs. Collate matches it by Fully Qualified Name (FQN). If Collate can't find a match, it logs a warning and skips the exposure.
</Tip>

## Supported Exposure Types

Collate maps each dbt exposure to a Collate entity based on its `type` field. Any other `type` value is skipped during ingestion.

| dbt Exposure `type` | Collate Entity |
| :------------------ | :------------- |
| `dashboard`         | Dashboard      |
| `ml`                | ML Model       |
| `application`       | API Endpoint   |

## How to Ingest dbt Exposures

Follow these steps to link a dbt exposure to an existing Collate entity.

### Step 1: Define the Exposure in Your dbt Project

Add the exposure definition to your dbt project and set the FQN of the matching Collate entity.

Define the exposure in your dbt project (for example in `models/exposures.yml`) and set `meta.open_metadata_fqn` to the Fully Qualified Name of the corresponding entity already ingested in Collate.

For more information on defining exposures, see [Add Exposures to your DAG](https://docs.getdbt.com/docs/build/exposures).

```yaml theme={null}
exposures:
  - name: orders_dashboard
    label: orders
    type: dashboard
    maturity: high
    url: http://localhost:8080/looker/dashboard/8/
    description: >
      Orders dashboard built on top of the orders model.
    depends_on:
      - ref('fact_sales')
    meta:
      open_metadata_fqn: sample_looker.orders  # Collate entity Fully Qualified Name
```

After adding the exposure, run your dbt workflow (`dbt compile` or `dbt run`). The generated `manifest.json` will include the exposure under the `exposures` key, with upstream models listed under `depends_on → nodes`:

```json theme={null}
"exposure.jaffle_shop.orders_dashboard": {
  "name": "orders_dashboard",
  "resource_type": "exposure",
  "type": "dashboard",
  "meta": {
    "open_metadata_fqn": "sample_looker.orders"
  },
  "depends_on": {
    "nodes": [
      "model.jaffle_shop.fact_sales"
    ]
  }
}
```

### Step 2: Verify

Confirm the linked entity appears as a downstream node in the lineage graph after ingestion completes.

Once ingested, the linked dashboard, ML model, or API endpoint appears as a downstream node in the **Lineage** tab of the upstream dbt table listed under `depends_on`.

## Validation and Error Handling

What Collate does when an exposure can't be linked to a Collate entity.

| Scenario                                                      | Behavior                                 |
| ------------------------------------------------------------- | ---------------------------------------- |
| Exposure `type` not one of `dashboard`, `ml`, `application`   | Warning logged, exposure skipped         |
| `meta.open_metadata_fqn` missing from exposure spec           | Warning logged, exposure skipped         |
| Entity referenced by `open_metadata_fqn` not found in Collate | Warning logged, exposure skipped         |
| Upstream model not yet ingested as a Collate table            | Upstream node excluded from lineage edge |
