Questions we get from builders who take security seriously
SF Tether handles OAuth flows, token vaulting, scope enforcement, and audit trails so your agent stack doesn't have to. Here's how it actually works — and what we don't do.
[ TRUST / VERIFIED ]
Built for production, not prototypes
SF Tether ships 72 discrete features — from append-only audit tables enforced at the database layer to PKCE-correct OAuth flows for every major provider. The FAQs below reflect the real questions that come up in security reviews and pre-launch technical diligence.
Tokens encrypted at the column layerAES-256-GCM via the shell encryptField primitive — ciphertext in Postgres, plaintext only after decryption in-process.
Row-level security enforced at the DBFORCE ROW LEVEL SECURITY on every tenant-scoped table, with per-request GUC binding — not application-layer guards that can be bypassed.
Append-only audit trailUPDATE and DELETE are revoked at the database role level on all log tables. Immutability is structural, not a policy.
[ FULL Q&A ]
Every question, answered straight
Your agent calls a single endpoint — POST /api/broker/token — with the end user's reference and the provider you need. Tether resolves the stored connection, checks it's active, verifies the requested scopes are within what the user consented to, auto-refreshes the credential if it's expiring within 30 seconds, and returns a short-lived provider access token bound to that agent session. On a warm connection with a fresh token, this resolves at under 50ms (p50). The full audit trail — scopes requested, scopes issued, latency, outcome — is written on every call.
Scope policy is enforced twice: at the moment a connection is created and on every single token issuance, even if you tightened the policy after the connection was made. If an agent asks for scopes the connection doesn't hold, Tether doesn't silently drop them — it creates a scope upgrade request, notifies the end user via email with a re-auth link, and returns a requires_consent response with a consentUrl so the agent can handle it gracefully. Org-level provider allowlists and per-connection rate limits (backed by Vercel KV) add additional layers; a runaway agent loop that exceeds the rate cap gets a 429 with a Retry-After header, not silent failure.
Tokens are encrypted at the Drizzle column-type layer using AES-256-GCM before they ever reach Postgres. Every ciphertext is context-bound to the specific table and row it belongs to, so a leaked ciphertext for one row cannot be replayed against another. A raw SELECT in the database returns ciphertext, not plaintext — decryption only happens through the application's typed schema layer. Admin credential reveals in the dashboard are gated to admin roles and log an admin.credential_revealed audit event every time. A rotateAllCredentials operation is available for key rotation drills.
Every connection lifecycle event (created, authorized, refreshed, revoked, error, scope change) is written to an append-only tether_connection_events table with a 7-year retention policy. Every broker token issuance — including scopes requested, scopes issued, latency, and outcome — is written to tether_broker_issuance_log, retained 90 days hot. Both tables are enforced append-only at the database permission layer: UPDATE and DELETE are revoked from the application role. The dashboard's log explorer lets you filter by event type, connection, end user, provider, IP, time range, and agent session, then export the filtered slice as CSV or JSON. An org-level data export compiles the full dataset — connections, end users, scope grants, and the complete audit logs — into a signed, zipped bundle for SOC 2 reviews or GDPR data-portability requests.
No. Tether ships with a catalog of 25+ pre-configured providers including Google, Microsoft 365, Slack, GitHub, Notion, Linear, Salesforce, HubSpot, Jira, Zendesk, and others — each pre-loaded with OAuth 2.0 endpoints, scope catalogs, and PKCE handling. A guided setup wizard walks you through registering your OAuth app with each provider: it shows you exactly which callback URL to paste into the provider's developer portal, then stores your client credentials encrypted. For your end users, a drop-in React component — TetherConnectButton — opens the OAuth flow in a popup and fires onSuccess/onError callbacks. The consent screen shown to end users displays your app's branding, the provider's logo, and plain-English descriptions of every scope being requested, color-coded by risk level.
No. A background job runs every 5 minutes, finds credentials expiring within the next 15 minutes, and refreshes them proactively — so agents almost never hit an expired token. When a refresh fails permanently (the user revoked access at the provider), the connection transitions to expired, a banner appears in your dashboard with a fix-now CTA, an email goes to the end user with a magic re-auth link, and your server receives a connection.expired webhook. The re-auth link drops the user directly into the OAuth flow without requiring them to log into your app first. You can also revoke any connection programmatically via API — including a bulk panic-revoke that zeros all credentials for an org, available as both a dashboard action and a REST endpoint.
[ STILL UNSURE? ]
Didn't find what you needed?
If your question is more specific — about a particular provider quirk, your compliance posture, or how the token broker behaves under load — reach out directly. We respond to technical questions with technical answers.
sf-core-org-support-sf-tether@saas-factory.ai
[ GET STARTED ]
Ready to stop managing tokens by hand?
Join the waitlist. We'll reach out when your spot is ready.