API

Integrations and webhooks

Connect Slack and Microsoft Teams, import from Jira, Linear, GitHub, GitLab and Zendesk into Tasks and from Stripe, HubSpot and Salesforce into Customers, and send your organization's events to Zapier, Make, n8n or any HTTPS address.

Owners and admins connect Slack, Microsoft Teams and import sources and manage webhooks; tenant:read sees them. Tokens and secrets are never returned: a webhook's signing secret is in the answer that makes or replaces it, and nowhere else.

Importing into Tasks

Connect a source with a token made there: a Jira Cloud API token (with your site and the account's email), a Linear API key, a GitHub fine-grained token with read access to Issues and Metadata, a GitLab token with read_api (and your host, for a self-managed GitLab), or a Zendesk API token (with your <name>.zendesk.com site and the agent's email; its projects are groups, or all). GET …/integrations/sources/:provider/projects lists what it reads; POST …/integrations/imports imports one into a Tasks space you administer, in the background, as you.

Types, statuses, priorities, labels, people (matched by email), parents and comments come across, and each issue links back to its source. Importing the same project into the same space again brings only what's new. Follow progress with GET …/integrations/imports/:importId, or from MCP with issues_imports_list.

Importing into Customers

Connect Stripe with a restricted key that reads Customers, Subscriptions, Invoices and Products (a secret key is refused), HubSpot with a private app's access token (crm.objects.companies.read, crm.objects.contacts.read, crm.objects.deals.read, crm.objects.owners.read), or Salesforce through its sign-in (POST …/integrations/salesforce/authorize, then the browser comes back through Tenant). POST /v1/orgs/:orgId/crm/source-imports with provider and, optionally, objects starts an import as you; follow it with GET …/crm/source-imports/:importId, or from MCP with crm_imports_list.

Stripe's customers become accounts with a contact, and their subscriptions and invoices activities on both; HubSpot's companies, contacts and deals and Salesforce's accounts, contacts, leads and opportunities become their namesakes. Each record's description ends with a link back. Matches already here (accounts by name, contacts and leads by email) are linked rather than copied. Running an import again changes a field only where the source changed it and nobody here did since.

Webhooks

Webhook events are your organization's audit actions (member.join), whole categories (member.*) or *. Each delivery is a JSON POST with x-cactive-event, x-cactive-delivery (the same on every retry) and x-cactive-signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">. A failed delivery is tried again after 1, 5 and 30 minutes and two hours; a 4xx other than 408 or 429 isn't retried.

Every route below, with its parameters, request and response, errors and samples, is in the API reference.

RouteWhat it does
POST /v1/hooks/slack/commands/caity <question>: answered privately (the command's response URL).
POST /v1/hooks/slack/eventsThe Events API: mentions and direct messages (questions), shared links (previews), and the app leaving.
POST /v1/hooks/teams/messagesMicrosoft Teams' activities (Bot Framework, signed with its JWTs): channels the bot is added to, questions for Caity, link previews. No platform token.
GET /v1/orgs/:orgId/integrations/sourcesThe import sources, for Tasks (Jira, Linear, GitHub, GitLab, Zendesk) and Customers (Stripe, HubSpot, Salesforce): whether each is connected and as which account, whether it takes a token or a sign-in (and whether that's set up here), with what connecting one needs. Tokens are never returned.
PUT /v1/orgs/:orgId/integrations/sources/:providerConnects an import source with a token: Jira and Zendesk also take their site (<name>.atlassian.net, <name>.zendesk.com) and the account's email, GitLab its host (empty for gitlab.com); Stripe takes a restricted key only. The token is checked with the provider and sealed; it replaces an earlier one. Salesforce connects through POST …/integrations/salesforce/authorize instead. Owners and admins.
DELETE /v1/orgs/:orgId/integrations/sources/:providerForgets an import source's token (Salesforce's sign-in is revoked there first); imports still running stop at their next step. Owners and admins.
GET /v1/orgs/:orgId/integrations/sources/:provider/projectsWhat a Tasks source's token reads, to import from: Jira projects, Linear teams, GitHub repositories with issues, GitLab projects, Zendesk groups (and all; 200 at most), each with the id an import names. Owners and admins.
GET /v1/orgs/:orgId/integrations/importsImports into Tasks, newest first (space: one space's, by key or id), with their counts, last problems and status.
GET /v1/orgs/:orgId/integrations/imports/:importIdOne import into Tasks: its source project, space, options, status, counts and problems.
POST /v1/orgs/:orgId/integrations/importsStarts importing a source project's issues (and, by default, closed ones and comments) into a space you administer, run in the background as you. Imported issues link back and are skipped when imported again. Owners and admins with issues:write; three running at once.
POST /v1/orgs/:orgId/integrations/imports/:importId/cancelStops an import after its current page; what it imported stays. Owners and admins.
GET /v1/orgs/:orgId/integrationsThe catalogue, the org's connections and the events a channel can carry.
GET /v1/orgs/:orgId/integrations/:providerOne chat connection (slack or teams): whether it's connected, to which workspace or Microsoft organisation, and its settings. Tokens are never returned.
POST /v1/orgs/:orgId/integrations/:provider/authorizeStarts connecting: the provider's sign-in URL (one-time state, 10 minutes).
GET /v1/orgs/:orgId/integrations/:provider/channelsChannels the org can send notices to.
PATCH /v1/orgs/:orgId/integrations/:providerChanges a chat connection's settings: the notice channel (one the channels list offers), which org-wide events go there, and whether Caity answers and links preview. Owners and admins.
DELETE /v1/orgs/:orgId/integrations/:providerDisconnects: revokes at the provider (best effort) and forgets the tokens, links and channels.
GET /v1/orgs/:orgId/integrations/:provider/peopleThe org's people linked in the workspace (Caity answers and links unfurl as them).
DELETE /v1/orgs/:orgId/integrations/:provider/people/:externalUserIdUnlinks a chat account from its person: Caity stops answering it as them and its links stop previewing. Owners and admins.
GET /v1/orgs/:orgId/webhooksThe organisation's outgoing webhooks: name, URL, events, on or off, and the secret's last four characters.
POST /v1/orgs/:orgId/webhooksAdds a webhook: an https URL and the events it wants (audit actions such as member.join, categories such as member.*, or *). The signing secret is in this answer only. Owners and admins.
PATCH /v1/orgs/:orgId/webhooks/:webhookIdChanges a webhook's name, URL, events or whether it's on. Owners and admins.
POST /v1/orgs/:orgId/webhooks/:webhookId/rotateA new secret, shown once; the old one stops signing.
POST /v1/orgs/:orgId/webhooks/:webhookId/pingSends a ping now, signed like every delivery.
GET /v1/orgs/:orgId/webhooks/:webhookId/deliveriesA webhook's last 50 deliveries (30 days): event, status or error, try and time.
DELETE /v1/orgs/:orgId/webhooks/:webhookIdRemoves a webhook; its deliveries stop. Owners and admins.
POST /v1/integrations/oauthFinishes connecting Slack, Teams or Salesforce with the provider's code (or error) and the state the connect started with. The state is used once, by the person who started it, still an owner or admin.
GET /v1/orgs/:orgId/crm/source-importsImports into Customers from Stripe, HubSpot and Salesforce, newest first: the source account, objects, status, counts (seen, created, updated since an earlier import, linked to a match, skipped, failed) and last problems. Customers admins (crm:admin).
GET /v1/orgs/:orgId/crm/source-imports/:importIdOne import into Customers, as the list gives it. Customers admins (crm:admin).
POST /v1/orgs/:orgId/crm/source-importsStarts importing a connected source into Customers, run in the background as you: provider (stripe, hubspot, salesforce) and, optionally, which of its objects (taken in the source's order: accounts before the contacts and deals on them). Records link back; matches already here (accounts by name, contacts and leads by email) are linked, not copied; importing again changes a field only where the source changed it and nobody here did. Owners and admins with crm:write; three imports run at once.
POST /v1/orgs/:orgId/crm/source-imports/:importId/cancelStops an import into Customers after its current page; what it imported stays. Owners and admins with crm:write.