Twenty CRM node reference - all 70 operations, the credential it needs, and a worked example.
Twenty CRM REST API (Commerce/CRM). 70 operations: people, companies and opportunities (create, update, get, list, delete, find duplicates); notes and tasks including attaching them to records; attachments; workspace members; synced messages and calendar events; timeline activities; a generic record family that reaches ANY standard or custom object (find, create, batch create, update, bulk update, soft delete, restore, destroy, merge, duplicates, group-by); schema discovery over the metadata API; and webhook registration.
Credential: Twenty CRM credential - see Credentials.
Each operation below lists the role permission it needs. Role permissions are held by the ROLE assigned to the workspace API key, in Settings -> Roles. Twenty has NO OAuth scopes and no consent screen - a key is one opaque bearer string minted per workspace in Settings -> APIs, and everything it may do follows from the role behind it. Three things this catches people out on. First, there is no CREATE permission: permissions.utils.ts maps an insert onto canUpdateObjectRecords, so a role that may read but not update cannot create records either. Second, DELETE and DESTROY are different permissions on different operations - the Delete … operations soft-delete and need canSoftDeleteObjectRecords (Restore uses the same one), while Permanently destroy record needs canDestroyObjectRecords. Third, two families are gated by a SETTINGS flag rather than an object permission: the schema operations need the Data Model flag and the webhook operations need the MCP & APIs flag. And whatever else it grants, a role that does not have canBeAssignedToApiKeys cannot back an API key at all. If a run fails with a permission error, the node names the missing role permission in the error - grant it and re-run; you do not need to rebuild the workflow.
| Operation | What it does | Role permission |
|---|
createPerson | Create person | canUpdateObjectRecords on People |
updatePerson | Update person | canUpdateObjectRecords on People |
getPerson | Get person | canReadObjectRecords on People |
listPeople | List people | canReadObjectRecords on People |
deletePerson | Delete person | canSoftDeleteObjectRecords on People |
findDuplicatePeople | Find duplicate people | canReadObjectRecords on People |
| Operation | What it does | Role permission |
|---|
createCompany | Create company | canUpdateObjectRecords on Companies |
updateCompany | Update company | canUpdateObjectRecords on Companies |
getCompany | Get company | canReadObjectRecords on Companies |
listCompanies | List companies | canReadObjectRecords on Companies |
deleteCompany | Delete company | canSoftDeleteObjectRecords on Companies |
findDuplicateCompanies | Find duplicate companies | canReadObjectRecords on Companies |
| Operation | What it does | Role permission |
|---|
createOpportunity | Create opportunity | canUpdateObjectRecords on Opportunities |
updateOpportunity | Update opportunity | canUpdateObjectRecords on Opportunities |
getOpportunity | Get opportunity | canReadObjectRecords on Opportunities |
listOpportunities | List opportunities | canReadObjectRecords on Opportunities |
deleteOpportunity | Delete opportunity | canSoftDeleteObjectRecords on Opportunities |
| Operation | What it does | Role permission |
|---|
createNote | Create note | canUpdateObjectRecords on Notes (plus Note Targets when a link is set) |
updateNote | Update note | canUpdateObjectRecords on Notes |
getNote | Get note | canReadObjectRecords on Notes |
listNotes | List notes | canReadObjectRecords on Notes |
deleteNote | Delete note | canSoftDeleteObjectRecords on Notes |
linkNote | Attach note to a record | canUpdateObjectRecords on Note Targets |
listNoteTargets | List what a note is attached to | canReadObjectRecords on Note Targets |
unlinkNote | Detach note from a record | canDestroyObjectRecords on Note Targets |
| Operation | What it does | Role permission |
|---|
createTask | Create task | canUpdateObjectRecords on Tasks (plus Task Targets when a link is set) |
updateTask | Update task | canUpdateObjectRecords on Tasks |
getTask | Get task | canReadObjectRecords on Tasks |
listTasks | List tasks | canReadObjectRecords on Tasks |
deleteTask | Delete task | canSoftDeleteObjectRecords on Tasks |
linkTask | Attach task to a record | canUpdateObjectRecords on Task Targets |
listTaskTargets | List what a task is attached to | canReadObjectRecords on Task Targets |
unlinkTask | Detach task from a record | canDestroyObjectRecords on Task Targets |
| Operation | What it does | Role permission |
|---|
createAttachment | Create attachment record | canUpdateObjectRecords on Attachments |
listAttachments | List attachments | canReadObjectRecords on Attachments |
deleteAttachment | Delete attachment | canSoftDeleteObjectRecords on Attachments |
| Operation | What it does | Role permission |
|---|
listWorkspaceMembers | List workspace members | canReadObjectRecords on Workspace Members |
getWorkspaceMember | Get workspace member | canReadObjectRecords on Workspace Members |
| Operation | What it does | Role permission |
|---|
listMessages | List messages | canReadObjectRecords on Messages |
getMessage | Get message | canReadObjectRecords on Messages |
listMessageThreads | List message threads | canReadObjectRecords on Message Threads |
listMessageParticipants | List message participants | canReadObjectRecords on Message Participants |
listCalendarEvents | List calendar events | canReadObjectRecords on Calendar Events |
getCalendarEvent | Get calendar event | canReadObjectRecords on Calendar Events |
listCalendarEventParticipants | List event participants | canReadObjectRecords on Calendar Event Participants |
| Operation | What it does | Role permission |
|---|
listTimelineActivities | List timeline activities | canReadObjectRecords on Timeline Activities |
| Operation | What it does | Role permission |
|---|
listRecords | List records (legacy) | canReadObjectRecords on the object being listed (People, Opportunities or Companies) |
findManyRecords | Find many records | canReadObjectRecords on the object being addressed |
findOneRecord | Find one record | canReadObjectRecords on the object being addressed |
createRecord | Create record | canUpdateObjectRecords on the object being addressed |
createManyRecords | Create many records (batch) | canUpdateObjectRecords on the object being addressed |
updateRecord | Update record | canUpdateObjectRecords on the object being addressed |
updateManyRecords | Update many records (by filter) | canUpdateObjectRecords on the object being addressed |
deleteRecord | Delete record (soft, restorable) | canSoftDeleteObjectRecords on the object being addressed |
deleteManyRecords | Delete many records (soft, by filter) | canSoftDeleteObjectRecords on the object being addressed |
destroyRecord | Permanently destroy record | canDestroyObjectRecords on the object being addressed |
restoreRecord | Restore soft-deleted record | canSoftDeleteObjectRecords on the object being addressed |
restoreManyRecords | Restore many records (by filter) | canSoftDeleteObjectRecords on the object being addressed |
mergeRecords | Merge records | canUpdateObjectRecords on the object being addressed |
findDuplicateRecords | Find duplicate records | canReadObjectRecords on the object being addressed |
groupByRecords | Group records / aggregate | canReadObjectRecords on the object being addressed |
| Operation | What it does | Role permission |
|---|
listObjectMetadata | List objects and their fields | the Data Model settings permission on the key's role |
getObjectMetadata | Get one object's metadata | the Data Model settings permission on the key's role |
listFieldMetadata | List fields | the Data Model settings permission on the key's role |
getFieldMetadata | Get one field's metadata | the Data Model settings permission on the key's role |
| Operation | What it does | Role permission |
|---|
listWebhooks | List webhooks | the MCP & APIs settings permission on the key's role |
getWebhook | Get webhook | the MCP & APIs settings permission on the key's role |
createWebhook | Create webhook | the MCP & APIs settings permission on the key's role |
updateWebhook | Update webhook | the MCP & APIs settings permission on the key's role |
deleteWebhook | Delete webhook | the MCP & APIs settings permission on the key's role |
Write to a custom object you created this morning
Twenty has no static endpoint list — its REST API is generated from each workspace's own schema, so every object, standard or custom, answers the same record verbs under its own plural name. That is why the generic family exists: the object name is a FIELD, so a workflow reaches an object the day a user creates it, which no amount of hand-written per-entity operations could.
Set Operation to createRecord, then fill in:
| Field | Value | Notes |
|---|
objectNamePlural | warrantyClaims | The object's plural name from Settings > Data model — discover it with listObjectMetadata rather than guessing the pluralisation |
recordJson | {"name": "{{ myTrigger.reference }}", "amountMicros": "{{ myTrigger.amountMicros }}"} | Keyed by the workspace's own field names, which listFieldMetadata will tell you |
Sets {{record.id}} and {{record.record}}. Reads default to 60 rows and are silently clamped at 200, and depth accepts only 0 or 1 — both read out of Twenty's own server source rather than its docs.