# Snowflake

## WarpStream Iceberg Catalog

This guide explains how to query WarpStream Tableflow tables by connecting Snowflake to the WarpStream Iceberg REST catalog.

#### 1. Prepare the Base URL and Authentication

Get the base URL and authentication for the next step by following the instructions in [#construct-the-base-url](https://docs.warpstream.com/warpstream/iceberg-catalog#construct-the-base-url "mention") and [#authenticate](https://docs.warpstream.com/warpstream/iceberg-catalog#authenticate "mention").

#### 2. Create Catalog Integration

```sql
CREATE OR REPLACE CATALOG INTEGRATION warpstream_catalog 
    CATALOG_SOURCE = ICEBERG_REST 
    TABLE_FORMAT = ICEBERG 
    CATALOG_NAMESPACE = 'default' 
    REFRESH_INTERVAL_SECONDS = 60 
    REST_CONFIG = ( 
        CATALOG_URI = '$BASE_URL' 
    ) 
    REST_AUTHENTICATION = ( 
        TYPE = BEARER 
        BEARER_TOKEN = '$AGENT_KEY' 
    )
    ENABLED = TRUE;
```

Replace:

* `$BASE_URL` - Base URL from the previous step.
* `$AGENT_KEY` - Your WarpStream Agent Key (starts with `aks_`) from the previous step.

<figure><img src="https://77315434-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjB7FxO8ty4EXO4HsQP4E%2Fuploads%2FQ9rvpigWShAnWWwWUasg%2FScreenshot%202025-12-04%20at%2008.48.37.png?alt=media&#x26;token=15305e33-b159-4da4-8242-4937afcf46dd" alt=""><figcaption></figcaption></figure>

#### 3. Create External Volume

Configure an external volume `<warpstream_volume>` pointing to your Tableflow storage bucket by following these instructions: <https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-external-volume>

Basically, you will need to configure the correct authentication or privileges (IAM role, GCS principal etc.) depending on the storage provider, and then run this command to create an external volume:

```sql
CREATE OR REPLACE EXTERNAL VOLUME <warpstream_volume> 
    STORAGE_LOCATIONS = ( 
        ( 
            NAME = '<warpstream_volume>', 
            STORAGE_PROVIDER = '<storage_provider>', 
            STORAGE_BASE_URL = '<bucket_url>' 
        ) 
    );
```

<figure><img src="https://77315434-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjB7FxO8ty4EXO4HsQP4E%2Fuploads%2FdwpWQxWOqayCssYdMRNw%2FScreenshot%202025-12-04%20at%2008.49.14.png?alt=media&#x26;token=afdbc2f2-afb2-4ffe-9dc7-dd9a9ce0590a" alt=""><figcaption></figcaption></figure>

#### 4. Create Iceberg Table

```sql
CREATE OR REPLACE ICEBERG TABLE my_table
    EXTERNAL_VOLUME = '<warpstream_volume>' 
    CATALOG = 'warpstream_catalog' 
    CATALOG_TABLE_NAME = '<table_name>';
```

<figure><img src="https://77315434-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjB7FxO8ty4EXO4HsQP4E%2Fuploads%2FFAZwEN3CchNxYIG5IYl4%2FScreenshot%202025-12-04%20at%2010.45.10.png?alt=media&#x26;token=b497de11-730d-4e98-86d8-faa2aceba3f4" alt=""><figcaption></figcaption></figure>

#### 5. Query the Table

```sql
-- Count records 
SELECT COUNT(*) FROM my_table;
-- View sample data 
SELECT * FROM my_table LIMIT 10;
```

<figure><img src="https://77315434-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjB7FxO8ty4EXO4HsQP4E%2Fuploads%2FI9xqgKDqcidBrKvvsaRS%2FScreenshot%202025-12-04%20at%2010.46.01.png?alt=media&#x26;token=3573de7b-73a7-49cd-bde6-4f5252a3f6d2" alt=""><figcaption></figcaption></figure>
