twenty

Twenty CRM API for customer management. Use when user mentions "Twenty", "Twenty CRM", "open source CRM", or asks about Twenty.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "twenty" with this command: npx skills add vm0-ai/vm0-skills/vm0-ai-vm0-skills-twenty

Twenty CRM

Open-source modern CRM platform. Manage people, companies, opportunities, notes, and tasks via REST or GraphQL API.

Official docs: https://docs.twenty.com/developers/api-and-webhooks/api


When to Use

Use this skill when you need to:

  • Manage contacts (people) and companies
  • Track opportunities and deals
  • Create notes and tasks
  • Sync CRM data with other systems
  • Query CRM metadata and custom fields
  • Set up webhooks for CRM events

Prerequisites

  1. Create an account at https://app.twenty.com/
  2. Go to Settings → APIs & Webhooks to generate an API key

Set environment variables:

# For Twenty Cloud
export TWENTY_TOKEN="your-api-key"
export TWENTY_API_URL="https://api.twenty.com"

# For self-hosted instances
export TWENTY_API_URL="https://your-domain.com"

How to Use

1. List Companies

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/companies" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.companies[:3]'

With pagination:

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/companies?limit=10&offset=0" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.companies'

2. Create a Company

Write to /tmp/twenty_request.json:

{
  "name": "Acme Corp",
  "domainName": "acme.com",
  "address": "123 Main St, San Francisco, CA"
}

Then run:

curl -s -X POST "$(printenv TWENTY_API_URL)/rest/companies" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json

3. List People (Contacts)

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/people" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.people[:3]'

4. Create a Person

Write to /tmp/twenty_request.json:

{
  "name": {
    "firstName": "John",
    "lastName": "Doe"
  },
  "email": "john@example.com",
  "phone": "+1234567890"
}

Then run:

curl -s -X POST "$(printenv TWENTY_API_URL)/rest/people" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json

5. Get a Specific Record

Note: Replace {companyId} and {personId} with actual IDs obtained from the "List Companies" or "List People" endpoints above (look for the id field in the response).

# Get company by ID
curl -s -X GET "$(printenv TWENTY_API_URL)/rest/companies/{companyId}" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)"

# Get person by ID
curl -s -X GET "$(printenv TWENTY_API_URL)/rest/people/{personId}" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)"

6. Update a Record

Note: Replace {companyId} with an actual company ID from the "List Companies" endpoint above.

Write to /tmp/twenty_request.json:

{
  "name": "Acme Corporation",
  "employees": 500
}

Then run:

curl -s -X PATCH "$(printenv TWENTY_API_URL)/rest/companies/{companyId}" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json

7. Delete a Record

Note: Replace {companyId} with an actual company ID from the "List Companies" endpoint above.

curl -s -X DELETE "$(printenv TWENTY_API_URL)/rest/companies/{companyId}" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)"

8. List Notes

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/notes" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.notes[:3]'

9. Create a Note

Write to /tmp/twenty_request.json:

{
  "title": "Meeting Notes",
  "body": "Discussed Q1 roadmap and budget allocation."
}

Then run:

curl -s -X POST "$(printenv TWENTY_API_URL)/rest/notes" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json

10. List Tasks

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/tasks" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.tasks[:3]'

11. Create a Task

Write to /tmp/twenty_request.json:

{
  "title": "Follow up with client",
  "dueAt": "2025-01-15T10:00:00Z",
  "status": "TODO"
}

Then run:

curl -s -X POST "$(printenv TWENTY_API_URL)/rest/tasks" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json

12. Get Metadata (Object Schema)

List all object types and their fields:

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/metadata/objects" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.objects[] | {name: .nameSingular, fields: [.fields[].name]}'

Get metadata for a specific object:

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/metadata/objects/companies" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)"

13. GraphQL Query

Write to /tmp/twenty_request.json:

{
  "query": "query { companies(first: 5) { edges { node { id name domainName } } } }"
}

Then run:

curl -s -X POST "$(printenv TWENTY_API_URL)/graphql" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" --header "Content-Type: application/json" -d @/tmp/twenty_request.json | jq '.data.companies.edges'

API Endpoints

CategoryEndpointDescription
Core Objects/rest/companiesManage companies
/rest/peopleManage contacts
/rest/opportunitiesManage deals/opportunities
/rest/notesManage notes
/rest/tasksManage tasks
/rest/activitiesActivity timeline
Metadata/rest/metadata/objectsList all object schemas
/rest/metadata/objects/{name}Get specific object schema
/rest/metadata/picklistsGet dropdown field options
GraphQL/graphqlGraphQL endpoint

Query Parameters

ParameterDescription
limitNumber of records to return (default: 20)
offsetNumber of records to skip
filterFilter conditions (JSON)
orderBySort order

Example with filters:

curl -s -X GET "$(printenv TWENTY_API_URL)/rest/companies?filter={\"name\":{\"like\":\"%Acme%\"}}" --header "Authorization: Bearer $(printenv TWENTY_TOKEN)" | jq '.data.companies'

Response Format

{
  "data": {
  "companies": [
  {
  "id": "uuid",
  "name": "Company Name",
  "domainName": "example.com",
  "createdAt": "2025-01-01T00:00:00Z",
  "updatedAt": "2025-01-01T00:00:00Z"
  }
  ]
  },
  "pageInfo": {
  "hasNextPage": true,
  "endCursor": "cursor-string"
  }
}

Guidelines

  1. API Playground: Test API calls at Settings → APIs & Webhooks in the Twenty app
  2. Rate Limits: Cloud has rate limits; self-hosted has no limits
  3. GraphQL: Use GraphQL for complex queries with relationships
  4. REST: Use REST for simple CRUD operations
  5. Custom Objects: Twenty supports custom objects; use metadata API to discover schema
  6. Webhooks: Set up webhooks at Settings → APIs & Webhooks for real-time events

Resources

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

google-sheets

No summary provided by upstream source.

Repository SourceNeeds Review
246-vm0-ai
General

apify

No summary provided by upstream source.

Repository SourceNeeds Review
214-vm0-ai
General

hackernews

No summary provided by upstream source.

Repository SourceNeeds Review
169-vm0-ai
General

serpapi

No summary provided by upstream source.

Repository SourceNeeds Review
164-vm0-ai