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
For connecting Salesforce, SAP, Workday, etc. ThreadSync handles the OAuth flow — you provide the callback URL.
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
curl -X POST https://api.threadsync.io/v1/connections \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"provider": "salesforce", "name": "Production SF"}'
# 3. Sync contacts to your data warehouse
# Use the connection ID returned from step 2
curl -X POST https://api.threadsync.io/v1/syncs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source": {"connection": "CONNECTION_ID", "object": "Contact"},
"destination": {"connection": "DEST_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 in one line
const sf = await ts.connections.create('salesforce');
// Sync contacts in real-time
const sync = await ts.sync.create({
source: { connection: sf.id, object: 'Contact' },
destination: { connection: 'snowflake', 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")
# Create a real-time sync
sync = ts.sync.create(
source={"connection": sf.id, "object": "Contact"},
destination={"connection": "snowflake", "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/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) }
// Create a real-time sync
sync, err := client.Sync.Create(&threadsync.SyncConfig{
Source: threadsync.Endpoint{Connection: sf.ID, Object: "Contact"},
Destination: threadsync.Endpoint{Connection: "snowflake", Table: "contacts"},
Schedule: "realtime",
})
if err != nil { log.Fatal(err) }
fmt.Printf("Sync created: %s\n", sync.ID)
}
<dependency>
<groupId>io.threadsync</groupId>
<artifactId>threadsync-sdk</artifactId>
<version>0.1.0</version>
</dependency>Previewimport 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");
// Create a real-time sync
Sync sync = ts.sync().create(
SyncConfig.builder()
.source(new Endpoint(sf.getId(), "Contact"))
.destination(new Endpoint("snowflake", "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");
// 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 = "snowflake", 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')
# Create a real-time sync
sync = ts.sync.create(
source: { connection: sf.id, object: 'Contact' },
destination: { connection: 'snowflake', 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');
// Create a real-time sync
$sync = $ts->sync->create(new SyncConfig(
source: ['connection' => $sf->id, 'object' => 'Contact'],
destination: ['connection' => 'snowflake', '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?;
// Create a real-time sync
let sync = ts.sync().create(SyncConfig {
source: Endpoint { connection: sf.id.clone(), object: "Contact".into() },
destination: Endpoint { connection: "snowflake".into(), 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.
Connections
/v1/connections
Create a new connection to an external system. OAuth flows are handled automatically.
/v1/connections
List all connections with health status and last sync timestamps.
/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/:id
Get sync details including status, records processed, errors, and throughput metrics.
/v1/syncs/:id/trigger
Manually trigger a sync job. Useful for testing or on-demand refreshes.
Webhooks
/v1/webhooks
Subscribe to events like sync.completed, connection.failed, or data.changed. (Webhook delivery — Q2 2026)
/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 — contributions welcome.
Rate Limits & Tiers
Generous limits that scale with your needs. No surprise throttling.
| Tier | Requests/min | Connections | Active Syncs | Support |
|---|---|---|---|---|
| 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.
