Skip to main content
Each integration row holds credentials + config for one delivery channel. Two ways to populate it:
  • OAuth (Slack, Linear, GitHub, Notion) — one click, captures workspace info automatically. See OAuth flow.
  • PUT (all providers) — supply credentials directly. Used by the manual key paths and by Webhook/ASC-write which don’t have an OAuth flow.

Providers

GET — list

Returns metadata only — credentials are never exposed:

PUT — upsert

Body: Every PUT triggers a connectivity test against the provider before saving. If the test fails, the request returns 422 INTEGRATION_TEST_FAILED and nothing is persisted.

DELETE

Removes the row entirely. To temporarily disable, use PUT with enabled: false instead.

Enabling integrations on the agent

Setting credentials is necessary but not sufficient. The integration is only used by the agent if it’s listed in preferences.enabledIntegrations:
This two-step (credentials + enable) lets you pre-provision integrations without immediately turning them on.

Errors

  • 400 INVALID_PROVIDER — unknown provider
  • 400 MISSING_CREDENTIAL — required credential field absent
  • 422 INTEGRATION_TEST_FAILED — credentials are wrong or endpoint is unreachable

OAuth flow (Slack, Linear, GitHub, Notion)

The return_to URL is validated against an allowlist of host prefixes (open-redirect guard). Defaults: https://app.appeeky.com, https://api.appeeky.com, http://localhost. Configure via COFOUNDER_OAUTH_RETURN_TO_ALLOWLIST. After a successful callback the row in cofounder_integrations is upserted with:
  • auth_method = 'oauth'
  • oauth_account_label, oauth_external_id, oauth_scope populated from the provider
  • encrypted_credentials.accessToken (and provider-specific aliases like botToken for Slack)
Re-running the OAuth flow for the same provider overwrites the row — useful when switching workspaces. See OAuth (recommended) for the full flow + frontend code example.

Per-provider details

See the integration-specific docs: