# Destination Type Reference for Rudder CLI

<p>Every <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-destinations/" >destination spec</a> names a <code>type</code>, and that type decides which <code>config</code> keys the spec accepts. This section documents those keys, one page per destination type.</p>
<p>The rules on this page apply to every type. The per-type pages cover only what&rsquo;s specific to that destination.</p>

<blockquote class="announcement">
  <div class="tip-quote">
    
    <div class="tip-text"><p><strong>Destination support requires Rudder CLI v0.25.0 or later</strong>.</p>
<p>Upgrade if you&rsquo;re using an earlier version.</p>
</div>
  </div>
</blockquote>

<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="supported-destination-types">Supported destination types</h2><p>Use the <code>type</code> value in YAML. Every type below takes <code>definition_version: 1</code>.</p>
<table>
<thead>
<tr>
<th>Destination</th>
<th><code>type</code></th>
<th>Config reference</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/activecampaign/" >ActiveCampaign</a></td>
<td><code>active_campaign</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/redshift/" >Amazon Redshift</a></td>
<td><code>rs</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/amazon-s3/" >Amazon S3</a></td>
<td><code>s3</code></td>
<td><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/amazon-s3/" >Amazon S3 Destination Config Reference</a></td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/amplitude/setup-guide/" >Amplitude</a></td>
<td><code>am</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/attentive-tag/setup-guide/" >Attentive Tag</a></td>
<td><code>attentive_tag</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/bigquery-stream/" >BigQuery Stream</a></td>
<td><code>bqstream</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/braze/" >Braze</a></td>
<td><code>braze</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/customer-io/setup-guide/" >Customer.io</a></td>
<td><code>customerio</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/fb-conversions/setup-guide/" >Facebook Conversions</a></td>
<td><code>facebook_conversions</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/fb-pixel/setup-guide/" >Facebook Pixel</a></td>
<td><code>facebook_pixel</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/google-ads/setup-guide/" >Google Ads</a></td>
<td><code>googleads</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/google-analytics-4/setup-guide/" >Google Analytics 4</a></td>
<td><code>ga4</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/bigquery/" >Google BigQuery</a></td>
<td><code>bq</code></td>
<td><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/google-bigquery/" >Google BigQuery Destination Config Reference</a></td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/google-cloud-storage/" >Google Cloud Storage</a></td>
<td><code>gcs</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/http-webhook/setup-guide/" >HTTP Webhook</a></td>
<td><code>http</code></td>
<td><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destination-types/http-webhook/" >HTTP Webhook Destination Config Reference</a></td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/hubspot/setup-guide/" >HubSpot</a></td>
<td><code>hs</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/iterable/setting-up-iterable/" >Iterable</a></td>
<td><code>iterable</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/mixpanel/setup-guide/" >Mixpanel</a></td>
<td><code>mp</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/postgresql/" >PostgreSQL</a></td>
<td><code>postgres</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/posthog/setting-up-posthog/" >PostHog</a></td>
<td><code>posthog</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/s3-datalake/" >S3 Data Lake</a></td>
<td><code>s3_datalake</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/snowflake/" >Snowflake</a></td>
<td><code>snowflake</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/streaming-destinations/tiktok-ads/setup/" >TikTok Ads</a></td>
<td><code>tiktok_ads</code></td>
<td>Not yet documented</td>
</tr>
<tr>
<td><a href="https://www.rudderstack.com/docs/destinations/webhooks/setup-guide/" >Webhook</a></td>
<td><code>webhook</code></td>
<td>Not yet documented</td>
</tr>
</tbody>
</table>
<p>Rudder CLI rejects any <code>type</code> outside this table. The dashboard catalog is larger than what you can define in CLI YAML.</p>
<p>Config reference pages are being added type by type. For a type marked <strong>Not yet documented</strong>, configure the destination in the dashboard and run <code>rudder-cli import workspace</code> — the imported YAML shows the exact key names for that type. See <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/import-resources/" >How to Import Workspace Resources</a>.</p>

<html lang="en">
<blockquote class="info">
  <div class="tip-quote">
    
    <div class="tip-text">Unverified destinations will be supported in the next iteration.</div>
  </div>
</blockquote>

</html>

<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="config-key-rules">Config key rules</h2><p>These rules hold for every destination type.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="keys-are-snake_case">Keys are snake_case</h3><p>Local YAML uses snake_case config keys. Rudder CLI converts them to the API&rsquo;s camelCase at apply time. A camelCase key in the spec is treated as an unknown key.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="unknown-keys-fail-validation">Unknown keys fail validation</h3><p><code>config</code> accepts only the keys its type declares. Anything else fails <code>rudder-cli validate</code> with:</p>
<div class="rs-code">
  <div class="rs-code__head"><button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">unknown config field &#34;&lt;key&gt;&#34;</code></pre></div>
</div>
<p>A key that&rsquo;s valid for one destination type isn&rsquo;t valid for another. There are no shared optional extras beyond <code>connection_mode</code> and <code>consent_management</code>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="omitting-a-key-with-a-default-is-safe">Omitting a key with a default is safe</h3><p>Where a key declares a default, Rudder CLI fills that value in 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&rsquo;t produce a permanent diff on the next <code>plan</code> or <code>apply</code>.</p>
<p>Keys without a default are sent only when you set them.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="some-keys-cant-change-after-the-first-apply">Some keys can&rsquo;t change after the first apply</h3><p>A key marked <strong>immutable</strong> on a type page is fixed once the destination exists. The API rejects an update that changes it.</p>

<blockquote class="warning">
  <div class="tip-quote">
    
    <div class="tip-text">Rudder CLI doesn&rsquo;t check immutability locally. <code>validate</code> accepts the change and <code>apply</code> 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.</div>
  </div>
</blockquote>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="source-types">Source types</h2><p>A destination declares the source types it accepts events from. Each type page lists its own set, drawn from the tokens below.</p>
<table>
<thead>
<tr>
<th>Source type</th>
<th>Sources that resolve to it</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>web</code></td>
<td>JavaScript SDK</td>
</tr>
<tr>
<td><code>android</code></td>
<td>Android SDK</td>
</tr>
<tr>
<td><code>android_kotlin</code></td>
<td>Android Kotlin SDK</td>
</tr>
<tr>
<td><code>ios</code></td>
<td>iOS SDK</td>
</tr>
<tr>
<td><code>ios_swift</code></td>
<td>iOS Swift SDK</td>
</tr>
<tr>
<td><code>react_native</code></td>
<td>React Native SDK</td>
</tr>
<tr>
<td><code>flutter</code></td>
<td>Flutter SDK</td>
</tr>
<tr>
<td><code>cordova</code></td>
<td>Cordova SDK</td>
</tr>
<tr>
<td><code>unity</code></td>
<td>Unity SDK</td>
</tr>
<tr>
<td><code>amp</code></td>
<td>AMP Analytics</td>
</tr>
<tr>
<td><code>shopify</code></td>
<td>Shopify</td>
</tr>
<tr>
<td><code>cloud</code></td>
<td>Webhook sources and every server-side SDK — Node.js, Python, Go, Java, Ruby, PHP, .NET, Rust</td>
</tr>
<tr>
<td><code>cloud_source</code></td>
<td><a href="https://www.rudderstack.com/docs/sources/event-streams/cloud-apps/" >Cloud app sources</a></td>
</tr>
<tr>
<td><code>warehouse</code></td>
<td><a href="https://www.rudderstack.com/docs/sources/reverse-etl/" >Reverse ETL sources</a></td>
</tr>
</tbody>
</table>
<p>A source&rsquo;s own definition resolves to exactly one token. Note that <code>cloud</code> and <code>cloud_source</code> are different tokens: a webhook or server-side SDK source resolves to <code>cloud</code>, while a cloud app source resolves to <code>cloud_source</code>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="connection-modes">Connection modes</h2><p>A connection mode describes how a given <strong>source type</strong> connecting to <strong>this destination instance</strong> routes its events:</p>
<ul>
<li><code>cloud</code> — the SDK sends events to RudderStack, which forwards them to the destination from its servers.</li>
<li><code>device</code> — the SDK loads the destination&rsquo;s own SDK and sends events to it directly from the device or browser.</li>
</ul>
<p>The mode is a property of the pair, not of the source or the destination alone. Two destinations fed by the same source can run in different modes, and a source type supported in <code>device</code> mode by one destination may be <code>cloud</code>-only on another.</p>
<p>For the concept in full, see <a href="https://www.rudderstack.com/docs/destinations/rudderstack-connection-modes/" >RudderStack Connection Modes</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="where-the-mode-is-declared">Where the mode is declared</h3><p><code>connection_mode</code> lives in the destination&rsquo;s <code>config</code> block, keyed by local source type — not on the <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-connections/" >connection spec</a>.</p>
<div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">config:
  connection_mode:
    web: device
    android_kotlin: cloud</code></pre></div>
</div>
<p>Naming a source type the destination doesn&rsquo;t support fails validation, and so does a mode that source type doesn&rsquo;t support on this destination.</p>
<p>An entry is required for every source type you connect. Without one, <code>validate</code> reports:</p>
<div class="rs-code">
  <div class="rs-code__head"><button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-text" data-lang="text">destination &#39;&lt;id&gt;&#39; config has no &#39;connection_mode&#39; entry for source type &#39;&lt;source_type&gt;&#39;</code></pre></div>
</div>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="consent-management">Consent management</h2><p><code>consent_management</code> is accepted by every destination type, keyed by local source type. Each source type maps to an array of consent entries.</p>
<div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">config:
  consent_management:
    web:
      - provider: oneTrust
        consents:
          - analytics
          - marketing
    react_native:
      - provider: custom
        resolution_strategy: and
        consents:
          - analytics</code></pre></div>
</div>
<table>
<thead>
<tr>
<th>Field</th>
<th>Required</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>provider</code></td>
<td>Yes</td>
<td>One of <code>custom</code>, <code>iubenda</code>, <code>ketch</code>, <code>oneTrust</code></td>
</tr>
<tr>
<td><code>resolution_strategy</code></td>
<td>When <code>provider</code> is <code>custom</code></td>
<td><code>and</code> or <code>or</code></td>
</tr>
<tr>
<td><code>consents</code></td>
<td>No</td>
<td>Array of consent category strings</td>
</tr>
</tbody>
</table>
<p>Within one source type&rsquo;s array, each <code>provider</code> can appear at most once. Only source types the destination supports are allowed.</p>
<p>Each consent string must be at most 100 characters, unless it&rsquo;s written as a <code>{{ path || fallback }}</code> template, which is accepted at any length.</p>
<p>A plain value over the limit reports <code>'consent' must be at most 100 characters</code>.</p>
<p>For the feature itself, see <a href="https://www.rudderstack.com/docs/data-governance/consent-management/overview/" >Consent Management in RudderStack</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="secrets">Secrets</h2><p>Each type page lists the keys Rudder CLI treats as secrets. Write them as <code>{{ .VARIABLE_NAME }}</code> references rather than literals, and supply the values at apply time:</p>
<div class="rs-code">
  <div class="rs-code__head">bash<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">rudder-cli apply --var-file secrets.vars.yaml</code></pre></div>
</div>
<p><code>rudder-cli import</code> writes secret keys back as <code>{{ .VAR }}</code> placeholders rather than values, since the API doesn&rsquo;t return secrets. Fill the placeholders in before the first apply.</p>
<p>See <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/variable-substitution/" >How to Use Variable Substitution in Rudder CLI</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="see-more">See more</h2><ul>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-destinations/" >Destination YAML Reference</a> for the spec envelope — <code>id</code>, <code>display_name</code>, <code>type</code>, <code>definition_version</code>, <code>enabled</code>, <code>transformation</code></li>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destinations/" >Manage Destinations using Rudder CLI</a> for the feature overview</li>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/destinations-walkthrough/" >End-to-End Walkthrough: Destinations with Rudder CLI</a> for step-by-step setup</li>
<li><a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/yaml-connections/" >Connection YAML Reference</a> to link a destination to a source</li>
</ul>

