ZapBounce and Snowflake

Snowflake supports external functions, which let a SQL query call an HTTP endpoint through API Gateway. It is tempting to use one for verification and it is usually the wrong shape.

External functions are row-oriented and Snowflake batches them in ways you do not control, which interacts badly with a rate-limited API.

External functions do not respect an external rate limit

Snowflake decides how to batch external function calls based on its own execution plan. A query over a million rows will issue calls at a pace tuned for Snowflake's throughput rather than the API's limit.

The result is a wall of 429s inside a query that then fails, having already consumed warehouse credits.

Staging the addresses, submitting a batch through a task, and loading the results back keeps both sides within their own constraints.

How the data moves

  1. Stage candidates with a Snowflake task

    A task selects unverified addresses into a stage table on a schedule.

  2. Submit the batch from outside Snowflake

    A small job reads the stage, submits the batch, and waits for the webhook. Snowflake is the storage, not the orchestrator.

  3. Load results with COPY INTO

    The results file lands in a stage and COPY INTO loads it, which is the cheap path.

  4. Use a stream to find new rows

    Snowflake streams track changes, so the candidate query reads only what arrived since the last run.

Setting it up

  1. Create a verdict table with address, verdict, check date and coverage.
  2. Create a stream on the source table to track new and changed addresses.
  3. Write a task that stages candidates from the stream on a schedule.
  4. Run an external job that submits the batch and receives the completion webhook.
  5. Land the results file in a Snowflake stage and load it with COPY INTO.
  6. Expose a view joining verdicts with a staleness condition built in.

Snowflake: common questions

Can I use an external function?

You can, and Snowflake will pace the calls by its own plan rather than our rate limit. A staged batch is the reliable shape.

How do I find new rows to check?

A stream on the source table. It tracks changes so the candidate query does not scan everything.

Where should the orchestration live?

Outside Snowflake. Tasks stage the work; a job submits the batch and receives the webhook.

Check a Snowflake export today

100 free checks a month, no card. Unknown results and duplicates are never billed.