Select spec version:

Snowflake Streaming Destination Config Reference

Beta
Complete Rudder CLI reference for the Snowflake Streaming destination config keys, key pair authentication, Iceberg tables, source types, and secrets.
Available Plans
  • free
  • growth
  • enterprise

Snowflake Streaming is a warehouse destination. RudderStack streams events as rows into tables in a Snowflake database through the Snowpipe Streaming API, in near real time, without staging files or a sync schedule.

In a Snowflake Streaming destination spec:

  • type: snowpipe_streaming
  • definition_version: 1

Sample configuration

yaml
version: rudder/v1
kind: destination
metadata:
  name: snowflake-streaming-prod
spec:
  id: snowflake-streaming-prod
  display_name: Snowflake Streaming Production
  type: snowpipe_streaming
  definition_version: 1
  enabled: true
  config:
    account: xy12345.us-east-2.aws
    database: RUDDER_EVENTS
    warehouse: RUDDER_WAREHOUSE
    user: "{{ .SNOWFLAKE_USER }}"
    role: RUDDER_ROLE
    namespace: rudder_events

    private_key: "{{ .SNOWFLAKE_PRIVATE_KEY }}"
    private_key_passphrase: "{{ .SNOWFLAKE_PRIVATE_KEY_PASSPHRASE }}"

    enable_iceberg: false

    skip_tracks_table: false
    json_paths: track.properties.metadata,identify.traits.address

    underscore_divide_numbers: false
    allow_users_context_traits: false

    connection_mode:
      web: cloud
      cloud: cloud
    consent_management:
      web:
        - provider: oneTrust
          consents:
            - analytics

The above example authenticates with an encrypted key pair and writes standard Snowflake tables. Iceberg tables are a choice you make when you create the destination — see Iceberg tables.

Config keys

config accepts only the keys listed below. The shared config key rules cover unknown keys, defaults, and immutability.

Connection

account

Required

Type: string

Description: Your Snowflake account identifier — the part of your Snowflake URL before .snowflakecomputing.com.

Notes:

  • At most 100 characters, and must not contain line breaks.
  • A {{ path || fallback }} template is accepted in place of a literal.
See Snowflake account ID examples for the format per cloud and region.

database

Required

Type: string

Description: Name of the Snowflake database RudderStack streams data into.

Notes:

  • At most 100 characters, and must not contain line breaks.
  • A {{ path || fallback }} template is accepted in place of a literal.

warehouse

Required

Type: string

Description: Name of the Snowflake virtual warehouse RudderStack runs its connection checks and schema changes on. Rows are streamed without it, so a small warehouse is enough.

Notes:

  • At most 100 characters, and must not contain line breaks.
  • A {{ path || fallback }} template is accepted in place of a literal.

user

RequiredSecret

Type: string

Description: Snowflake user RudderStack connects as. The user authenticates with private_key — Snowflake Streaming doesn’t support password authentication.

Notes:

  • At most 100 characters, and must not contain line breaks.
  • A {{ path || fallback }} template is accepted in place of a literal.

Supply it as a {{ .VAR }} reference rather than a literal — see Secrets.

See Create a user.

role

Type: string

Description: Role RudderStack assumes. When omitted, the user’s default role is used. The role needs permission to create schemas and tables in database.

Notes:

  • At most 100 characters, and must not contain line breaks.
  • A {{ path || fallback }} template is accepted in place of a literal.

namespace

RequiredImmutable

Type: string

Description: Schema RudderStack creates its tables in.

Notes:

  • At most 64 characters, and must not start with pg_ in any capitalization.
  • A {{ path || fallback }} template is accepted in place of a literal.
  • Unlike Snowflake, there’s no fallback to the source name. A spec that omits this key fails validation with 'namespace' is required.
  • Can’t be changed once the destination exists — the API rejects the update. Create a new destination instead.

Authentication

Snowflake Streaming authenticates with a key pair only.

private_key

RequiredSecret

Type: string

Description: PEM-encoded private key whose public half is assigned to user in Snowflake.

Notes:

  • Must be a whole PEM block, from its BEGIN PRIVATE KEY line to its END PRIVATE KEY line, or the ENCRYPTED PRIVATE KEY equivalents. A bare base64 key body is rejected, and so is a PKCS#1 RSA PRIVATE KEY.
  • Templates aren’t accepted. {{ .VAR }} references are resolved before validation, so the resolved value is what must be PEM-shaped.

Supply it as a {{ .VAR }} reference rather than a literal — see Secrets. An environment variable can carry the key directly:

bash
export RUDDER_SNOWFLAKE_PRIVATE_KEY="$(cat rsa_key.p8)"

In a var file, use a YAML literal block:

yaml
SNOWFLAKE_PRIVATE_KEY: |
  -----BEGIN PRIVATE KEY-----
  ...
  -----END PRIVATE KEY-----  

A reference that is the whole quoted value, such as '{{ .SNOWFLAKE_PRIVATE_KEY }}', keeps the line breaks in either quote style, including the single-quoted references rudder-cli import writes.

private_key_passphrase

Secret

Type: string

Description: Passphrase you set when encrypting private_key. Leave it out for an unencrypted key.

Notes:

  • At most 100 characters, and must not contain line breaks.

Supply it as a {{ .VAR }} reference rather than a literal — see Secrets.

Authentication fails if the key is encrypted and this passphrase is missing. Rudder CLI doesn’t check that an ENCRYPTED PRIVATE KEY comes with a passphrase, so validate doesn’t catch it.

Iceberg tables

By default, RudderStack creates standard Snowflake tables. With enable_iceberg, it creates Snowflake-managed Iceberg tables instead, which store their data as Parquet files in your own cloud storage. In Iceberg tables, JSON values are stored as VARCHAR strings and timestamps as TIMESTAMP_NTZ, without a time zone.

enable_iceberg

Immutable

Type: boolean

Default value: false

Description: Create Snowflake-managed Iceberg tables instead of standard tables.

Notes:

  • Requires external_volume.
  • Can’t be changed once the destination exists — the API rejects the update. Create a new destination instead.

external_volume

Required

Type: string

Description: Name of the Snowflake external volume Iceberg tables keep their data and metadata files on. The volume must already exist.

Notes:

  • Required when enable_iceberg is true. Leave it unset otherwise — the dashboard shows it only when Iceberg is on, and RudderStack ignores it without Iceberg.
  • At most 100 characters, and must not contain line breaks.
  • RudderStack reads it only when it creates a table, so changing it later leaves existing tables on the old volume. To move to another volume, create a new destination.
  • A spec that sets enable_iceberg: true without it fails validation with 'external_volume' is required when 'enable_iceberg' is true.
yaml
enable_iceberg: true
external_volume: RUDDER_ICEBERG_VOLUME

See Create an external volume for Iceberg data.

Table behavior

Snowflake Streaming only appends rows. It never writes a users table — identify events go to the identifies table only — and doesn’t merge, so it has no keys for either.

skip_tracks_table

Type: boolean

Default value: false

Description: Skip sending events to the tracks table. Per-event tables are unaffected.

json_paths

Type: string

Description: Comma-separated dot-notation paths whose values are stored as JSON columns instead of being flattened. Start each path with the event type it applies to, such as track.properties.metadata. A path without one applies to track events only.

Notes:

  • Not validated locally.
yaml
json_paths: track.properties.metadata,identify.traits.address

See JSON Column Support.

Legacy column naming

Both keys below preserve the column naming of destinations created before the behavior changed. Leave them at their defaults on a new destination. Neither can be changed once the destination exists — the API rejects the update.

underscore_divide_numbers

ImmutableInternal

Type: boolean

Default value: false

Description: When false, numeric suffixes in column names are preserved: v3 stays v3 rather than being split into v_3.

allow_users_context_traits

ImmutableInternal

Type: boolean

Default value: false

Description: When false, context.traits.* fields aren’t promoted to top-level traits and are stored only as context_traits_* columns.

Per-source keys

Both keys are objects keyed by the local source type — the tokens listed under Source types. A key naming a source type this destination doesn’t support fails validation.

connection_mode

Type: object

Description: Maps each source type you connect to the mode its events reach Snowflake Streaming in, using the modes in Source types.

Notes:

yaml
connection_mode:
  web: cloud
  cloud: cloud

Source types

Snowflake Streaming accepts events from these source types in the mentioned connection modes:

Source typeConnection mode
androidcloud
android_kotlincloud
ioscloud
ios_swiftcloud
webcloud
unitycloud
react_nativecloud
fluttercloud
cordovacloud
cloudcloud

Every source type is cloud only — events reach Snowflake from RudderStack’s servers, never in device mode.

The dashboard additionally offers Snowflake Streaming to AMP, Shopify, and cloud app sources. Rudder CLI doesn’t manage those connections, so amp, shopify, and cloud_source are invalid here.

Connect a source

An event stream connection to this destination is checked against two rules at validate time.

The source’s type must be supported. A source’s type resolves to one of the tokens above before the check — a JavaScript source resolves to web, and webhook and server-side SDK sources resolve to cloud. Every type an event stream source can resolve to is supported here, so this check always passes.

The destination config must carry a connection_mode entry for that source type. This lives on the destination spec, not on the connection spec. Without it:

destination 'snowflake-streaming-prod' config has no 'connection_mode' entry for source type 'web'

Snowflake Streaming needs no additional config keys to connect a source of any type.

Secrets

user, private_key, and private_key_passphrase are the secret keys. Write each one you use as a {{ .VAR }} reference and supply the value at apply time:

yaml
config:
  user: "{{ .SNOWFLAKE_USER }}"
  private_key: "{{ .SNOWFLAKE_PRIVATE_KEY }}"
  private_key_passphrase: "{{ .SNOWFLAKE_PRIVATE_KEY_PASSPHRASE }}"
bash
export RUDDER_SNOWFLAKE_USER="RUDDER_USER"
export RUDDER_SNOWFLAKE_PRIVATE_KEY="$(cat rsa_key.p8)"
export RUDDER_SNOWFLAKE_PRIVATE_KEY_PASSPHRASE="..."
rudder-cli apply

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

Note that:

  • rudder-cli import writes only the secrets the API returns, as {{ .VAR }} references, and leaves the others out. Add any secret key it leaves out, then supply the variables before you apply — see Secrets.
  • private_key spans several lines. Use a YAML literal block in a var file, or an environment variable that carries the key file’s contents — see private_key.

See How to Use Variable Substitution in Rudder CLI.

Changes by release

No changes since this type became available.

For changes across every destination type, see Destination Type Changes by Release.

See more

Questions? Let's figure it out together.

Join the RudderStack Slack community to connect with other users, customers, and the RudderStack team — or reach out for direct support.