> For the complete documentation index, see [llms.txt](https://developer.collibra.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.collibra.com/tutorials/export-data-quality-and-observability-cloud-data-with-the-data-egress-api.md).

# Export Data Quality & Observability (cloud) data with the Data Egress API

In this tutorial you learn how to use the Data Egress API to bulk-export your Data Quality & Observability (cloud) results for use in BI tools, data pipelines, and integrations.

## Prerequisites

* `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW` permissions. Results are scoped to the jobs to which you have access.
* If you need access to all results regardless of resource permissions, ask your administrator to grant `DATA_QUALITY` combined with `VIEW_PERMISSIONS_VIEW_ALL` or `RESOURCE_MANAGE_ALL`.

## About the Data Egress API

The Data Egress API lets you stream your job, monitor, and rule results out of Data Quality & Observability (cloud) in a single unpaginated request. Use it to:

* Load results into a BI tool like Power BI or Tableau.
* Feed data into a data warehouse or data lake.
* Build integrations that surface scores or rule violations in external systems.
* Audit coverage across datasets by enriching results with your Collibra Catalog assets.

The API has two endpoints:

* `POST /egress/export`: streams the export.
* `GET /egress/manifest`: discovers available topics, fields, and filter operators.

The export is built around **topics**: `JOBS`, `MONITORS`, and `RULES`. You can join any connected combination of topics. To export all three together, omit the `topics` field from your request body, or omit the body entirely.

## Discover the available fields

Before making your first export, call `GET /egress/manifest` to see which topics, fields, and filter operators are available. Use the manifest to validate your filter logic before POSTing.

```bash
curl "https://{your-collibra-host}/rest/dq/1.0/egress/manifest" \
  -u "{username}:{password}"
```

## Available filters

Filters are optional predicates that narrow your export. Each filter targets a qualified field name in the format `<topic>.<fieldName>` and applies one operator. For example, `jobs.tableName` or `rules.ruleName`. All filters in a request are ANDed together.

### Operators

| Operator      | Use for                                                   | Example value                                  |
| ------------- | --------------------------------------------------------- | ---------------------------------------------- |
| `EQ`          | Exact match                                               | `"op": "EQ", "value": "CUSTOMER_ORDERS"`       |
| `NE`          | Exclude an exact value                                    | `"op": "NE", "value": "SKIPPED"`               |
| `IN`          | Match any value in a list                                 | `"op": "IN", "values": ["FAILED", "ERRORED"]`  |
| `NOT_IN`      | Exclude a list of values                                  | `"op": "NOT_IN", "values": ["SKIPPED"]`        |
| `LIKE`        | Pattern match (`%` = any characters, `_` = one character) | `"op": "LIKE", "value": "%null check%"`        |
| `GT` / `GTE`  | After / on or after a date or number                      | `"op": "GTE", "value": "2026-07-01T00:00:00Z"` |
| `LT` / `LTE`  | Before / on or before a date or number                    | `"op": "LTE", "value": "2026-07-31T23:59:59Z"` |
| `IS_NULL`     | Field has no value                                        | `"op": "IS_NULL"` (no `value` needed)          |
| `IS_NOT_NULL` | Field has a value                                         | `"op": "IS_NOT_NULL"` (no `value` needed)      |

Not every operator is valid for every field. For example, date fields support range operators but not `LIKE`. The manifest response lists the `allowedOperators` for each field.

### Commonly used fields

| Field                     | Topic    | Type      | Description                                  |
| ------------------------- | -------- | --------- | -------------------------------------------- |
| `jobs.tableName`          | JOBS     | String    | The name of the table the DQ job ran against |
| `jobs.updatedAt`          | JOBS     | Timestamp | When the job result was last updated         |
| `monitors.columnName`     | MONITORS | String    | The column the monitor targets               |
| `monitors.dimensionNames` | MONITORS | List      | Quality dimensions assigned to the monitor   |
| `monitors.updatedAt`      | MONITORS | Timestamp | When the monitor result was last updated     |
| `rules.ruleName`          | RULES    | String    | The name of the rule                         |
| `rules.ruleColumnName`    | RULES    | String    | The column the rule targets                  |
| `rules.dimensionNames`    | RULES    | List      | Quality dimensions assigned to the rule      |
| `rules.updatedAt`         | RULES    | Timestamp | When the rule result was last updated        |

{% hint style="info" %}
This table shows a representative subset. Call `GET /egress/manifest` to see the complete list of filterable fields and their allowed operators for your environment.
{% endhint %}

## Make your first export

{% stepper %}
{% step %}
Send a POST request to `/egress/export` with no request body. This exports all three topics (JOBS, MONITORS, and RULES) joined, for the last 90 days.

{% tabs %}
{% tab title="NDJSON" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export" \
  -u "{username}:{password}" \
  -H "Accept: application/x-ndjson" \
  --output dq-export.jsonl
```

{% endtab %}

{% tab title="CSV" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export" \
  -u "{username}:{password}" \
  -H "Accept: text/csv" \
  --output dq-export.csv
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
NDJSON preserves types (numbers, nulls) and is recommended for programmatic consumers. CSV uses qualified field names as column headers (for example, `rules.ruleName`) and is easier to open in spreadsheet tools. List-valued fields such as quality dimension names are pipe-delimited in CSV: `Completeness|Accuracy`.
{% endhint %}
{% endstep %}

{% step %}
Read the response as a stream, not a buffered document. For NDJSON, parse line by line. For CSV, read row by row.
{% endstep %}

{% step %}
Check for the completion marker at the end of the stream.

{% tabs %}
{% tab title="NDJSON" %}

```json
{"_complete": true, "rowCount": 4821}
```

{% endtab %}

{% tab title="CSV" %}

```csv
# complete rowCount=4821
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
If you reach end of stream without seeing the completion marker, the export is truncated. Retry the request. To disable the marker for CSV consumers that cannot handle comment lines, add `completionMarker=false` as a query parameter, but note that this removes truncation detection.
{% endhint %}
{% endstep %}
{% endstepper %}

## Common use cases

### Export results for a specific table

To get monitor results for a specific table over the last 30 days, add a filter and set the `window` query parameter.

{% code title="Request" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export?window=30" \
  -u "{username}:{password}" \
  -H "Accept: application/x-ndjson" \
  -H "Content-Type: application/json" \
  -d '{
    "topics": ["JOBS", "MONITORS"],
    "filters": [
      { "field": "jobs.tableName", "op": "EQ", "value": "CUSTOMER_ORDERS" }
    ]
  }'
```

{% endcode %}

### Filter rule results by date range

To export rule results for a specific time window, filter explicitly on `rules.updatedAt`. This overrides the default 90-day rolling window.

{% code title="Request" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export" \
  -u "{username}:{password}" \
  -H "Accept: application/x-ndjson" \
  -H "Content-Type: application/json" \
  -d '{
    "topics": ["JOBS", "RULES"],
    "filters": [
      { "field": "rules.updatedAt", "op": "GTE", "value": "2026-07-01T00:00:00Z" },
      { "field": "rules.updatedAt", "op": "LTE", "value": "2026-07-31T23:59:59Z" }
    ]
  }'
```

{% endcode %}

### Search for a rule by name

Use the `LIKE` operator with `%` wildcards for partial name matching.

{% code title="Request" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export" \
  -u "{username}:{password}" \
  -H "Accept: application/x-ndjson" \
  -H "Content-Type: application/json" \
  -d '{
    "topics": ["JOBS", "RULES"],
    "filters": [
      { "field": "rules.ruleName", "op": "LIKE", "value": "%null check%" }
    ]
  }'
```

{% endcode %}

{% hint style="info" %}
`LIKE` is case-sensitive. Use `%` to match any sequence of characters or `_` to match a single character. For example, `%null check%` matches any rule name that contains the phrase "null check".
{% endhint %}

### Enrich exports with Collibra Catalog assets

Set `includeCatalogAssets` to `true` to add Catalog `Table`, `Column`, and `Business Rule` assets to each row. This lets you join DQ results directly to your governed Catalog metadata.

{% code title="Request" %}

```bash
curl -X POST \
  "https://{your-collibra-host}/rest/dq/1.0/egress/export?includeCatalogAssets=true" \
  -u "{username}:{password}" \
  -H "Accept: application/x-ndjson"
```

{% endcode %}

{% hint style="info" %}
Catalog asset enrichment makes additional round-trips to DGC. Use `excludeColumnAssets` or `excludeRuleAssets` query parameters to omit specific enrichment groups if you only need table-level asset data.
{% endhint %}

### Additional resources

* [Data Egress API reference](/api/references/data-quality/data-egress.md)
