Skip to main content
An integration is an OAuth’d connection between a user and a third-party app — or a custom data source you push content into yourself. Connect once; every future router.run({...}) sees the tools, on every provider.

3,000+ apps out of the box

Copass is backed by Pipedream’s app catalogover 3,000 integrations including GitHub, Slack, Notion, Linear, Gmail, Jira, HubSpot, Salesforce, Stripe, Shopify, Airtable, Zendesk, Intercom, Figma, Calendly, and every other major SaaS. Full, searchable list: pipedream.com/apps. Browse the slugs you can pass to connect():
const apps = await router.integrations.catalog({ q: 'crm' });

Connect any of them

One call runs the whole OAuth flow — mint Connect URL, open browser, catch the redirect, wait for the webhook.
import open from 'open';

await router.integrations.connect('github', {
  onConnectUrl: (url) => open(url),
});

// Same call, different app:
await router.integrations.connect('hubspot', { onConnectUrl: open });
await router.integrations.connect('stripe',  { onConnectUrl: open });
The slug is the only thing that changes across the 3,000+ apps.

Bring your own data

Not every data source is an OAuth’d SaaS app. When you want the agent to reach for something custom — your internal docs, a private database export, a CSV of support tickets, transcripts from a meeting bot — register a custom data source and ingest into it directly.
# CLI: one-shot ingestion of any folder or file
copass ingest ./company-handbook
copass ingest --source-type decision < design-doc.md
// SDK: programmatic ingestion against a named data source
await router.client.ingest.text({
  sandbox_id: process.env.COPASS_SANDBOX_ID!,
  text: 'Q3 pricing: enterprise tier bumps to $2k/seat starting 2026-04-01.',
  source_type: 'decision',
});
Once indexed, the content is part of the sandbox’s knowledge graph — agents retrieve against it the same way they retrieve against OAuth’d integrations. See Secure Storage for the data-source model and Filesystem driver for a watcher that mirrors a folder automatically.

The full facade

MethodWhat it does
connect(app, { onConnectUrl })OAuth end-to-end. Returns the new connection.
list({ app? })List active connections.
disconnect(sourceId)Revoke + archive.
reconcile({ app? })Force-sync against the provider. Idempotent — run it if a connection you expect isn’t showing up.
catalog({ q? })Browse supported apps.
All methods default to the router’s sandbox.

Next steps

  • Providers — which AI runs against these tools.
  • Events — what tool_call looks like when the agent uses one.
  • Portable Context — why the connection outlives the provider.