SF Tether sits between your AI agent and every API on the internet. Here is exactly what happens — from the first POST /api/broker/token call to the audited credential store — no hand-waving.
You paste your client_id and client_secret into the guided provider setup wizard. Tether stores them encrypted with AES-256-GCM — the raw value never reaches Postgres in plaintext. An instant verification ping confirms the credentials are live.
Your app drops a <TetherConnectButton> into its UI. The user clicks it, sees a consent screen listing the exact scopes being requested with plain-English risk levels, then approves. Tether handles the PKCE dance, exchanges the code, and stores the tokens — your app never touches them.
Your server-side SDK calls POST /api/broker/token with the user's external ref and the provider slug. Tether resolves the connection, enforces your scope policy, checks rate limits, and returns a short-lived provider access token. If the stored token is within 30 seconds of expiry, a single-flight refresh fires automatically — no duplicate provider calls.
Every broker call writes to tether_broker_issuance_log — scopes requested, scopes issued, latency, outcome. Every connection lifecycle event lands in tether_connection_events with a 7-year retention. Your audit log explorer gives you a filtered, exportable timeline auditors and incident-response teams can actually use.
Encryption happens at the Drizzle column-type layer — before anything touches Postgres. Access tokens, refresh tokens, and client secrets are AES-256-GCM encrypted with per-row context binding, so a leaked ciphertext for one row cannot be replayed against another.
Encrypted at rest by default The encryptedText() Drizzle custom type auto-encrypts writes and auto-decrypts reads.
Zero plaintext in Postgres A raw psql SELECT against tether_credentials returns ciphertext, not a token.
Key rotation built in rotateCredentialEncryption() re-encrypts all credentials for an account without downtime.

Scope policies and provider allowlists are enforced at connection creation AND at every broker call. Tightening a policy after a connection is made takes effect immediately — no re-authorisation required.
Toggle each provider on or off for your org. Agents can only connect to providers you've explicitly permitted.
Mark individual scopes as denied or requiring human approval. Excess-scope requests return a 400 with the exact missing scopes listed.
100 issuances per minute per end-user by default. Configurable per org. Runaway agent loops hit a 429 before they burn your provider quota.

The connections dashboard shows each end-user × provider pair with status, scopes, last used, and error count. Bulk revoke, force-refresh, or export to CSV. Virtualized for orgs with thousands of live connections.
Click any row to see the full event timeline, broker issuance history, and a 24-hour usage sparkline.
Revoke a single connection or every connection for a user in one action — GDPR offboarding in seconds.
Admin token reveals are audited — every credential_revealed event is logged with actor and timestamp.
A Temporal cron runs every 5 minutes, finding credentials expiring in the next 15 minutes and refreshing them via the provider. Concurrent broker calls for the same connection serialize through a Postgres advisory lock — exactly one provider HTTP call fires, regardless of how many agents are asking at once.
Single-flight refresh pg_advisory_xact_lock prevents duplicate refreshes under concurrent load.
Rotation-safe Providers that rotate refresh tokens (Google, Slack) have their new token atomically written in the same transaction.
Circuit-breaker per provider A single provider outage stops retries for that provider — it doesn't cascade to others.
When a broker request asks for scopes the connection doesn't hold, Tether creates a scope upgrade request, notifies the end-user by email with a one-click re-auth link, and returns a requires_consent response. The agent retries after the user approves — least-privilege without dead ends.
Email contains a signed magic link — no app login required.
Consent screen shows exactly which new scopes are being added.
Once approved, the connection holds the new scope and the agent proceeds.
Two append-only tables — tether_connection_events (7-year retention) and tether_broker_issuance_log (90-day hot) — capture everything. The log explorer unifies both into a single filterable, exportable timeline. UPDATE and DELETE are revoked at the database role level.
Filter by event type, provider, end-user, IP, or time range Click any row to expand the full JSON metadata.
Export to CSV or JSON A filtered slice ready for your SIEM or incident report.
Org-level data export A signed, zipped JSON + CSV bundle of every connection and audit event — for SOC2 and GDPR data-portability requests.

The quickstart page prefills your actual SDK key and shows copy-pasteable snippets for Node, Python, and Go. A 'Test it' button runs the snippet server-side and displays the real response inline.
Auto-generated OpenAPI spec under /api/rest/v1/tether/*. Server-to-server provisioning via standard HTTP — no SDK required.
Tether registers as an MCP server. Claude, OpenAI, and any MCP-aware framework can call tether.getToken or tether.startOAuth natively — zero glue code.
<TetherConnectButton provider="slack" endUserRef="user_123" /> opens the OAuth popup, polls for completion, and fires callbacks. Published as @sf/tether-react.

The end-users directory maps your app's user IDs to their Tether connections across every provider. Offboard a user, respond to a GDPR erasure request, or pull a 'user went rogue' panic-button — all from a single screen with a confirmation dialog.
Search by external_user_id — no need to know our internal ID.
Click through to see every provider connection for that user.
Revoke all connections for a user in one audited action.
Join the waitlist and get early access. Questions? Reach us at sf-core-org-support-sf-tether@saas-factory.ai