API reference

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.
POST/v1/hooks/slack/commands

/caity <question>: answered privately (the command's response URL).

Auth
None.

Errors

  • 401Bad signature
curl -X POST 'https://api.cactive.com.au/v1/hooks/slack/commands'
Send it from this page with your session or a key.
POST/v1/hooks/slack/events

The Events API: mentions and direct messages (questions), shared links (previews), and the app leaving.

Auth
None.

Errors

  • 400Bad body
  • 401Bad signature
curl -X POST 'https://api.cactive.com.au/v1/hooks/slack/events'
Send it from this page with your session or a key.

Response 200

{
  challenge: string
}
POST/v1/hooks/teams/messages

Microsoft Teams' activities (Bot Framework, signed with its JWTs): channels the bot is added to, questions for Caity, link previews. No platform token.

Auth
None.

Errors

  • 400Bad body
  • 400Bad service URL
  • 401Unauthorized
  • 413Too large
  • 503Not set up
curl -X POST 'https://api.cactive.com.au/v1/hooks/teams/messages'
Send it from this page with your session or a key.

Response 200

{}
| {
  composeExtension: {
    type: string
    attachmentLayout: string
    attachments: {
      contentType: string
      content: {
        tap: {
          type: string
          value: string
        }
        text?: string
        title: string
      }
      preview: {
        contentType: string
        content: {
          tap: {
            type: string
            value: string
          }
          text?: string
          title: string
        }
      }
    }[]
  }
}
GET/v1/orgs/:orgId/integrations/sources

The 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/sources' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  sources: {
    provider: "jira" | "linear" | "github" | "gitlab" | "zendesk" | "stripe" | "hubspot" | "salesforce"
    name: string
    target: "tasks" | "crm"
    connect: "token" | "oauth"
    available: boolean
    connected: boolean
    accountName?: string
    baseUrl?: string
    login?: string
    connectedAt?: number
    connectedBy?: string
  }[]
  specs: {
    name: string
    connect: "token" | "oauth"
    fields: {
      id: "email" | "host" | "site"
      label: string
      hint: string
      optional?: boolean
    }[]
    tokenLabel: string
    tokenHelp: string
    target: "tasks"
    project: string
    provider: "jira" | "linear" | "github" | "gitlab" | "zendesk" | "stripe" | "hubspot" | "salesforce"
  } | {
    name: string
    connect: "token" | "oauth"
    fields: {
      id: "email" | "host" | "site"
      label: string
      hint: string
      optional?: boolean
    }[]
    tokenLabel: string
    tokenHelp: string
    target: "crm"
    objects: {
      id: string
      label: string
    }[]
    provider: "jira" | "linear" | "github" | "gitlab" | "zendesk" | "stripe" | "hubspot" | "salesforce"
  }[]
}
PUT/v1/orgs/:orgId/integrations/sources/:provider

Connects 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Request body

  • tokenstringrequired

    8–2,000 characters. Trimmed.

  • sitestring

    Up to 200 characters. Trimmed.

  • emailstring

    Up to 320 characters. Trimmed.

  • hoststring

    Up to 300 characters. Trimmed.

Also checked: Unknown fields are rejected.

Errors

  • 403Connecting needs a signed-in person.
  • 404Unknown import source.
curl -X PUT 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/sources/{provider}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "token": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  provider: "jira" | "linear" | "github" | "gitlab" | "zendesk" | "stripe" | "hubspot" | "salesforce"
  name: string
  target: "tasks" | "crm"
  connect: "token" | "oauth"
  available: boolean
  connected: boolean
  accountName?: string
  baseUrl?: string
  login?: string
  connectedAt?: number
  connectedBy?: string
}
DELETE/v1/orgs/:orgId/integrations/sources/:provider

Forgets an import source's token (Salesforce's sign-in is revoked there first); imports still running stop at their next step. Owners and admins.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown import source.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/sources/{provider}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/orgs/:orgId/integrations/sources/:provider/projects

What 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown import source.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/sources/{provider}/projects' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  projects: {
    id: string
    name: string
  }[]
}
GET/v1/orgs/:orgId/integrations/imports

Imports into Tasks, newest first (space: one space's, by key or id), with their counts, last problems and status.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Query parameters

  • spacestring

    Up to 64 characters.

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/imports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  imports: {
    importId: string
    provider: "jira" | "linear" | "github" | "gitlab" | "zendesk"
    source: string
    project: string
    projectName?: string
    spaceId: string
    spaceKey: string
    closed: boolean
    comments: boolean
    status: "queued" | "done" | "failed" | "running" | "cancelled"
    counts: {
      seen: number
      created: number
      skipped: number
      failed: number
      comments: number
    }
    problems: string[]
    message?: string
    startedBy: string
    startedAt: number
    finishedAt?: number
  }[]
}
GET/v1/orgs/:orgId/integrations/imports/:importId

One import into Tasks: its source project, space, options, status, counts and problems.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • importId

    Takeout import id (imp_…); under me/food a Food import (fim_…); under vehicles an import of a car's history (vim_…), as the imports list gives it.

Errors

  • 404That import isn't here.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/imports/{importId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  importId: string
  provider: "jira" | "linear" | "github" | "gitlab" | "zendesk"
  source: string
  project: string
  projectName?: string
  spaceId: string
  spaceKey: string
  closed: boolean
  comments: boolean
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    skipped: number
    failed: number
    comments: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}
POST/v1/orgs/:orgId/integrations/imports

Starts 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • provider"jira" | "linear" | "github" | "gitlab" | "zendesk"required
  • projectstringrequired

    1–200 characters. Trimmed.

  • projectNamestring

    Up to 200 characters. Trimmed.

  • spacestringrequired

    1–64 characters. Trimmed.

  • closedboolean

    Default true.

  • commentsboolean

    Default true.

Also checked: Unknown fields are rejected.

Errors

  • 403Imports run as a signed-in person.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/imports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "provider": "jira",
    "project": "example",
    "space": "example"
  }'
Send it from this page with your session or a key.

Response 201

{
  importId: string
  provider: "jira" | "linear" | "github" | "gitlab" | "zendesk"
  source: string
  project: string
  projectName?: string
  spaceId: string
  spaceKey: string
  closed: boolean
  comments: boolean
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    skipped: number
    failed: number
    comments: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}
POST/v1/orgs/:orgId/integrations/imports/:importId/cancel

Stops an import after its current page; what it imported stays. Owners and admins.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • importId

    Takeout import id (imp_…); under me/food a Food import (fim_…); under vehicles an import of a car's history (vim_…), as the imports list gives it.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/imports/{importId}/cancel' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  importId: string
  provider: "jira" | "linear" | "github" | "gitlab" | "zendesk"
  source: string
  project: string
  projectName?: string
  spaceId: string
  spaceKey: string
  closed: boolean
  comments: boolean
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    skipped: number
    failed: number
    comments: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}
GET/v1/orgs/:orgId/integrations

The catalogue, the org's connections and the events a channel can carry.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  catalogue: {
    id: string
    name: string
    area: "identity" | "crm" | "chat" | "support" | "automation" | "dev" | "home" | "productivity" | "accounting" | "storage"
    status: "exists" | "available" | "later"
    auth: string
    flow: string
    where?: string
  }[]
  connections: {
    provider: "teams" | "slack"
    name: string
    available: boolean
    connected: boolean
    accountId?: string
    accountName?: string
    settings: {
      channel?: {
        id: string
        name: string
        serviceUrl?: string
      }
      events: string[]
      ask: boolean
      unfurl: boolean
    }
    connectedAt?: number
    connectedBy?: string
  }[]
  noticeEvents: ["deployment.failed", "deployment.ready", "domain.verified", "domain.failed", "secret.rotation_due", "issue.sla_breached", "pipeline.failed", "pipeline.approval", "security.git_key", "security.git_clone", "tenant.domain", "agent.job_failed", "marketing.approval"]
}
GET/v1/orgs/:orgId/integrations/:provider

One chat connection (slack or teams): whether it's connected, to which workspace or Microsoft organisation, and its settings. Tokens are never returned.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown integration.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  provider: "teams" | "slack"
  name: string
  available: boolean
  connected: boolean
  accountId?: string
  accountName?: string
  settings: {
    channel?: {
      id: string
      name: string
      serviceUrl?: string
    }
    events: string[]
    ask: boolean
    unfurl: boolean
  }
  connectedAt?: number
  connectedBy?: string
}
POST/v1/orgs/:orgId/integrations/:provider/authorize

Starts connecting: the provider's sign-in URL (one-time state, 10 minutes).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Request body

  • returnTostring

    Up to 500 characters.

Errors

  • 403Connecting needs a signed-in person.
  • 404Unknown integration.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}/authorize' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "returnTo": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  url: string
}
GET/v1/orgs/:orgId/integrations/:provider/channels

Channels the org can send notices to.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown integration.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}/channels' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  channels: {
    id: string
    name: string
    serviceUrl?: string
    private?: boolean
    teamName?: string
  }[]
}
PATCH/v1/orgs/:orgId/integrations/:provider

Changes 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Request body

  • channelIdstringor null

    1–200 characters.

  • events("deployment.failed" | "deployment.ready" | "domain.verified" | "domain.failed" | "secret.rotation_due" | "issue.sla_breached" | "pipeline.failed" | "pipeline.approval" | "security.git_key" | "security.git_clone" | "tenant.domain" | "agent.job_failed" | "marketing.approval")[]

    Up to 13 items.

  • askboolean
  • unfurlboolean

Also checked: Unknown fields are rejected.

Errors

  • 404Unknown integration.
curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "channelId": "<channelId>",
    "events": [
      "deployment.failed"
    ],
    "ask": true
  }'
Send it from this page with your session or a key.

Response 200

{
  settings: {
    channel?: {
      id: string
      name: string
      serviceUrl?: string
    }
    events: string[]
    ask: boolean
    unfurl: boolean
  }
}
DELETE/v1/orgs/:orgId/integrations/:provider

Disconnects: revokes at the provider (best effort) and forgets the tokens, links and channels.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown integration.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/orgs/:orgId/integrations/:provider/people

The org's people linked in the workspace (Caity answers and links unfurl as them).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

Errors

  • 404Unknown integration.
curl 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}/people' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  people: {
    externalUserId: string
    externalName?: string
    userId: string
    name?: string
    email?: string
    linkedAt?: number
  }[]
}
DELETE/v1/orgs/:orgId/integrations/:provider/people/:externalUserId

Unlinks a chat account from its person: Caity stops answering it as them and its links stop previewing. Owners and admins.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • provider

    GIF provider: klipy or giphy.

  • externalUserId

    A chat account's id in its workspace: Slack's user id (U…), or the person's Entra object id in Teams.

Errors

  • 404Unknown integration.
  • 404That link isn't here.
curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/integrations/{provider}/people/{externalUserId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

GET/v1/orgs/:orgId/webhooks

The organisation's outgoing webhooks: name, URL, events, on or off, and the secret's last four characters.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  webhooks: {
    webhookId: string
    name: string
    url: string
    events: string[]
    enabled: boolean
    secretHint: string
    createdAt?: number
    updatedAt?: number
  }[]
}
POST/v1/orgs/:orgId/webhooks

Adds 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • namestringrequired

    1–100 characters. Trimmed.

  • urlstringrequired

    1–2,000 characters. Trimmed.

  • eventsstring[]required

    1–100 items. Each up to 80 characters.

  • enabledbooleanrequired
  • enabledany JSON

Also checked: Unknown fields are rejected.

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Example",
    "url": "https://example.com",
    "events": [
      "example"
    ],
    "enabled": true
  }'
Send it from this page with your session or a key.

Response 201

{
  webhook: {
    webhookId: string
    name: string
    url: string
    events: string[]
    enabled: boolean
    secretHint: string
    createdAt?: number
    updatedAt?: number
  }
  secret: string
}
PATCH/v1/orgs/:orgId/webhooks/:webhookId

Changes a webhook's name, URL, events or whether it's on. Owners and admins.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • webhookId

    Webhook id (whk_…).

Request body

  • nameany JSON
  • urlany JSON
  • eventsany JSON
  • enabledany JSON

Also checked: Unknown fields are rejected.

curl -X PATCH 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks/{webhookId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "name": {},
    "url": {},
    "events": {}
  }'
Send it from this page with your session or a key.

Response 200

{
  webhook: {
    webhookId: string
    name: string
    url: string
    events: string[]
    enabled: boolean
    secretHint: string
    createdAt?: number
    updatedAt?: number
  }
}
POST/v1/orgs/:orgId/webhooks/:webhookId/rotate

A new secret, shown once; the old one stops signing.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • webhookId

    Webhook id (whk_…).

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks/{webhookId}/rotate' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  webhook: {
    webhookId: string
    name: string
    url: string
    events: string[]
    enabled: boolean
    secretHint: string
    createdAt?: number
    updatedAt?: number
  }
  secret: string
}
POST/v1/orgs/:orgId/webhooks/:webhookId/ping

Sends a ping now, signed like every delivery.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • webhookId

    Webhook id (whk_…).

curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks/{webhookId}/ping' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  ok: boolean
  status: number
  error?: string
  ms: number
} | {
  ok: boolean
  status?: undefined
  error: string
  ms: number
}
GET/v1/orgs/:orgId/webhooks/:webhookId/deliveries

A webhook's last 50 deliveries (30 days): event, status or error, try and time.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • webhookId

    Webhook id (whk_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks/{webhookId}/deliveries' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  deliveries: {
    deliveryId: string
    event: string
    ok: boolean
    status?: number
    error?: string
    attempt: number
    ms?: number
    at?: number
  }[]
}
DELETE/v1/orgs/:orgId/webhooks/:webhookId

Removes a webhook; its deliveries stop. Owners and admins.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • webhookId

    Webhook id (whk_…).

curl -X DELETE 'https://api.cactive.com.au/v1/orgs/{orgId}/webhooks/{webhookId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 204 with no body

POST/v1/integrations/oauth

Finishes 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Request body

  • statestringrequired

    10–300 characters.

  • codestring

    1–4,000 characters.

  • errorstring

    Up to 200 characters.

Errors

  • 403Connecting needs a signed-in person.
curl -X POST 'https://api.cactive.com.au/v1/integrations/oauth' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "state": "example"
  }'
Send it from this page with your session or a key.

Response 200

{
  orgId: string
  provider: "teams" | "slack" | "salesforce"
  connected: false
  returnTo: string
  accountName?: undefined
} | {
  orgId: string
  provider: "salesforce"
  connected: true
  accountName: string
  returnTo: string
} | {
  orgId: string
  provider: "teams" | "slack"
  connected: true
  accountName: string
  returnTo: string
}
GET/v1/orgs/:orgId/crm/source-imports

Imports 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).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/crm/source-imports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  imports: {
    importId: string
    provider: "stripe" | "hubspot" | "salesforce"
    source: string
    account: string
    objects: string[]
    object?: string
    status: "queued" | "done" | "failed" | "running" | "cancelled"
    counts: {
      seen: number
      created: number
      updated: number
      linked: number
      skipped: number
      failed: number
    }
    problems: string[]
    message?: string
    startedBy: string
    startedAt: number
    finishedAt?: number
  }[]
}
GET/v1/orgs/:orgId/crm/source-imports/:importId

One import into Customers, as the list gives it. Customers admins (crm:admin).

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • importId

    Takeout import id (imp_…); under me/food a Food import (fim_…); under vehicles an import of a car's history (vim_…), as the imports list gives it.

curl 'https://api.cactive.com.au/v1/orgs/{orgId}/crm/source-imports/{importId}' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  importId: string
  provider: "stripe" | "hubspot" | "salesforce"
  source: string
  account: string
  objects: string[]
  object?: string
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    updated: number
    linked: number
    skipped: number
    failed: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}
POST/v1/orgs/:orgId/crm/source-imports

Starts 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.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

Request body

  • provider"stripe" | "hubspot" | "salesforce"required
  • objectsstring[]

    Up to 10 items. Each 1–40 characters.

Also checked: Unknown fields are rejected.

Errors

  • 403Imports run as a signed-in person.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/crm/source-imports' \
  -H "Authorization: Bearer $CACTIVE_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "provider": "stripe"
  }'
Send it from this page with your session or a key.

Response 201

{
  importId: string
  provider: "stripe" | "hubspot" | "salesforce"
  source: string
  account: string
  objects: string[]
  object?: string
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    updated: number
    linked: number
    skipped: number
    failed: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}
POST/v1/orgs/:orgId/crm/source-imports/:importId/cancel

Stops an import into Customers after its current page; what it imported stays. Owners and admins with crm:write.

Auth
A person's token or an API key, as Authorization: Bearer.
Get an API key

Path parameters

  • orgId

    Organization id (org_…).

  • importId

    Takeout import id (imp_…); under me/food a Food import (fim_…); under vehicles an import of a car's history (vim_…), as the imports list gives it.

Errors

  • 403Imports run as a signed-in person.
curl -X POST 'https://api.cactive.com.au/v1/orgs/{orgId}/crm/source-imports/{importId}/cancel' \
  -H "Authorization: Bearer $CACTIVE_TOKEN"
Send it from this page with your session or a key.

Response 200

{
  importId: string
  provider: "stripe" | "hubspot" | "salesforce"
  source: string
  account: string
  objects: string[]
  object?: string
  status: "queued" | "done" | "failed" | "running" | "cancelled"
  counts: {
    seen: number
    created: number
    updated: number
    linked: number
    skipped: number
    failed: number
  }
  problems: string[]
  message?: string
  startedBy: string
  startedAt: number
  finishedAt?: number
}