# Destination Type Reference for Rudder CLI


> Complete Rudder CLI reference for the supported destination types, their config keys, source types, and connection modes.



Every [destination spec](https://www.rudderstack.com/docs/rudder-cli/yaml-destinations/) names a `type`, and that type decides which `config` keys the spec accepts. This section documents those keys, one page per destination type.

The rules on this page apply to every type. The per-type pages cover only what's specific to that destination.

**Announcement**

**Destination support requires Rudder CLI v0.25.0 or later**. Some types need a later version — see the **Available since** column in [Supported destination types](#supported-destination-types).

Upgrade if you&#39;re using an earlier version.

## Supported destination types

Use the `type` value in YAML. Every type below takes `definition_version: 1`. The **Available since** column in the below table shows the release that made each type available.

The type pages document the latest release. For what changed in each release since a type became available, including breaking changes, see [Destination Type Changes by Release](https://www.rudderstack.com/docs/rudder-cli/destination-types/changes/).

On Rudder CLI v0.29.0 or later, `rudder-cli docs destination <type>` prints a type's keys, allowed values, defaults, secret keys, and connection modes as the release you run defines them. Add `--json` for JSON output.

| Destination | `type` | Available since | Config reference |
| --- | --- | --- | --- |
| [ActiveCampaign](https://www.rudderstack.com/docs/destinations/streaming-destinations/activecampaign/) | `active_campaign` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/activecampaign/) |
| [Adjust](https://www.rudderstack.com/docs/destinations/streaming-destinations/adjust/setup-guide/) | `adj` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/adjust/) |
| [Adobe Analytics](https://www.rudderstack.com/docs/destinations/streaming-destinations/adobe-analytics/setting-up-adobe-analytics-in-rudderstack/) | `adobe_analytics` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/adobe-analytics/) |
| [Amazon Kinesis](https://www.rudderstack.com/docs/destinations/streaming-destinations/amazon-kinesis/) | `kinesis` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/amazon-kinesis/) |
| [Amazon Redshift](https://www.rudderstack.com/docs/destinations/warehouse-destinations/redshift/) | `rs` | v0.27.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/amazon-redshift/) |
| [Amazon S3](https://www.rudderstack.com/docs/destinations/streaming-destinations/amazon-s3/) | `s3` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/amazon-s3/) |
| [Amplitude](https://www.rudderstack.com/docs/destinations/streaming-destinations/amplitude/setup-guide/) | `am` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/amplitude/) |
| [Apache Kafka](https://www.rudderstack.com/docs/destinations/streaming-destinations/kafka/) | `kafka` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/apache-kafka/) |
| [Attentive Tag](https://www.rudderstack.com/docs/destinations/streaming-destinations/attentive-tag/setup-guide/) | `attentive_tag` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/attentive-tag/) |
| [BigQuery](https://www.rudderstack.com/docs/destinations/warehouse-destinations/bigquery/) | `bq` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/bigquery/) |
| [BigQuery Stream](https://www.rudderstack.com/docs/destinations/streaming-destinations/bigquery-stream/) | `bqstream` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/bigquery-stream/) |
| [Braze](https://www.rudderstack.com/docs/destinations/streaming-destinations/braze/) | `braze` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/braze/) |
| [Confluent Cloud](https://www.rudderstack.com/docs/destinations/streaming-destinations/confluent-cloud/) | `confluent_cloud` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/confluent-cloud/) |
| [Customer.io](https://www.rudderstack.com/docs/destinations/streaming-destinations/customer-io/setup-guide/) | `customerio` | v0.27.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/customer-io/) |
| [Facebook Conversions](https://www.rudderstack.com/docs/destinations/streaming-destinations/fb-conversions/setup-guide/) | `facebook_conversions` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/facebook-conversions/) |
| [Facebook Pixel](https://www.rudderstack.com/docs/destinations/streaming-destinations/fb-pixel/setup-guide/) | `facebook_pixel` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/facebook-pixel/) |
| [Firebase](https://www.rudderstack.com/docs/destinations/streaming-destinations/firebase/) | `firebase` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/firebase/) |
| [Google Ads](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-ads/setup-guide/) | `googleads` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-ads/) |
| [Google Analytics](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-analytics-ga/) | `ga` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-analytics/) |
| [Google Analytics 4](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-analytics-4/setup-guide/) | `ga4` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-analytics-4/) |
| [Google Cloud Pub/Sub](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-pub-sub/) | `googlepubsub` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-cloud-pub-sub/) |
| [Google Cloud Storage](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-cloud-storage/) | `gcs` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-cloud-storage/) |
| [Google Sheets](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-sheets/) | `googlesheets` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-sheets/) |
| [Google Tag Manager](https://www.rudderstack.com/docs/destinations/streaming-destinations/google-tag-manager/setup-guide/) | `gtm` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-tag-manager/) |
| [HTTP Webhook](https://www.rudderstack.com/docs/destinations/http-webhook/setup-guide/) | `http` | v0.25.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/http-webhook/) |
| [HubSpot](https://www.rudderstack.com/docs/destinations/streaming-destinations/hubspot/setup-guide/) | `hs` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/hubspot/) |
| [Intercom](https://www.rudderstack.com/docs/destinations/streaming-destinations/intercom/) | `intercom` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/intercom/) |
| [Iterable](https://www.rudderstack.com/docs/destinations/streaming-destinations/iterable/setting-up-iterable/) | `iterable` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/iterable/) |
| [LinkedIn Insight Tag](https://www.rudderstack.com/docs/destinations/streaming-destinations/linkedin-insight-tag/) | `linkedin_insight_tag` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/linkedin-insight-tag/) |
| [Marketo](https://www.rudderstack.com/docs/destinations/streaming-destinations/marketo/) | `marketo` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/marketo/) |
| [Mixpanel](https://www.rudderstack.com/docs/destinations/streaming-destinations/mixpanel/setup-guide/) | `mp` | v0.27.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/mixpanel/) |
| [PostgreSQL](https://www.rudderstack.com/docs/destinations/warehouse-destinations/postgresql/) | `postgres` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/postgresql/) |
| [PostHog](https://www.rudderstack.com/docs/destinations/streaming-destinations/posthog/setting-up-posthog/) | `posthog` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/posthog/) |
| [Qualtrics](https://www.rudderstack.com/docs/destinations/streaming-destinations/qualtrics/) | `qualtrics` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/qualtrics/) |
| [Redis](https://www.rudderstack.com/docs/destinations/streaming-destinations/redis/) | `redis` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/redis/) |
| [S3 Data Lake](https://www.rudderstack.com/docs/destinations/warehouse-destinations/s3-datalake/) | `s3_datalake` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/s3-data-lake/) |
| [Salesforce](https://www.rudderstack.com/docs/destinations/streaming-destinations/salesforce/setup-guide/) | `salesforce` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/salesforce/) |
| [Sentry](https://www.rudderstack.com/docs/destinations/streaming-destinations/sentry/) | `sentry` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/sentry/) |
| [Slack](https://www.rudderstack.com/docs/destinations/streaming-destinations/slack/) | `slack` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/slack/) |
| [Snowflake](https://www.rudderstack.com/docs/destinations/warehouse-destinations/snowflake/) | `snowflake` | v0.27.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/snowflake/) |
| [Snowflake Streaming](https://www.rudderstack.com/docs/destinations/warehouse-destinations/snowflake-streaming/) | `snowpipe_streaming` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/snowflake-streaming/) |
| [Statsig](https://www.rudderstack.com/docs/destinations/streaming-destinations/statsig/) | `statsig` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/statsig/) |
| [TikTok Ads](https://www.rudderstack.com/docs/destinations/streaming-destinations/tiktok-ads/setup/) | `tiktok_ads` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/tiktok-ads/) |
| [VWO](https://www.rudderstack.com/docs/destinations/streaming-destinations/vwo/) | `vwo` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/vwo/) |
| [Webhook](https://www.rudderstack.com/docs/destinations/webhooks/setup-guide/) | `webhook` | v0.26.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/webhook/) |
| [Zendesk](https://www.rudderstack.com/docs/destinations/streaming-destinations/zendesk/) | `zendesk` | v0.29.0 | [Config reference](https://www.rudderstack.com/docs/rudder-cli/destination-types/zendesk/) |

**Info**

**Important considerations**

- Rudder CLI rejects any `type` outside this [table](https://www.rudderstack.com/docs/rudder-cli/destination-types/#supported-destination-types). You can define more destinations in the RudderStack dashboard than what you can define in Rudder CLI.
- To start from a destination you already configured in the dashboard, run `rudder-cli import workspace` — the imported YAML uses the same keys these pages document. See [How to Import Workspace Resources](https://www.rudderstack.com/docs/rudder-cli/import-resources/) for more information.

## Config key rules

These rules hold for every destination type.

### Keys are snake_case

Local YAML uses snake_case config keys. Rudder CLI converts them to the API's camelCase at apply time. A camelCase key in the spec is treated as an unknown key.

### Unknown keys fail validation

`config` accepts only the keys its type declares. Anything else fails `rudder-cli validate` with:

```text
unknown config field "<key>"
```

A key that's valid for one destination type isn't valid for another. There are no shared optional extras beyond `connection_mode` and `consent_management`.

### Keys from a later release

The type pages document the latest release, so a key on a page can be newer than the Rudder CLI release you run. An earlier release doesn't know such a key:

- It rejects the key in a spec with `unknown config field "<key>"`
- It leaves the key out when it imports the destination
- An update it applies removes the key from the destination, even when the key was set in the RudderStack dashboard, because an update sends the destination's whole config

Upgrade before you manage a destination that uses such a key. [Destination Type Changes by Release](https://www.rudderstack.com/docs/rudder-cli/destination-types/changes/) lists what each release added and changed.

### Omitting a key with a default is safe

Where a key declares a default, Rudder CLI fills that value in before it validates the spec and before the spec reaches the API, because the backend applies the same default when it stores the destination. Omitting such a key is equivalent to writing its default: it doesn't produce a permanent diff on the next `apply`, and it's validated as though you had written the default — which can make another key required.

A default inside a nested block, like Amplitude's `sdk_version.web`, fills in only when the spec writes that block. Omit the whole block and nothing is sent for it.

Keys without a default are sent only when you set them.

### Some keys can't change after the first apply

A key marked **immutable** on a type page is fixed once the destination exists. The API rejects an update that changes it.

**Warning:** Rudder CLI doesn&#39;t check immutability locally. `validate` accepts the change and `apply` sends it, so the failure surfaces at the API rather than in your pull request. To change an immutable key, create a new destination instead.

### Some keys aren't in the dashboard

A key marked **internal** on a type page isn't surfaced by the RudderStack dashboard. Rudder CLI accepts it so that an existing value survives an update, and so that a spec you import round-trips unchanged. Set it only if you know your destination needs it.

## Source types

A destination declares the source types it accepts events from. Each type page lists its own set, drawn from the tokens below.

| Source type | Sources that resolve to it |
| :-----| :-----|
| `web` | JavaScript SDK |
| `android` | Android SDK |
| `android_kotlin` | Android Kotlin SDK |
| `ios` | iOS SDK |
| `ios_swift` | iOS Swift SDK |
| `react_native` | React Native SDK |
| `flutter` | Flutter SDK |
| `cordova` | Cordova SDK |
| `unity` | Unity SDK |
| `amp` | AMP Analytics |
| `shopify` | Shopify |
| `cloud` | Webhook sources and every server-side SDK — Node.js, Python, Go, Java, Ruby, PHP, .NET, Rust |
| `cloud_source` | [Cloud app sources](https://www.rudderstack.com/docs/sources/event-streams/cloud-apps/) |
| `warehouse` | [Reverse ETL sources](https://www.rudderstack.com/docs/sources/reverse-etl/) |

A source's own definition resolves to exactly one token. Note that `cloud` and `cloud_source` are different tokens: a webhook or server-side SDK source resolves to `cloud`, while a cloud app source resolves to `cloud_source`.

## Connection modes

A connection mode describes how a given **source type** connecting to **this destination instance** routes its events:

| Connection mode | Description |
| :----| :----|
| `cloud` | The SDK sends events to RudderStack, which forwards them to the destination from its servers. |
| `device` | The SDK loads the destination's own SDK and sends events to it directly from the device or browser. |
| `hybrid` | Both at once — RudderStack forwards events from its servers, and also loads the destination's SDK for the features that need it, like in-app messages and push notifications. <br /><br />**Info:** This mode is supported by [ActiveCampaign](https://www.rudderstack.com/docs/rudder-cli/destination-types/activecampaign/), [Braze](https://www.rudderstack.com/docs/rudder-cli/destination-types/braze/), and [Google Analytics 4](https://www.rudderstack.com/docs/rudder-cli/destination-types/google-analytics-4/) on some source types. |

Note that:

- The connection mode is a property of the source-destination pair, not of the source or the destination alone.
- Two destinations fed by the same source can run in different modes.
- A source type supported in `device` or `hybrid` mode by one destination may be `cloud`-only on another.

For more information, see [RudderStack Connection Modes](https://www.rudderstack.com/docs/destinations/rudderstack-connection-modes/).

### Where the mode is declared

`connection_mode` lives in the destination's `config` block, keyed by local source type — not on the [connection spec](https://www.rudderstack.com/docs/rudder-cli/yaml-connections/).

```yaml
config:
  connection_mode:
    web: device
    android_kotlin: cloud
```

Naming a source type the destination doesn't support fails validation, and so does a mode that source type doesn't support on this destination.

An entry is required for every source type you connect. Without one, `validate` reports:

```text
destination '<id>' config has no 'connection_mode' entry for source type '<source_type>'
```

**Warning**

**After you upgrade to v0.28.0, check destinations that already have a Reverse ETL connection**

If you imported a destination with Rudder CLI v0.27.0 or earlier, its spec can be missing the `warehouse` entries that the dashboard adds when you connect a Reverse ETL source. On v0.28.0 or later, Rudder CLI plans an update that removes those entries from the workspace destination, and `apply` strips them along with any `warehouse` consent settings.

This affects ActiveCampaign, Amazon S3, Amplitude, Attentive Tag, BigQuery Stream, Braze, Customer.io, Facebook Conversions, Facebook Pixel, Google Analytics 4, Google Cloud Storage, HubSpot, Iterable, Mixpanel, PostHog, TikTok Ads, and Webhook destinations.

After you upgrade and before your next `apply`, add the `warehouse` entry to `connection_mode` in the destination&#39;s spec, and to `consent_management` if the workspace destination has consent settings for it. Then, run `apply --dry-run` and confirm that the plan no longer lists the destination as updated.

## Consent management

`consent_management` is accepted by every destination type, keyed by local source type. Each source type maps to an array of consent entries.

```yaml
config:
  consent_management:
    web:
      - provider: oneTrust
        consents:
          - analytics
          - marketing
    react_native:
      - provider: custom
        resolution_strategy: and
        consents:
          - analytics
```

| Field | Required | Value |
| :-----| :-----| :-----|
| `provider` | Yes | One of `custom`, `iubenda`, `ketch`, `oneTrust` |
| `resolution_strategy` | When `provider` is `custom` | `and` or `or` |
| `consents` | No | Array of consent category strings |

Within one source type's array, each `provider` can appear at most once. Only source types the destination supports are allowed.

Each consent string must be at most 100 characters, unless it's written as a `{{ path || fallback }}` template, which is accepted at any length.

A plain value over the limit reports `'consent' must be at most 100 characters`.

For the feature itself, see [Consent Management in RudderStack](https://www.rudderstack.com/docs/data-governance/consent-management/overview/).

## Secrets

Each type page lists the keys Rudder CLI treats as secrets. Write each one you use as a `{{ .VARIABLE_NAME }}` reference rather than a literal, and supply the value from the environment, prefixed with `RUDDER_`, or from a var file:

```bash
export RUDDER_BRAZE_REST_API_KEY="..."
rudder-cli apply

# or
rudder-cli apply --var-file secrets.vars.yaml
```

Note that:

- `validate` substitutes variables too, so every variable a spec references must be set when you run it. An undefined one stops the run.
- `validate` warns when a secret key holds anything but one `{{ .VAR }}` reference with no default, and when one variable fills two secret keys. It masks secret values in the lines it prints.
- Rudder CLI substitutes each value into the YAML before parsing it. A value containing double quotes, such as a JSON key file, needs a single-quoted reference, `'{{ .VAR }}'`, and a single quote in a value that fills one is written as `''`. A multi-line value, like a PEM key, keeps its line breaks when it fills a quoted reference, in either quote style. In a var file, write it as a YAML literal block. The type pages show the form where a key needs it.
- `rudder-cli import` writes a secret only when the API returns its value, and the API doesn't return every secret. A returned secret is written as a single-quoted reference named after the spec `id` and the key, upper-cased with `-` turned into `_` — for example, `app_key` on a destination imported as `braze-prod` becomes `'{{ .BRAZE_PROD_APP_KEY }}'` — and listed in a `secrets.vars.yaml` file next to the imported specs for you to fill in. A secret the API doesn't return, such as BigQuery's `credentials`, is left out of the spec, so add it yourself before you apply.

See [How to Use Variable Substitution in Rudder CLI](https://www.rudderstack.com/docs/rudder-cli/variable-substitution/).

## See more

- [Destination YAML Reference](https://www.rudderstack.com/docs/rudder-cli/yaml-destinations/) for the spec envelope — `id`, `display_name`, `type`, `definition_version`, `enabled`, `transformation`
- [Manage Destinations using Rudder CLI](https://www.rudderstack.com/docs/rudder-cli/destinations/) for the feature overview
- [End-to-End Walkthrough: Destinations with Rudder CLI](https://www.rudderstack.com/docs/rudder-cli/destinations-walkthrough/) for step-by-step setup
- [Connection YAML Reference](https://www.rudderstack.com/docs/rudder-cli/yaml-connections/) to link a destination to a source

