LoopFour

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:

FieldTypeDescription
namestring/objectFull name or {first_name, last_name}
emailAddressesstring/arrayEmail address(es)
phoneNumbersstring/arrayPhone number(s)
jobTitlestringJob title
descriptionstringDescription
matchingAttributestringAttribute for deduplication
customAttributesobjectCustom 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:

FieldTypeDescription
contentstringTask description
deadlinestringISO 8601 date or null
assigneesarrayUser/member IDs
linkedRecordsarrayRecords to link
isCompletedbooleanCompletion 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

OperatorDescription
$eqEqual to
$neqNot equal to
$containsContains text
$not_containsDoesn't contain
$gtGreater than
$gteGreater than or equal
$ltLess than
$lteLess than or equal
$is_emptyIs empty
$is_not_emptyIs not empty
$orOR condition
$andAND 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

LimitValue
API calls10 requests/second
Bulk operations100 records per request

Troubleshooting

Common Errors

ErrorCauseSolution
objectSlug is requiredMissing object typeSpecify the object slug
recordId is requiredMissing record IDProvide the record ID
data is requiredMissing record dataInclude data object
Invalid attribute formatWrong value structureUse 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" }]
  }
}