Connect a source
Connect a source whose catalog entry says connect: "credentials"
(e.g. twenty): your app collects the end user’s credentials and
posts them here.
Credentials are validated live against the source before anything is
stored; the initial import then runs in the background. Hosted-OAuth
sources (connect: "link") use POST /api/v1/connectors/link
instead.
Authorizations
A scoped Integration key, prefixed cint_. Send as
Authorization: Bearer cint_... on every request. Server-side only.
Legacy personal cmem_... keys remain accepted during migration;
team/org-scoped cmem_... keys are not valid on this API.
Path Parameters
Data-source type id. Any source-capable type in the connector catalog
(~200 sources — Gmail, Slack, HubSpot, Notion, Linear, Salesforce,
warehouses, …); enumerate them via GET /api/v1/connectors/catalog.
^[a-z0-9][a-z0-9_-]{0,63}$"hubspot"
Body
Your stable internal user ID. No colon allowed.
1 - 128^[A-Za-z0-9@._-]{1,128}$"u_123"
The end user's instance URL (e.g. their self-hosted Twenty CRM).
The end user's API key for that instance. Validated live against the source before being stored; never echoed back.
Restrict the sync to these object ids (the id values from
GET /api/v1/connectors/{type}/collections). Omit to sync every
object the API key can read. The scope persists: later scheduled
and manual syncs honor it until changed via POST /api/v1/connectors/sync. An id the instance does not expose
fails with 400 unknown_twenty_objects, listing what exists.
1 - 100 elementsResponse
Source connected; initial import started in the background.
Data-source type id. Any source-capable type in the connector catalog
(~200 sources — Gmail, Slack, HubSpot, Notion, Linear, Salesforce,
warehouses, …); enumerate them via GET /api/v1/connectors/catalog.
^[a-z0-9][a-z0-9_-]{0,63}$"hubspot"
Number of syncable objects discovered on the instance.
Every syncable object id discovered on the instance — the
vocabulary for the objects scope, so a partner can render a
pick-list without a second call.