# Read via connector

Stream records from a registered connector or a stored Connection.

## When to use it

Read through a saved connection so credential rotation can happen without rewriting the recipe. Select the connector and its query, table, file, or stream options. A successful read can return no records; distinguish an empty result from a failed connection.

## Add and configure

1. Add **Read via connector** from the workflow step picker.
2. Give the step a recognisable name and connect its required inputs.
3. Set the options below. Nested names identify fields within an object or a list item.
4. Validate the recipe, inspect the test result, then run it on the intended data.

The step identifier used in the editor’s code view is `connector_read`.

## Settings

| Setting | Accepted value | Required | Default | What it controls |
| --- | --- | --- | --- | --- |
| Catalog Slug (`catalog_slug`) | string or null | No | null | Connection-backed form: the connection's catalog slug. |
| Config (`config`) | object | No | Not specified | — |
| Connection Id (`connection_id`) | string; format uuid or null | No | null | Connection-backed form: the stored Connection to read from. When set, the connector name + config/secrets are resolved from the connection's catalog_slug at run time. |
| Connector (`connector`) | string or null | No | null | Registered connector name (inline form). |
| Secrets (`secrets`) | object or null | No | null | Optional credentials for an inline connector. Prefer a saved connection so secrets stay in the credential form rather than the workflow definition. |
| Stream (`stream`) | string or null | No | null | The discovered stream to read, such as a database table. Leave unset to use the connector’s default. The selected stream must be supported by the provider. |

## Inputs and outputs

| Direction | Port | Content | Required | Multiple records |
| --- | --- | --- | --- | --- |
| Inputs | `in` | none | Yes | Yes |
| Outputs | `out` | records | Yes | Yes |

## Effects, testing, and recovery

Reads an external source.

The declared preview behaviour is to execute this step. Reads, processing, or model usage can therefore be real. Read [dry runs](/docs/workflows/dry-runs) before using a preview with live connections.

No duplicate-prevention key is declared for this step. Do not assume that manually repeating the step is free of repeated effects.

Batch processing is supported; the declared default slice is 500 records. Inspect completed slices before repeating a partial delivery.

## Example: Inline sample connector (25 synthetic records)

Step settings:

```json
{
  "config": {
    "mode": "auto",
    "record_count": 25
  },
  "connector": "sample"
}
```

## Example: Connection-backed read from a Postgres connection

Step settings:

```json
{
  "catalog_slug": "postgres",
  "connection_id": "11111111-1111-4111-8111-111111111111"
}
```

## Check the result

Inspect the selected run’s status, counts, errors, and output records. An empty collection can be a valid result, and a completed step can contain per-record failures where the step defines that behaviour. Check the next step’s expected record shape before publishing or delivering the result.
