Attio
Modern CRM for managing people, companies, and custom objects
Attio
Connect to Attio for flexible CRM automation with custom objects, lists, notes, and tasks.
Overview
Attio is a modern, data-driven CRM. The integration supports:
- Objects - Custom and standard object schemas
- Records - People, companies, and custom records
- Notes - Notes attached to records
- Tasks - Tasks with assignees and deadlines
- Lists - Kanban boards and pipelines
- Workspace - Team and member management
Prerequisites
- Attio workspace
- API access enabled
- OAuth app or API key configured
Authentication
Attio uses OAuth 2.0 for authentication via Nango.
curl "http://localhost:3000/api/v1/connections/attio/auth-url" \
-H "x-api-key: YOUR_API_KEY"Available Actions
Object Actions
listObjects
List all objects (schema) in the workspace.
{
"action": "attio.listObjects",
"config": {}
}getObject
Get object definition by slug.
{
"action": "attio.getObject",
"config": {
"objectSlug": "people"
}
}Record Actions
getRecord
Get record by ID.
{
"action": "attio.getRecord",
"config": {
"objectSlug": "companies",
"recordId": "{{input.companyId}}"
}
}createRecord
Create a new record.
{
"action": "attio.createRecord",
"config": {
"objectSlug": "custom_object",
"data": {
"values": {
"name": [{ "value": "{{input.name}}" }],
"email": [{ "email_address": "{{input.email}}" }]
}
},
"matchingAttribute": "email"
}
}Note: Attio uses a values-based format where each attribute contains an array of value objects.
updateRecord
Update an existing record.
{
"action": "attio.updateRecord",
"config": {
"objectSlug": "companies",
"recordId": "{{input.companyId}}",
"data": {
"values": {
"industry": [{ "value": "Technology" }],
"employee_count": [{ "value": 150 }]
}
}
}
}deleteRecord
Delete a record.
{
"action": "attio.deleteRecord",
"config": {
"objectSlug": "companies",
"recordId": "{{input.companyId}}"
}
}listRecords
List records for an object with filters.
{
"action": "attio.listRecords",
"config": {
"objectSlug": "people",
"filter": {
"email_addresses": { "$contains": "@company.com" }
},
"sorts": [
{ "attribute": "created_at", "direction": "desc" }
],
"limit": 50,
"offset": 0
}
}searchRecords
Search records using text query.
{
"action": "attio.searchRecords",
"config": {
"objectSlug": "people",
"query": "{{input.searchTerm}}"
}
}People Actions
getPerson
Get person by ID.
{
"action": "attio.getPerson",
"config": {
"personId": "{{input.personId}}"
}
}createPerson
Create a new person with formatted data.
{
"id": "create-person",
"type": "action",
"action": "attio.createPerson",
"config": {
"name": "{{input.firstName}} {{input.lastName}}",
"emailAddresses": ["{{input.email}}"],
"phoneNumbers": ["{{input.phone}}"],
"jobTitle": "{{input.title}}",
"description": "Created via workflow",
"matchingAttribute": "email_addresses",
"customAttributes": {
"source": [{ "value": "workflow" }]
}
}
}Parameters:
| Field | Type | Description |
|---|---|---|
name | string/object | Full name or {first_name, last_name} |
emailAddresses | string/array | Email address(es) |
phoneNumbers | string/array | Phone number(s) |
jobTitle | string | Job title |
description | string | Description |
matchingAttribute | string | Attribute for deduplication |
customAttributes | object | Custom attributes in Attio format |
updatePerson
Update an existing person.
{
"action": "attio.updatePerson",
"config": {
"personId": "{{input.personId}}",
"jobTitle": "{{input.newTitle}}",
"phoneNumbers": ["{{input.newPhone}}"]
}
}listPeople
List people with filters.
{
"action": "attio.listPeople",
"config": {
"filter": {
"job_title": { "$contains": "CEO" }
},
"limit": 100
}
}Company Actions
getCompany
Get company by ID.
{
"action": "attio.getCompany",
"config": {
"companyId": "{{input.companyId}}"
}
}createCompany
Create a new company.
{
"id": "create-company",
"type": "action",
"action": "attio.createCompany",
"config": {
"name": "{{input.companyName}}",
"domains": ["{{input.domain}}"],
"description": "{{input.description}}",
"industry": "{{input.industry}}",
"employeeCount": "{{input.employees}}",
"matchingAttribute": "domains"
}
}updateCompany
Update an existing company.
{
"action": "attio.updateCompany",
"config": {
"companyId": "{{input.companyId}}",
"industry": "Technology",
"employeeCount": 500
}
}listCompanies
List companies with filters.
{
"action": "attio.listCompanies",
"config": {
"filter": {
"industry": { "$eq": "Technology" }
},
"limit": 50
}
}Note Actions
createNote
Create a note on a record.
{
"action": "attio.createNote",
"config": {
"parentObject": "people",
"parentRecordId": "{{input.personId}}",
"title": "Meeting Notes",
"content": "Discussed {{input.topic}}. Next steps: {{input.nextSteps}}"
}
}getNote
Get note by ID.
{
"action": "attio.getNote",
"config": {
"noteId": "{{input.noteId}}"
}
}listNotes
List notes for a record.
{
"action": "attio.listNotes",
"config": {
"parentObject": "companies",
"parentRecordId": "{{input.companyId}}",
"limit": 20
}
}deleteNote
Delete a note.
{
"action": "attio.deleteNote",
"config": {
"noteId": "{{input.noteId}}"
}
}Task Actions
createTask
Create a task.
{
"id": "create-task",
"type": "action",
"action": "attio.createTask",
"config": {
"content": "Follow up with {{input.contactName}}",
"deadline": "{{input.dueDate}}",
"assignees": ["{{input.ownerId}}"],
"linkedRecords": [
{
"target_object": "people",
"target_record_id": "{{input.personId}}"
}
]
}
}Parameters:
| Field | Type | Description |
|---|---|---|
content | string | Task description |
deadline | string | ISO 8601 date or null |
assignees | array | User/member IDs |
linkedRecords | array | Records to link |
isCompleted | boolean | Completion status |
getTask
Get task by ID.
{
"action": "attio.getTask",
"config": {
"taskId": "{{input.taskId}}"
}
}updateTask
Update a task.
{
"action": "attio.updateTask",
"config": {
"taskId": "{{input.taskId}}",
"isCompleted": true,
"deadline": "{{input.newDeadline}}"
}
}Note: Attio's API only allows updating is_completed, deadline_at, linked_records, and assignees.
completeTask
Mark task as completed.
{
"action": "attio.completeTask",
"config": {
"taskId": "{{input.taskId}}"
}
}listTasks
List tasks with filters.
{
"action": "attio.listTasks",
"config": {
"linkedRecordId": "{{input.companyId}}",
"isCompleted": false,
"assigneeId": "{{input.userId}}",
"limit": 50
}
}deleteTask
Delete a task.
{
"action": "attio.deleteTask",
"config": {
"taskId": "{{input.taskId}}"
}
}List Actions
getList
Get list (pipeline/kanban) by ID.
{
"action": "attio.getList",
"config": {
"listId": "{{input.listId}}"
}
}listLists
List all lists.
{
"action": "attio.listLists",
"config": {}
}getListEntries
Get entries from a list.
{
"action": "attio.getListEntries",
"config": {
"listId": "{{input.listId}}",
"filter": {
"stage": { "$eq": "qualified" }
},
"limit": 100
}
}addListEntry
Add record to a list.
{
"action": "attio.addListEntry",
"config": {
"listId": "{{input.pipelineId}}",
"parentObject": "companies",
"parentRecordId": "{{input.companyId}}",
"entryValues": {
"stage": [{ "status": "new_lead" }],
"deal_value": [{ "value": 50000 }]
}
}
}updateListEntry
Update a list entry.
{
"action": "attio.updateListEntry",
"config": {
"listId": "{{input.listId}}",
"entryId": "{{input.entryId}}",
"entryValues": {
"stage": [{ "status": "qualified" }]
}
}
}deleteListEntry
Remove entry from list.
{
"action": "attio.deleteListEntry",
"config": {
"listId": "{{input.listId}}",
"entryId": "{{input.entryId}}"
}
}Workspace Actions
getWorkspace
Get current workspace info.
{
"action": "attio.getWorkspace",
"config": {}
}listWorkspaceMembers
List workspace members.
{
"action": "attio.listWorkspaceMembers",
"config": {}
}Filter Operators
| Operator | Description |
|---|---|
$eq | Equal to |
$neq | Not equal to |
$contains | Contains text |
$not_contains | Doesn't contain |
$gt | Greater than |
$gte | Greater than or equal |
$lt | Less than |
$lte | Less than or equal |
$is_empty | Is empty |
$is_not_empty | Is not empty |
$or | OR condition |
$and | AND condition |
Example Workflow
Lead enrichment workflow:
{
"name": "Enrich New Lead",
"trigger": {
"type": "webhook",
"provider": "attio",
"events": ["record.created"]
},
"steps": [
{
"id": "check-object",
"type": "condition",
"config": {
"conditions": {
"left": "{{input.data.object}}",
"operator": "eq",
"right": "people"
},
"then": ["get-company"],
"else": []
}
},
{
"id": "get-company",
"type": "action",
"action": "attio.searchRecords",
"config": {
"objectSlug": "companies",
"query": "{{input.data.record.values.email_addresses[0].domain}}"
}
},
{
"id": "link-to-company",
"type": "condition",
"config": {
"conditions": {
"left": "{{steps.get-company.output.data.length}}",
"operator": "gt",
"right": 0
},
"then": ["create-note"],
"else": []
}
},
{
"id": "create-note",
"type": "action",
"action": "attio.createNote",
"config": {
"parentObject": "people",
"parentRecordId": "{{input.data.record.id.record_id}}",
"title": "Company Match Found",
"content": "Matched to company: {{steps.get-company.output.data[0].values.name[0].value}}"
}
},
{
"id": "create-followup",
"type": "action",
"action": "attio.createTask",
"config": {
"content": "Review new lead from {{steps.get-company.output.data[0].values.name[0].value}}",
"deadline": "{{now | dateAdd: 1, 'day'}}",
"linkedRecords": [
{
"target_object": "people",
"target_record_id": "{{input.data.record.id.record_id}}"
}
]
}
}
]
}Rate Limits
| Limit | Value |
|---|---|
| API calls | 10 requests/second |
| Bulk operations | 100 records per request |
Troubleshooting
Common Errors
| Error | Cause | Solution |
|---|---|---|
objectSlug is required | Missing object type | Specify the object slug |
recordId is required | Missing record ID | Provide the record ID |
data is required | Missing record data | Include data object |
| Invalid attribute format | Wrong value structure | Use Attio's values array format |
Attribute Value Format
Attio uses a specific format for attribute values:
{
"values": {
"text_field": [{ "value": "text" }],
"email_field": [{ "email_address": "email@example.com" }],
"phone_field": [{ "phone_number": "+1234567890" }],
"domain_field": [{ "domain": "example.com" }],
"number_field": [{ "value": 123 }],
"name_field": [{ "first_name": "John", "last_name": "Doe", "full_name": "John Doe" }]
}
}