Key storage
- API keys are stored as SHA-256 hashes — we cannot recover a lost key.
- OAuth access and refresh tokens are hashed at rest.
- Full secrets are never written to audit logs.
Rotation
- Create a new key (or use Rotate on an existing key in the Developers page).
- Update your integration to use the new key.
- Revoke the old key.
Logging
We log: route, method, status code, latency, key prefix, and IP — not request/response bodies or Authorization headers.Incident response
If a key is exposed:- Revoke it immediately in Integrations → Sight AI API.
- Review recent API logs in the Developers page.
- Create a new key with minimum required scopes.
MCP OAuth
- Redirect URIs must be HTTPS or localhost/127.0.0.1 only.
- PKCE (
S256) is required for authorization code exchange — for every client, including confidential ones. - OAuth tokens are bound to a single team selected at consent.
OAuth client authentication
- Public clients (
token_endpoint_auth_method: none) authenticate with PKCE only — for desktop MCP clients, SPAs, and mobile apps that can’t hold a secret. - Confidential clients (
client_secret_basic/client_secret_post) authenticate with a client secret and PKCE. The secret is hashed at rest (SHA-256) and returned once at creation; it can never be recovered. Use a confidential client for server-side integrations so a stolen refresh token can’t be redeemed without the secret. - Confidential clients are issued only by an authenticated team admin via the dashboard. Open Dynamic Client Registration (
POST /oauth/register) is public-only — anonymous callers can never obtain a secret.
Outreach webhook verification
When you subscribe to Outreach Webhooks, Sight AI signs every POST with an HMAC-SHA256 signature in theSightAI-Signature header (format: t=<unix>,v1=<hex>). Always verify the signature before processing the payload — an unverified webhook could be a forged request from anyone who knows your endpoint URL.
The signing secret is shown once at subscription creation. Store it in your environment and never expose it in client-side code or logs. See Webhooks → Verifying the signature for Node.js and Python verification code.
API-key-trusted sender semantics
When you push a message into the Outreach Agent viaPOST /api/v1/sites/{siteId}/outreach/inbox/messages, the from field you supply is treated as the prospect’s email address — Sight AI does not verify that the email actually belongs to the person your platform claims it does. The API key holder is a trusted forwarder (analogous to a team member forwarding an email), so the platform is responsible for the accuracy of the from field.
A compromised API key could inject arbitrary “forwarded” messages and cause the agent to send replies to arbitrary addresses. Mitigations:
- Rotate exposed keys immediately via the Developers page.
- Use minimum scopes — a key with only
inbox:writecan’t read analytics or trigger other agents. - Restrict to specific sites at key creation time when possible.
- The per-site daily ingestion cap (default 500/day) bounds the blast radius.
- The suppression list + noreply filter + agent triage are still honored regardless of the sender.