curl --request POST \
--url https://api.conare.ai/api/v1/connectors/{type} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"endUserId": "u_123",
"baseUrl": "https://crm.example.com",
"apiKey": "the end user's Twenty API key"
}
EOF{
"success": true,
"type": "hubspot",
"objects": 123,
"objectNames": [
"<string>"
]
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}Connect a source
Connect a source whose catalog entry says connect: "credentials":
your app collects the end user’s credentials and posts them here.
twenty takes baseUrl + apiKey (an instance API key); granola
takes apiKey alone (a grn_ REST key — Granola is cloud-hosted,
and the key needs a Granola Business plan).
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.
curl --request POST \
--url https://api.conare.ai/api/v1/connectors/{type} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"endUserId": "u_123",
"baseUrl": "https://crm.example.com",
"apiKey": "the end user's Twenty API key"
}
EOF{
"success": true,
"type": "hubspot",
"objects": 123,
"objectNames": [
"<string>"
]
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}{
"statusCode": 123,
"code": "<string>",
"message": "<string>",
"requestId": "<string>",
"details": {}
}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 API key for the source (Twenty: an instance API
key; Granola: a grn_ REST key). Validated live against the
source before being stored; never echoed back.
Twenty CRM only (required there): the end user's instance URL. Granola is cloud-hosted — omit.
Twenty CRM only: 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.
Granola has no collections — passing this fails with 400
collections_not_supported.
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"
Twenty CRM only: number of syncable objects discovered on the instance.
Twenty CRM only: 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.