The Developer Platform
Enterprise Integration API
Connect any system in minutes, not months. Unify Salesforce, SAP, Workday, and 200+ enterprise systems with a single, elegant interface.
Why Developers Choose ThreadSync
Built by engineers, for engineers. We obsess over the details so you don't have to.
Zero Config Integrations
Connect to Salesforce, SAP, or Workday in 3 lines of code. No middleware, no XML, no headaches.
Event Streaming
Poll sync status in real-time via REST. Webhook push delivery coming Q2 2026 for zero-polling event-driven architectures.
Enterprise Security
SOC 2 aligned, end-to-end encryption, and RBAC built-in. Pass your security review on day one.
Version Control
Full API versioning with 24-month deprecation windows. Your integrations won't break unexpectedly.
Built-in Observability
Distributed tracing, metrics, and logs out of the box. Debug issues in seconds, not hours.
Developer Support
Dedicated Slack channel, office hours, and engineers who actually understand your code.
Authentication
Three ways to authenticate with the ThreadSync API.
Sandbox API Key
For development and testing. Request a key from the dashboard — use it directly as a Bearer token.
Authorization: Bearer sk_test_...
Client Credentials
For production service-to-service. Exchange client_id + client_secret via POST /v1/auth/token for a short-lived JWT.
Authorization: Bearer eyJhbG...
Provider OAuth ROADMAP
For connecting Salesforce, SAP, Workday, etc. ThreadSync handles the OAuth flow — you provide the callback URL. In sandbox, connections return simulated "connected" status.
POST /v1/connections/oauth/start
The THREADSYNC_API_TOKEN environment variable used in SDK examples accepts either an API key or a client credentials JWT.
Quick Start Guide
From zero to your first integration in under 5 minutes.
SDKs in preview on GitHub.
# 1. Authenticate and get your token
curl -X POST https://api.threadsync.io/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"client_id": "YOUR_CLIENT_ID", "client_secret": "YOUR_SECRET"}'
# 2. Connect to Salesforce (source)
curl -X POST https://api.threadsync.io/v1/connections \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider": "salesforce"}'
# 3. Connect to Snowflake (destination)
curl -X POST https://api.threadsync.io/v1/connections \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider": "snowflake"}'
# 4. Sync contacts to your data warehouse
# Use the connection IDs returned from steps 2 and 3
curl -X POST https://api.threadsync.io/v1/syncs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": {"connection": "SF_CONNECTION_ID", "object": "Contact"},
"destination": {"connection": "SNOWFLAKE_CONNECTION_ID", "table": "contacts"},
"schedule": "realtime"
}'
import { ThreadSync } from '@threadsync/sdk';
// Initialize the client
const ts = new ThreadSync({
bearerToken: process.env.THREADSYNC_API_TOKEN
});
async function main() {
// Connect to Salesforce
const sf = await ts.connections.create('salesforce');
// Connect to your data warehouse
const dest = await ts.connections.create('snowflake');
// Sync contacts in real-time
const sync = await ts.sync.create({
source: { connection: sf.id, object: 'Contact' },
destination: { connection: dest.id, table: 'contacts' },
schedule: 'realtime'
});
// Check sync status
const status = await ts.sync.get(sync.id);
console.log(`Synced ${status.recordsSynced} records`);
}
main();
import os
from threadsync import ThreadSync
# Initialize the client
ts = ThreadSync(bearer_token=os.environ["THREADSYNC_API_TOKEN"])
# Connect to Salesforce
sf = ts.connections.create(provider="salesforce")
# Connect to your data warehouse
dest = ts.connections.create(provider="snowflake")
# Create a real-time sync
sync = ts.sync.create(
source={"connection": sf.id, "object": "Contact"},
destination={"connection": dest.id, "table": "contacts"},
schedule="realtime"
)
# Check sync status
status = ts.sync.get(sync.id)
print(f"Synced {status.records_synced} records")
package main
import (
"fmt"
"log"
"os"
"github.com/threadsync-infrastructure/threadsync-go"
)
func main() {
// Initialize the client
client := threadsync.New(os.Getenv("THREADSYNC_API_TOKEN"))
// Connect to Salesforce
sf, err := client.Connections.Create("salesforce", nil)
if err != nil { log.Fatal(err) }
// Connect to your data warehouse
dest, err := client.Connections.Create("snowflake", nil)
if err != nil { log.Fatal(err) }
// Create a real-time sync
sync, err := client.Sync.Create(&threadsync.SyncConfig{
Source: threadsync.Endpoint{Connection: sf.ID, Object: "Contact"},
Destination: threadsync.Endpoint{Connection: dest.ID, Table: "contacts"},
Schedule: "realtime",
})
if err != nil { log.Fatal(err) }
fmt.Printf("Sync created: %s\n", sync.ID)
}
import io.threadsync.sdk.ThreadSync;
import io.threadsync.sdk.models.*;
public class QuickStart {
public static void main(String[] args) {
// Initialize the client
ThreadSync ts = ThreadSync.builder()
.bearerToken(System.getenv("THREADSYNC_API_TOKEN"))
.build();
// Connect to Salesforce
Connection sf = ts.connections()
.create("salesforce");
// Connect to your data warehouse
Connection dest = ts.connections()
.create("snowflake");
// Create a real-time sync
Sync sync = ts.sync().create(
SyncConfig.builder()
.source(new Endpoint(sf.getId(), "Contact"))
.destination(new Endpoint(dest.getId(), "contacts"))
.schedule("realtime")
.build()
);
System.out.printf("Sync created: %s%n", sync.getId());
}
}
using ThreadSync.Sdk;
using ThreadSync.Sdk.Models;
// Initialize the client
var ts = new ThreadSyncClient(
bearerToken: Environment.GetEnvironmentVariable("THREADSYNC_API_TOKEN")
);
// Connect to Salesforce
var sf = await ts.Connections.CreateAsync("salesforce");
// Connect to your data warehouse
var dest = await ts.Connections.CreateAsync("snowflake");
// Create a real-time sync
var sync = await ts.Sync.CreateAsync(new SyncConfig
{
Source = new Endpoint { Connection = sf.Id, Object = "Contact" },
Destination = new Endpoint { Connection = dest.Id, Table = "contacts" },
Schedule = "realtime"
});
Console.WriteLine($"Sync created: {sync.Id}");
require 'threadsync'
# Initialize the client
ts = ThreadSync::Client.new(
bearer_token: ENV['THREADSYNC_API_TOKEN']
)
# Connect to Salesforce
sf = ts.connections.create(provider: 'salesforce')
# Connect to your data warehouse
dest = ts.connections.create(provider: 'snowflake')
# Create a real-time sync
sync = ts.sync.create(
source: { connection: sf.id, object: 'Contact' },
destination: { connection: dest.id, table: 'contacts' },
schedule: 'realtime'
)
# Check sync status
status = ts.sync.get(sync.id)
puts "Synced #{status.records_synced} records"
<?php
use ThreadSync\Client;
use ThreadSync\Models\SyncConfig;
// Initialize the client
$ts = new Client(
bearerToken: getenv('THREADSYNC_API_TOKEN')
);
// Connect to Salesforce
$sf = $ts->connections->create('salesforce');
// Connect to your data warehouse
$dest = $ts->connections->create('snowflake');
// Create a real-time sync
$sync = $ts->sync->create(new SyncConfig(
source: ['connection' => $sf->id, 'object' => 'Contact'],
destination: ['connection' => $dest->id, 'table' => 'contacts'],
schedule: 'realtime'
));
echo "Sync created: {$sync->id}\n";
use threadsync::{Client, SyncConfig, Endpoint};
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize the client
let ts = Client::new(
&env::var("THREADSYNC_API_TOKEN")?
);
// Connect to Salesforce
let sf = ts.connections()
.create("salesforce")
.await?;
// Connect to your data warehouse
let dest = ts.connections()
.create("snowflake")
.await?;
// Create a real-time sync
let sync = ts.sync().create(SyncConfig {
source: Endpoint { connection: sf.id.clone(), object: "Contact".into() },
destination: Endpoint { connection: dest.id.clone(), table: "contacts".into() },
schedule: "realtime".into(),
}).await?;
println!("Sync created: {}", sync.id);
Ok(())
}
200+ Enterprise Connectors
Pre-built integrations for the systems you already use. New connectors added monthly.
API Reference
RESTful API with predictable resource-oriented URLs and standard HTTP response codes.
Authentication
/v1/auth/token
Exchange client credentials for a short-lived JWT. Send client_id and client_secret in the request body. No authentication header required.
Health
/v1/health
Health check endpoint. Returns API status, version, and environment. No authentication required.
Connections
/v1/connections
Create a new connection to an external system. Only provider is required; name is optional.
/v1/connections
List all connections with health status and last sync timestamps. Sandbox: health status and timestamps are simulated.
/v1/connections/:id
Get a single connection by ID, including provider, status, and timestamps. Sandbox: status is simulated.
/v1/connections/:id
Safely remove a connection. Associated syncs are paused automatically.
Syncs
/v1/syncs
Create a sync job between source and destination. Supports real-time, scheduled, or manual triggers.
/v1/syncs
List all sync jobs with current status, schedule, and record counts. Sandbox: record counts are simulated.
/v1/syncs/:id
Get sync details including status, records processed, errors, and throughput metrics. Sandbox: metrics are simulated.
/v1/syncs/:id/trigger
Manually trigger a sync job. Useful for testing or on-demand refreshes. Sandbox: completes instantly with simulated results.
Webhooks ROADMAP — Q2 2026
/v1/webhooks
Subscribe to events like sync.completed, connection.failed, or data.changed.
/v1/webhooks/:id/deliveries
View webhook delivery history with payloads and response codes for debugging.
Magic Runtime
Deploy AI-generated controllers with enterprise-grade safety. Default-deny security, contract-driven execution, and full observability — built for production.
Contract-Driven
Every controller declares its inputs, outputs, capabilities, and resource limits. No surprises in production.
Default-Deny Security
HTTP egress, database access, and secrets are blocked unless explicitly declared and scoped per-controller.
Sandboxed Execution
Isolated containers with CPU/memory limits and syscall restrictions. Safe to run untrusted or AI-generated code.
Hot-Reload Deploy
Ship new controllers without restarts. Validate, deploy, and execute — all through the CLI or API.
Full Observability
Structured JSON logs, Prometheus metrics, and distributed tracing. Every request traced by request_id.
AI-Native Workflow
LLM context packs and scaffolding so AI assistants generate conformant controllers out of the box.
Official SDKs
Open source SDKs for every major language. All v0.1.0 preview — install from GitHub. Contributions welcome.
Rate Limits & Tiers
Generous limits that scale with your needs. No surprise throttling.
| Tier | Requests/min | Connections | Active Syncs | Support |
|---|---|---|---|---|
| Sandbox environment: 60 requests/min across all tiers. Production limits apply after launch. | ||||
| Starter | 1,000 | 5 | 3 | |
| Professional | 10,000 | 25 | 25 | Priority |
| Enterprise | Unlimited | Unlimited | Unlimited | Dedicated |
Ready to Build?
Request API access and receive your sandbox key within 24 hours. Enterprise-grade authentication from day one.
