> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://apidocs.polytomic.com/2024-02-08/guides/code-examples/bulk-sync-elt-from-salesforce-to-snowflake/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://apidocs.polytomic.com/_mcp/server. ## UI demo video Watch the same steps in the Polytomic admin console in this [demo video](https://www.loom.com/share/8206a1fc8ac54d8fa936e544d0c8f395?sid=9653b1b1-6cdc-4473-81de-a88ac794ea1d). ## Code Set your Polytomic API key as an environment variable: ```bash export POLYTOMIC_API_KEY=YOUR-API-TOKEN ``` This example covers three steps: 1. Create a Salesforce Connection. 2. Create a Snowflake Connection. 3. Bulk Sync data from Salesforce into Snowflake. ## 1. Create a Salesforce connection The following request creates a Salesforce Connection. See the [Salesforce connection configuration](/guides/configuring-your-connections/connections/salesforce) for the required fields. #### cURL ```bash curl --request POST \ --url https://app.polytomic.com/api/connections \ --header "accept: application/json" \ --header "content-type: application/json" \ --header "X-Polytomic-Version: 2024-02-08" \ --header "Authorization: Bearer ${POLYTOMIC_API_KEY}" \ -d '{"name": "Salesforce Connection","type": "salesforce", "configuration": {"domain": "https://example.my.salesforce.com"}}' ``` #### Python ```python import os from polytomic.client import Polytomic client = Polytomic( token=os.getenv("POLYTOMIC_API_KEY"), ) resp = client.connections.create( name="Salesforce Connection", configuration={"domain": "https://example.my.salesforce.com"}, type="salesforce" ) print(resp.data) ``` #### Typescript ```typescript import { PolytomicClient } from 'polytomic'; const polytomic = new PolytomicClient({ token: "POLYTOMIC_API_KEY", }); polytomic.connections.create({ name: "Salesforce Connection", type: "salesforce", configuration: { domain: "https://example.my.salesforce.com" }, }).then((res) => { console.log(res) }) ``` #### Go ```golang import ( "context" "fmt" polytomic "github.com/polytomic/polytomic-go" polytomicgoclient "github.com/polytomic/polytomic-go/client" "github.com/polytomic/polytomic-go/option" ) client := polytomicgoclient.NewClient( option.WithToken(os.Getenv("POLYTOMIC_API_TOKEN")), ) resp, err := client.Connections.Create( context.TODO(), &polytomic.CreateConnectionRequestSchema{ Name: "Salesforce Connection", Type: "salesforce", Configuration: map[string]interface{}{ "domain": "https://example.my.salesforce.com", }, }, ) if err != nil { panic(err) } fmt.Println(resp) ``` Salesforce Connections authenticate with OAuth. Open the URL returned in the `auth_url` field of the response to complete the flow. > **OAuth redirection** > > By default, the API expects `auth_url` to open in a new browser window. > Set the optional `redirect_url` parameter in the request body to change > the redirect target. ## 2. Create a Snowflake connection The Snowflake instance must be reachable from Polytomic over the network. For details, see the [Snowflake connection guide](https://docs.polytomic.com/docs/snowflake-connections). #### cURL ```bash curl --request POST \ --url https://app.polytomic.com/api/connections \ --header "accept: application/json" \ --header "content-type: application/json" \ --header "X-Polytomic-Version: 2024-02-08" \ --header "Authorization: Bearer ${POLYTOMIC_API_KEY}" \ -d '{ "name": "Snowflake Connection", "type": "snowflake", "configuration": { "account": "uc193736182", "username": "user", "password": "secret", "dbname": "database" } }' ``` #### Python ```python import os from polytomic.client import Polytomic client = Polytomic( token=os.getenv("POLYTOMIC_API_KEY"), ) resp = client.connections.create( name="Snowflake Connection", type="snowflake", configuration={ "account": "uc193736182", "username": "user", "password": "secret", "dbname": "database" } ) print(resp.data) ``` #### Typescript ```typescript import { PolytomicClient } from 'polytomic'; const polytomic = new PolytomicClient({ token: "POLYTOMIC_API_KEY", }); polytomic.connections.create({ name: "Snowflake Connection", type: "snowflake", configuration: { account: "uc193736182", username: "user", password: "secret", dbname: "database" }, }).then((res) => { console.log(res) }) ``` #### Go ```golang import ( "context" "fmt" polytomic "github.com/polytomic/polytomic-go" polytomicgoclient "github.com/polytomic/polytomic-go/client" "github.com/polytomic/polytomic-go/option" ) client := polytomicgoclient.NewClient( option.WithToken(os.Getenv("POLYTOMIC_API_TOKEN")), ) resp, err := client.Connections.Create( context.TODO(), &polytomic.CreateConnectionRequestSchema{ Name: "Snowflake Connection", Type: "snowflake", Configuration: map[string]interface{}{ "account": "uc193736182", "username": "user", "password": "secret", "dbname": "database", }, }, ) if err != nil { panic(err) } fmt.Println(resp) ``` ## 3. Create a Bulk Sync Before creating the sync, poll the [Get Schema Status](/api-reference/schemas/get-status) endpoint for your Salesforce Connection ID until `cache_status` is `cached`. This confirms Polytomic has read the full Salesforce schema. Caching takes a few seconds after Step 1, and you should wait for it after connecting Polytomic to any SaaS platform. > ℹ️ Retry while schemas cache > > Until the cache is populated, Bulk Sync creation returns: > > ```json > {"status":400,"message":"No schemas found. This can mean that the Polytomic has not cached any schemas yet. Please try again.","metadata":null} > ``` > > This request is safe to retry until it returns a `2xx` response. Once the schema is cached, the following request creates a [Bulk Sync](/guides/concepts) that replicates the Salesforce `Account` and `Contact` objects into Snowflake. Omit `schemas` to sync every object on the source: #### cURL ```bash curl --request POST \ --url https://app.polytomic.com/api/bulk/syncs \ --header "accept: application/json" \ --header "content-type: application/json" \ --header "X-Polytomic-Version: 2024-02-08" \ --header "Authorization: Bearer ${POLYTOMIC_API_KEY}" \ -d '{ "name": "Salesforce Bulk Sync", "source_connection_id": "YOUR-SALESFORCE-CONNECTION-ID", "destination_connection_id": "YOUR-SNOWFLAKE-CONNECTION-ID", "mode": "replicate", "schedule": { "frequency": "continuous" }, "destination_configuration": { "schema": "SALESFORCE_CONNECTION" }, "schemas": ["Account", "Contact"] }' ``` #### Python ```python import os from polytomic.client import Polytomic from polytomic import BulkSchedule client = Polytomic( token=os.getenv("POLYTOMIC_API_KEY"), ) resp = client.bulk_sync.create( name="Salesforce Bulk Sync", source_connection_id="YOUR-SALESFORCE-CONNECTION-ID", destination_connection_id="YOUR-SNOWFLAKE-CONNECTION-ID", mode="replicate", schedule=BulkSchedule( frequency="continuous", ), destination_configuration={ "schema": "SALESFORCE_CONNECTION" }, schemas=["Account", "Contact"] ) print(resp.data) ``` #### Typescript ```typescript import { PolytomicClient } from 'polytomic'; const polytomic = new PolytomicClient({ token: "POLYTOMIC_API_KEY", }); polytomic.bulkSync.create({ name: "Salesforce Bulk Sync", source_connection_id: "YOUR-SALESFORCE-CONNECTION-ID", destination_connection_id: "YOUR-SNOWFLAKE-CONNECTION-ID", mode: "replicate", schedule: { frequency: Polytomic.ScheduleFrequency.Continuous, }, destination_configuration: { schema: "SALESFORCE_CONNECTION" }, schemas: ["Account", "Contact"] }).then((res) => { console.log(res) }) ``` #### Go ```golang import ( "context" "fmt" "github.com/AlekSi/pointer" polytomic "github.com/polytomic/polytomic-go" polytomicgoclient "github.com/polytomic/polytomic-go/client" "github.com/polytomic/polytomic-go/option" ) client := polytomicgoclient.NewClient( option.WithToken(os.Getenv("POLYTOMIC_API_TOKEN")), ) resp, err := client.BulkSync.Create( context.TODO(), &polytomic.CreateBulkSyncRequest{ Name: "Salesforce Bulk Sync", SourceConnectionId: "YOUR-SALESFORCE-CONNECTION-ID", DestinationConnectionId: "YOUR-SNOWFLAKE-CONNECTION-ID", Mode: pointer.ToString("replicate"), Schedule: &polytomic.BulkSchedule{ Frequency: polytomic.ScheduleFrequencyContinuous, }, DestinationConfiguration: map[string]interface{}{ "schema": "SALESFORCE_CONNECTION", }, Schemas: []string{"Account", "Contact"}, }, ) if err != nil { panic(err) } fmt.Println(resp) ```