> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Twenty CRM

The Twenty CRM connector lets your AI agent act in each user's Twenty CRM account. Each user connects their own Twenty CRM access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 30 tools.

**Authentication:** Bearer Token
**Categories:** CRM & Sales
**Tools:** 30: 15 read, 10 write, 5 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=TWENTY)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Twenty CRM connection

   In **AgentKit > Connections**, create a Twenty CRM connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'twenty'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Twenty CRM:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'twenty_list_companies',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "twenty"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Twenty CRM:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="twenty_list_companies",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Twenty CRM credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'twenty_get_company',
  toolInput: {
    id: '<id>',
  },
  connector: 'twenty',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="twenty_get_company",
    tool_input={
        "id": "<id>",
    },
    connection_name="twenty",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `twenty_get_company`

Get Company · Read-only

Retrieve a single company record in Twenty by id.
Returns data.company with the record's fields and, at depth 1, its related records.
Use twenty_get_company when the id is known. Use twenty_list_companies to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the company record.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_get_note`

Get Note · Read-only

Retrieve a single note record in Twenty by id.
Returns data.note with the record's fields and, at depth 1, its related records.
Use twenty_get_note when the id is known. Use twenty_list_notes to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the note record.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_get_object`

Get Data Model Object · Read-only

Retrieve one object type from the Twenty workspace data model by id, including its field definitions.
Returns data.object with nameSingular, namePlural, labels, flags and its fields.
Use twenty_get_object when the object id is known. Use twenty_list_objects to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the object metadata record.

Example input: `{"id":"<id>"}`

### `twenty_get_opportunity`

Get Opportunity · Read-only

Retrieve a single opportunity record in Twenty by id.
Returns data.opportunity with the record's fields and, at depth 1, its related records.
Use twenty_get_opportunity when the id is known. Use twenty_list_opportunities to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the opportunity record.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_get_person`

Get Person · Read-only

Retrieve a single person record in Twenty by id.
Returns data.person with the record's fields and, at depth 1, its related records.
Use twenty_get_person when the id is known. Use twenty_list_people to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the person record.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_get_task`

Get Task · Read-only

Retrieve a single task record in Twenty by id.
Returns data.task with the record's fields and, at depth 1, its related records.
Use twenty_get_task when the id is known. Use twenty_list_tasks to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the task record.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_get_workspace_member`

Get Workspace Member · Read-only

Retrieve a single workspace member in Twenty by id.
Returns data.workspaceMember with the member's name, email, locale and time zone.
Use twenty_get_workspace_member when the id is known. Use twenty_list_workspace_members to find ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the workspace member.
- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.

Example input: `{"id":"<id>"}`

### `twenty_list_companies`

List Companies · Read-only

List companies records in Twenty with optional filtering, ordering and cursor pagination.
Returns data.companies (array of company records), pageInfo (hasNextPage, startCursor, endCursor) and totalCount.
Use twenty_list_companies to browse or filter. Use twenty_get_company to fetch one record by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: name[ilike]:"%acme%"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_fields`

List Data Model Fields · Read-only

List field definitions across all objects in the Twenty workspace data model, including custom fields.
Returns data.fields (name, label, type, objectMetadataId, isNullable, options and settings), pageInfo and totalCount.
Use twenty_list_fields to see which fields a record type accepts, for example before filtering or writing custom fields.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_notes`

List Notes · Read-only

List notes records in Twenty with optional filtering, ordering and cursor pagination.
Returns data.notes (array of note records), pageInfo (hasNextPage, startCursor, endCursor) and totalCount.
Use twenty_list_notes to browse or filter. Use twenty_get_note to fetch one record by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: title[ilike]:"%call%"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_objects`

List Data Model Objects · Read-only

List the object types in the Twenty workspace data model, including built-in objects such as people and companies and any custom objects.
Returns data.objects (nameSingular, namePlural, labels, isCustom, isActive and fields), pageInfo and totalCount.
Use twenty_list_objects to discover which record types exist in a workspace. Use twenty_list_fields to inspect field definitions.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_opportunities`

List Opportunities · Read-only

List opportunities records in Twenty with optional filtering, ordering and cursor pagination.
Returns data.opportunities (array of opportunity records), pageInfo (hasNextPage, startCursor, endCursor) and totalCount.
Use twenty_list_opportunities to browse or filter. Use twenty_get_opportunity to fetch one record by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: stage[eq]:"PROPOSAL"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_people`

List People · Read-only

List people records in Twenty with optional filtering, ordering and cursor pagination.
Returns data.people (array of person records), pageInfo (hasNextPage, startCursor, endCursor) and totalCount.
Use twenty_list_people to browse or filter. Use twenty_get_person to fetch one record by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: name.firstName[eq]:"Ada"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_tasks`

List Tasks · Read-only

List tasks records in Twenty with optional filtering, ordering and cursor pagination.
Returns data.tasks (array of task records), pageInfo (hasNextPage, startCursor, endCursor) and totalCount.
Use twenty_list_tasks to browse or filter. Use twenty_get_task to fetch one record by id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: status[eq]:"TODO"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_list_workspace_members`

List Workspace Members · Read-only

List the members of the Twenty workspace with optional filtering and cursor pagination.
Returns data.workspaceMembers (id, name, userEmail and related fields), pageInfo and totalCount.
Use twenty_list_workspace_members to find the ids needed for owner and assignee fields on companies, opportunities and tasks.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `depth` (`integer`, optional): Level of related records to include. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `ending_before` (`string`, optional): Cursor for the previous page. Pass the startCursor value from the pageInfo of the previous response.
- `filter` (`string`, optional): Filter expression in the form field[COMPARATOR]:value. Combine conditions with commas (AND) or wrap them in or(...), and(...). Strings are quoted. Comparators include eq, neq, in, is, gt, gte, lt, lte, startsWith, like and ilike. Example: userEmail[eq]:"ada@example.com"
- `limit` (`integer`, optional): Maximum number of records to return per page. The API default is 60 and the maximum is 60. Default: `60`.
- `order_by` (`string`, optional): Sort order as comma-separated fields with an optional direction in brackets: AscNullsFirst, AscNullsLast, DescNullsFirst or DescNullsLast. Example: createdAt[DescNullsLast]
- `starting_after` (`string`, optional): Cursor for the next page. Pass the endCursor value from the pageInfo of the previous response.

Example input: `{}`

### `twenty_create_company`

Create Company · Write

Create a new company record in Twenty. Every field is optional, so send only the values to set.
Returns data.createCompany with the new record, including its id.
Use twenty_create_company for a new record. Use twenty_update_company to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `account_owner_id` (`string`, optional): UUID of the workspace member who owns the account. Use twenty_list_workspace_members to find it.
- `address_city` (`string`, optional): City of the company address.
- `address_country` (`string`, optional): Country of the company address.
- `address_postcode` (`string`, optional): Postal code of the company address.
- `address_state` (`string`, optional): State or region of the company address.
- `address_street1` (`string`, optional): First line of the street address.
- `arr_amount_micros` (`number`, optional): Annual recurring revenue in micros, where 1,000,000 micros equals one currency unit.
- `arr_currency_code` (`string`, optional): ISO 4217 currency code for the annual recurring revenue.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `domain_url` (`string`, optional): Company website URL.
- `employees` (`integer`, optional): Number of employees.
- `ideal_customer_profile` (`boolean`, optional): Whether the company matches the ideal customer profile.
- `linkedin_url` (`string`, optional): URL of the company's LinkedIn page.
- `name` (`string`, optional): Company name.
- `x_url` (`string`, optional): URL of the company's X (Twitter) profile.

Example input: `{}`

### `twenty_create_note`

Create Note · Write

Create a new note record in Twenty. Every field is optional, so send only the values to set.
Returns data.createNote with the new record, including its id.
Use twenty_create_note for a new record. Use twenty_update_note to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body_markdown` (`string`, optional): Note body as Markdown text.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `title` (`string`, optional): Note title.

Example input: `{}`

### `twenty_create_opportunity`

Create Opportunity · Write

Create a new opportunity record in Twenty. Every field is optional, so send only the values to set.
Returns data.createOpportunity with the new record, including its id.
Use twenty_create_opportunity for a new record. Use twenty_update_opportunity to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `amount_micros` (`number`, optional): Opportunity amount in micros, where 1,000,000 micros equals one currency unit.
- `close_date` (`string`, optional): Expected close date as an ISO 8601 datetime.
- `company_id` (`string`, optional): UUID of the company the opportunity belongs to. Use twenty_list_companies to find it.
- `currency_code` (`string`, optional): ISO 4217 currency code for the amount.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `name` (`string`, optional): Opportunity name.
- `owner_id` (`string`, optional): UUID of the workspace member who owns the opportunity. Use twenty_list_workspace_members to find it.
- `point_of_contact_id` (`string`, optional): UUID of the person who is the point of contact. Use twenty_list_people to find it.
- `stage` (`string`, optional): Pipeline stage of the opportunity. One of: `NEW`, `SCREENING`, `MEETING`, `PROPOSAL`, `CUSTOMER`.

Example input: `{}`

### `twenty_create_person`

Create Person · Write

Create a new person record in Twenty. Every field is optional, so send only the values to set.
Returns data.createPerson with the new record, including its id.
Use twenty_create_person for a new record. Use twenty_update_person to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `city` (`string`, optional): City where the person is based.
- `company_id` (`string`, optional): UUID of the company the person works for. Use twenty_list_companies to find it.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `email` (`string`, optional): Primary email address of the person.
- `first_name` (`string`, optional): Person's first name.
- `job_title` (`string`, optional): Person's job title.
- `last_name` (`string`, optional): Person's last name.
- `linkedin_url` (`string`, optional): URL of the person's LinkedIn profile.
- `phone_calling_code` (`string`, optional): International calling code including the plus sign, for the phone number.
- `phone_number` (`string`, optional): Primary phone number without the calling code.
- `x_url` (`string`, optional): URL of the person's X (Twitter) profile.

Example input: `{}`

### `twenty_create_task`

Create Task · Write

Create a new task record in Twenty. Every field is optional, so send only the values to set.
Returns data.createTask with the new record, including its id.
Use twenty_create_task for a new record. Use twenty_update_task to change an existing one.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `assignee_id` (`string`, optional): UUID of the workspace member assigned to the task. Use twenty_list_workspace_members to find it.
- `body_markdown` (`string`, optional): Task description as Markdown text.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `due_at` (`string`, optional): Due date as an ISO 8601 datetime.
- `status` (`string`, optional): Task status. One of: `TODO`, `IN_PROGRESS`, `DONE`.
- `title` (`string`, optional): Task title.

Example input: `{}`

### `twenty_update_company`

Update Company · Write

Update an existing company record in Twenty. Send only the fields to change; omitted fields are left as they are.
Returns data.updateCompany with the updated record.
Use twenty_update_company to change a record by id. Use twenty_create_company to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the company record to update.
- `account_owner_id` (`string`, optional): UUID of the workspace member who owns the account. Use twenty_list_workspace_members to find it.
- `address_city` (`string`, optional): City of the company address.
- `address_country` (`string`, optional): Country of the company address.
- `address_postcode` (`string`, optional): Postal code of the company address.
- `address_state` (`string`, optional): State or region of the company address.
- `address_street1` (`string`, optional): First line of the street address.
- `arr_amount_micros` (`number`, optional): Annual recurring revenue in micros, where 1,000,000 micros equals one currency unit.
- `arr_currency_code` (`string`, optional): ISO 4217 currency code for the annual recurring revenue.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `domain_url` (`string`, optional): Company website URL.
- `employees` (`integer`, optional): Number of employees.
- `ideal_customer_profile` (`boolean`, optional): Whether the company matches the ideal customer profile.
- `linkedin_url` (`string`, optional): URL of the company's LinkedIn page.
- `name` (`string`, optional): Company name.
- `x_url` (`string`, optional): URL of the company's X (Twitter) profile.

Example input: `{"id":"<id>"}`

### `twenty_update_note`

Update Note · Write

Update an existing note record in Twenty. Send only the fields to change; omitted fields are left as they are.
Returns data.updateNote with the updated record.
Use twenty_update_note to change a record by id. Use twenty_create_note to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the note record to update.
- `body_markdown` (`string`, optional): Note body as Markdown text.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `title` (`string`, optional): Note title.

Example input: `{"id":"<id>"}`

### `twenty_update_opportunity`

Update Opportunity · Write

Update an existing opportunity record in Twenty. Send only the fields to change; omitted fields are left as they are.
Returns data.updateOpportunity with the updated record.
Use twenty_update_opportunity to change a record by id. Use twenty_create_opportunity to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the opportunity record to update.
- `amount_micros` (`number`, optional): Opportunity amount in micros, where 1,000,000 micros equals one currency unit.
- `close_date` (`string`, optional): Expected close date as an ISO 8601 datetime.
- `company_id` (`string`, optional): UUID of the company the opportunity belongs to. Use twenty_list_companies to find it.
- `currency_code` (`string`, optional): ISO 4217 currency code for the amount.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `name` (`string`, optional): Opportunity name.
- `owner_id` (`string`, optional): UUID of the workspace member who owns the opportunity. Use twenty_list_workspace_members to find it.
- `point_of_contact_id` (`string`, optional): UUID of the person who is the point of contact. Use twenty_list_people to find it.
- `stage` (`string`, optional): Pipeline stage of the opportunity. One of: `NEW`, `SCREENING`, `MEETING`, `PROPOSAL`, `CUSTOMER`.

Example input: `{"id":"<id>"}`

### `twenty_update_person`

Update Person · Write

Update an existing person record in Twenty. Send only the fields to change; omitted fields are left as they are.
Returns data.updatePerson with the updated record.
Use twenty_update_person to change a record by id. Use twenty_create_person to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the person record to update.
- `city` (`string`, optional): City where the person is based.
- `company_id` (`string`, optional): UUID of the company the person works for. Use twenty_list_companies to find it.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `email` (`string`, optional): Primary email address of the person.
- `first_name` (`string`, optional): Person's first name.
- `job_title` (`string`, optional): Person's job title.
- `last_name` (`string`, optional): Person's last name.
- `linkedin_url` (`string`, optional): URL of the person's LinkedIn profile.
- `phone_calling_code` (`string`, optional): International calling code including the plus sign, for the phone number.
- `phone_number` (`string`, optional): Primary phone number without the calling code.
- `x_url` (`string`, optional): URL of the person's X (Twitter) profile.

Example input: `{"id":"<id>"}`

### `twenty_update_task`

Update Task · Write

Update an existing task record in Twenty. Send only the fields to change; omitted fields are left as they are.
Returns data.updateTask with the updated record.
Use twenty_update_task to change a record by id. Use twenty_create_task to add a new one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the task record to update.
- `assignee_id` (`string`, optional): UUID of the workspace member assigned to the task. Use twenty_list_workspace_members to find it.
- `body_markdown` (`string`, optional): Task description as Markdown text.
- `depth` (`integer`, optional): Level of related records to include in the response. 0 returns only the record, 1 also includes its direct relations. One of: `0`, `1`. Default: `1`.
- `due_at` (`string`, optional): Due date as an ISO 8601 datetime.
- `status` (`string`, optional): Task status. One of: `TODO`, `IN_PROGRESS`, `DONE`.
- `title` (`string`, optional): Task title.

Example input: `{"id":"<id>"}`

### `twenty_delete_company`

Delete Company · Destructive

Delete a company record in Twenty by id. With soft_delete true the record is moved to the trash; otherwise it is deleted permanently.
Returns data.deleteCompany with the id of the deleted record.
Use twenty_delete_company to remove a record. Prefer soft_delete true when the deletion may need to be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the company record to delete.
- `soft_delete` (`boolean`, optional): If true, the record is soft deleted and can be restored. If false, the record is deleted permanently. The API default is false, which is permanent. Default: `false`.

Example input: `{"id":"<id>"}`

### `twenty_delete_note`

Delete Note · Destructive

Delete a note record in Twenty by id. With soft_delete true the record is moved to the trash; otherwise it is deleted permanently.
Returns data.deleteNote with the id of the deleted record.
Use twenty_delete_note to remove a record. Prefer soft_delete true when the deletion may need to be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the note record to delete.
- `soft_delete` (`boolean`, optional): If true, the record is soft deleted and can be restored. If false, the record is deleted permanently. The API default is false, which is permanent. Default: `false`.

Example input: `{"id":"<id>"}`

### `twenty_delete_opportunity`

Delete Opportunity · Destructive

Delete a opportunity record in Twenty by id. With soft_delete true the record is moved to the trash; otherwise it is deleted permanently.
Returns data.deleteOpportunity with the id of the deleted record.
Use twenty_delete_opportunity to remove a record. Prefer soft_delete true when the deletion may need to be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the opportunity record to delete.
- `soft_delete` (`boolean`, optional): If true, the record is soft deleted and can be restored. If false, the record is deleted permanently. The API default is false, which is permanent. Default: `false`.

Example input: `{"id":"<id>"}`

### `twenty_delete_person`

Delete Person · Destructive

Delete a person record in Twenty by id. With soft_delete true the record is moved to the trash; otherwise it is deleted permanently.
Returns data.deletePerson with the id of the deleted record.
Use twenty_delete_person to remove a record. Prefer soft_delete true when the deletion may need to be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the person record to delete.
- `soft_delete` (`boolean`, optional): If true, the record is soft deleted and can be restored. If false, the record is deleted permanently. The API default is false, which is permanent. Default: `false`.

Example input: `{"id":"<id>"}`

### `twenty_delete_task`

Delete Task · Destructive

Delete a task record in Twenty by id. With soft_delete true the record is moved to the trash; otherwise it is deleted permanently.
Returns data.deleteTask with the id of the deleted record.
Use twenty_delete_task to remove a record. Prefer soft_delete true when the deletion may need to be undone.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `id` (`string`, required): UUID of the task record to delete.
- `soft_delete` (`boolean`, optional): If true, the record is soft deleted and can be restored. If false, the record is deleted permanently. The API default is false, which is permanent. Default: `false`.

Example input: `{"id":"<id>"}`

## Related

Other CRM & Sales connectors ([all 97](/agentkit/connectors/?category=crm-sales)):

- [Insightly](/agentkit/connectors/insightly/): Scalekit connector, API key, 108 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Salesforce](/agentkit/connectors/salesforce/): Scalekit connector, OAuth, 74 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
