Docs
Under the hood

Connectors

Stale learns by reading where work already happens. Every connector reduces its raw events to the same thing, then trust is decided at the door.

Push and pull

Push connectors wait: Slack events, forwarded email and webhooks arrive when something happens. Pull connectors fetch: you choose repos, projects or pages and press Sync, and anything already seen is skipped.

At a glance

ConnectorModeReadsTrustedUntrustedYou need
SlackPushMessages in channels the bot is invited to, liveYour workspace membersSlack Connect, outside guests, other apps’ botsSigning secret + bot token
EmailPushSubject and plain-text body of forwarded mailSenders at the domains you listEveryone else, including look-alike domainsA mail rule or inbound parse service
WebhookPushAny JSON you POSTWhatever you decide per callSet untrusted: trueThe integration secret
GitHubPullIssues, pull requests and their commentsOwners, members, collaboratorsDrive-by commenters on public reposFine-grained token, read access
JiraPullIssues and comments in chosen projectsYour teamService-desk customersAtlassian Cloud site, email, API token
NotionPullText of pages shared with the integrationPages in your workspace–Internal integration secret

Each connector has a step-by-step guide on its page under Integrations inside the app.

Send anything: the generic webhook

If a tool can send a POST, it can teach Stale. Create a Webhook integration to get an address and a secret, then:

curl -X POST https://YOUR-HOST/api/hooks/generic/int_xxxx \ -H "x-stale-secret: YOUR_SECRET" \ -H "content-type: application/json" \ -d '{"source":"CRM","author":"Dana","text":"The renewal price is $9,000 per year."}'

Or call ingest directly

With an API key you can skip integrations entirely:

curl -X POST https://YOUR-HOST/api/v1/ingest \ -H "Authorization: Bearer sk_YOUR_KEY" \ -H "content-type: application/json" \ -d '{"kind":"manual","source":"Pricing sheet","text":"Support SLA is 4 hours for premium customers."}'
FieldMeaning
textRequired. Up to 20,000 characters.
sourceRequired. Where it was said. Messages with the same value share one Source.
kindslack · webhook · email · upload · manual · github · jira · notion · drive. Default manual.
authorWho said it. Kept with the quote.
untrustedSet true if it came from outside the company.
externalIdYour own dedupe key. Sending the same one twice is a no-op.
url, tsLink back to the original, and when it was said (ms since epoch).

The response says what happened to each claim: added, confirmed, updated (with how many things went stale) or queued for review.

What happens to your tokens

Connection secrets are encrypted at rest with AES-256-GCM using your workspace’s STALE_SECRET. Webhook secrets are compared in constant time. Slack requests must carry a valid signature or they’re rejected.