# Attio

> Read and write the Attio CRM: find, create, update and delete records on any object, file them onto lists, and keep notes and tasks against them.

App · CRM Systems · 20 actions. Web page: https://docs.lodol.com/docs/integrations/attio

## Actions

### Add record to list

Put an existing record onto a list, optionally setting the list's own attributes for it at the same time - a stage, an owner, a value. Returns the new entry's ID.

**Inputs**

- List (`list`, text, required): Which list to work with. Pick from the list; the value sent is the list's API slug.
- Record's object (`parent_object`, text, required): Which object the record being added belongs to.
- Record ID (`parent_record_id`, text, required): The record to add. Paste its app.attio.com link or its ID.
- List attribute values (`entry_values`, object): The list's own attributes to set on this entry, keyed by API slug. Run "List attributes" with the target set to a list to see them. Leave empty to add the record with nothing else set.

**Outputs**

- `entry` (object): The new entry
- `entry_id` (text): Its ID
- `entry_values` (object): The list attributes set on the entry
- `list` (text): The list it is on
- `list_id` (text): That list's ID
- `parent_object` (text): The record's object
- `parent_record_id` (text): The record that was added

**Example output**

```json
{
  "entry": {
    "created_at": "2026-08-14T09:13:01.000000000Z",
    "entry_values": {},
    "id": {
      "entry_id": "2e6e29ea-c4e0-4f44-842c-3fbdc4dcd0e1",
      "list_id": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "parent_object": "people",
    "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
  },
  "entry_id": "2e6e29ea-c4e0-4f44-842c-3fbdc4dcd0e1",
  "entry_values": {},
  "list": "sales_pipeline",
  "list_id": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0",
  "parent_object": "people",
  "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### Create note

Write a note onto a record - a call summary, a piece of research, anything worth keeping against the person or company. The body can be plain text or markdown.

**Inputs**

- Record's object (`parent_object`, text, required): Which object the record being noted belongs to.
- Record ID (`parent_record_id`, text, required): The record to attach the note to. Paste its app.attio.com link or its ID.
- Title (`title`, text, required): The note's title. Plain text, with no formatting.
- Content (`content`, text, required): The body of the note.
- Content format (`format`, text): How to read the body. Markdown supports headings, lists, styling and links - but not images. One of: `plaintext` (Plain text), `markdown`. Default: `plaintext`.
- Backdate to (`created_at`, date and time): Record the note as having been written at this time, for migrating history in from somewhere else. Leave empty to stamp it with now.

**Outputs**

- `content_markdown` (text): The body as markdown
- `content_plaintext` (text): The body as plain text
- `note` (object): The new note
- `note_id` (text): Its ID
- `parent_object` (text): The record's object
- `parent_record_id` (text): The record it is on
- `title` (text): Its title

**Example output**

```json
{
  "content_markdown": "Walked through the pilot. **Follow up in a week.**",
  "content_plaintext": "Walked through the pilot. Follow up in a week.",
  "note": {
    "content_markdown": "Walked through the pilot. **Follow up in a week.**",
    "content_plaintext": "Walked through the pilot. Follow up in a week.",
    "created_at": "2026-08-14T09:14:20.000000000Z",
    "created_by_actor": {
      "id": null,
      "type": "api-token"
    },
    "id": {
      "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "meeting_id": null,
    "parent_object": "people",
    "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
    "tags": [],
    "title": "Intro call"
  },
  "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70",
  "parent_object": "people",
  "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "title": "Intro call"
}
```

### Create or update record

Update the record whose matching attribute already holds this value, or create it if there isn't one - the usual way to sync people in by email address or companies by domain. The matching attribute has to be one Attio marks unique, and its value has to be among the values you send.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Match on attribute (`matching_attribute`, text, required): The API slug of the attribute used to find an existing record - 'email_addresses' for people, 'domains' for companies. It must be an attribute Attio marks unique; "List attributes" shows which ones are.
- Attribute values (`values`, object, required): The attributes to set, keyed by their API slug - for example {"name": "Lovelace, Ada", "email_addresses": "ada@example.com", "job_title": "Analyst"}. Run "List attributes" against this object to see the slugs it has. A personal name given as plain text must be written "Last, First": text without a comma is stored as a first name only.

**Outputs**

- `matching_attribute` (text): The attribute matched on
- `object` (text): The object it is on
- `object_id` (text): Its object's ID
- `record` (object): The record created or updated
- `record_id` (text): Its ID
- `values` (object): Its attribute values, keyed by API slug
- `web_url` (text): Where to open it in Attio

**Example output**

```json
{
  "matching_attribute": "email_addresses",
  "object": "people",
  "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
  "record": {
    "created_at": "2026-08-14T09:12:33.481000000Z",
    "id": {
      "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "values": {
      "email_addresses": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "email-address",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "email_address": "ada@example.com"
        }
      ],
      "job_title": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "text",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "value": "Analyst"
        }
      ],
      "name": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "personal-name",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "first_name": "Ada",
          "full_name": "Ada Lovelace",
          "last_name": "Lovelace"
        }
      ]
    },
    "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
  },
  "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "values": {
    "email_addresses": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "email-address",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "email_address": "ada@example.com"
      }
    ],
    "job_title": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "text",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "value": "Analyst"
      }
    ],
    "name": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "personal-name",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "first_name": "Ada",
        "full_name": "Ada Lovelace",
        "last_name": "Lovelace"
      }
    ]
  },
  "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### Create record

Add a record to an object - a new person, company, deal or anything else the workspace tracks. Set whichever attributes you have, keyed by their API slug. Returns the new record with its ID and its Attio link.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Attribute values (`values`, object, required): The attributes to set, keyed by their API slug - for example {"name": "Lovelace, Ada", "email_addresses": "ada@example.com", "job_title": "Analyst"}. Run "List attributes" against this object to see the slugs it has. A personal name given as plain text must be written "Last, First": text without a comma is stored as a first name only.

**Outputs**

- `object` (text): The object it is on
- `object_id` (text): Its object's ID
- `record` (object): The new record
- `record_id` (text): Its ID
- `values` (object): Its attribute values, keyed by API slug
- `web_url` (text): Where to open it in Attio

**Example output**

```json
{
  "object": "people",
  "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
  "record": {
    "created_at": "2026-08-14T09:12:33.481000000Z",
    "id": {
      "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "values": {
      "email_addresses": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "email-address",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "email_address": "ada@example.com"
        }
      ],
      "job_title": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "text",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "value": "Analyst"
        }
      ],
      "name": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "personal-name",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "first_name": "Ada",
          "full_name": "Ada Lovelace",
          "last_name": "Lovelace"
        }
      ]
    },
    "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
  },
  "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "values": {
    "email_addresses": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "email-address",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "email_address": "ada@example.com"
      }
    ],
    "job_title": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "text",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "value": "Analyst"
      }
    ],
    "name": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "personal-name",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "first_name": "Ada",
        "full_name": "Ada Lovelace",
        "last_name": "Lovelace"
      }
    ]
  },
  "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### Create task

Create a task, optionally due on a date, about a record and assigned to someone. The text is plain only - Attio supports no formatting, links or @-mentions in a task - and cannot be changed once the task exists.

**Inputs**

- Task (`content`, text, required): What needs doing. Plain text, up to 2000 characters. This cannot be edited afterwards.
- Due (`deadline_at`, date and time): When the task is due. Leave empty for no deadline.
- Already done (`is_completed`, true/false): Create the task already ticked off. Usually left off. Default: `false`.
- Linked record's object (`linked_object`, text): Which object the linked record belongs to. Required whenever a linked record ID is given.
- Linked record ID (`linked_record_id`, text): The record the task is about. Paste its app.attio.com link or its ID.
- Assignees (`assignees`, list): Who the task is for. Only workspace members can be assigned a task.

**Outputs**

- `assignees` (list): Who it is for
- `content_plaintext` (text): The task's text
- `deadline_at` (text): When it is due, if it is
- `is_completed` (true/false): Whether it is done
- `linked_records` (list): The records it is about
- `task` (object): The new task
- `task_id` (text): Its ID

**Example output**

```json
{
  "assignees": [
    {
      "referenced_actor_id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
      "referenced_actor_type": "workspace-member"
    }
  ],
  "content_plaintext": "Follow up on the pilot",
  "deadline_at": "2026-09-01T15:00:00.000000000Z",
  "is_completed": false,
  "linked_records": [
    {
      "target_object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "target_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
    }
  ],
  "task": {
    "assignees": [
      {
        "referenced_actor_id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
        "referenced_actor_type": "workspace-member"
      }
    ],
    "completed_at": null,
    "content_plaintext": "Follow up on the pilot",
    "created_at": "2026-08-14T09:15:44.000000000Z",
    "created_by_actor": {
      "id": null,
      "type": "api-token"
    },
    "deadline_at": "2026-09-01T15:00:00.000000000Z",
    "id": {
      "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "is_completed": false,
    "linked_records": [
      {
        "target_object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
        "target_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
      }
    ]
  },
  "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11"
}
```

### Delete note

Permanently delete a note. The record it was on is untouched.

**Inputs**

- Note ID (`note_id`, text, required): The note to delete.

**Outputs**

- `deleted` (true/false): True once Attio has deleted it
- `note_id` (text): The note that was deleted

**Example output**

```json
{
  "deleted": true,
  "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70"
}
```

### Delete record

Permanently delete a record. This cannot be undone, and it takes the record's notes, tasks and list entries with it.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Record ID (`record_id`, text, required): The record's ID. Paste the record's app.attio.com link if that is what you have - the ID is read out of it. 'List records' returns these in 'record_ids'.

**Outputs**

- `deleted` (true/false): True once Attio has deleted it
- `object` (text): The object it was on
- `record_id` (text): The record that was deleted

**Example output**

```json
{
  "deleted": true,
  "object": "people",
  "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### Delete task

Permanently delete a task. The record it was about is untouched.

**Inputs**

- Task ID (`task_id`, text, required): The task to delete.

**Outputs**

- `deleted` (true/false): True once Attio has deleted it
- `task_id` (text): The task that was deleted

**Example output**

```json
{
  "deleted": true,
  "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11"
}
```

### Get note

Read one note in full - its title, the record it is on, and its body in both plain text and markdown.

**Inputs**

- Note ID (`note_id`, text, required): The note to read. "List notes" returns these in 'note_ids'.

**Outputs**

- `content_markdown` (text): The body as markdown
- `content_plaintext` (text): The body as plain text
- `note` (object): The note
- `note_id` (text): Its ID
- `parent_object` (text): The record's object
- `parent_record_id` (text): The record it is on
- `title` (text): Its title

**Example output**

```json
{
  "content_markdown": "Walked through the pilot. **Follow up in a week.**",
  "content_plaintext": "Walked through the pilot. Follow up in a week.",
  "note": {
    "content_markdown": "Walked through the pilot. **Follow up in a week.**",
    "content_plaintext": "Walked through the pilot. Follow up in a week.",
    "created_at": "2026-08-14T09:14:20.000000000Z",
    "created_by_actor": {
      "id": null,
      "type": "api-token"
    },
    "id": {
      "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "meeting_id": null,
    "parent_object": "people",
    "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
    "tags": [],
    "title": "Intro call"
  },
  "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70",
  "parent_object": "people",
  "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "title": "Intro call"
}
```

### Get record

Read one record and every attribute value on it. Accepts the record's ID or the app.attio.com link it was copied from.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Record ID (`record_id`, text, required): The record's ID. Paste the record's app.attio.com link if that is what you have - the ID is read out of it. 'List records' returns these in 'record_ids'.

**Outputs**

- `object` (text): The object it is on
- `object_id` (text): Its object's ID
- `record` (object): The record itself
- `record_id` (text): Its ID
- `values` (object): Its attribute values, keyed by API slug
- `web_url` (text): Where to open it in Attio

**Example output**

```json
{
  "object": "people",
  "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
  "record": {
    "created_at": "2026-08-14T09:12:33.481000000Z",
    "id": {
      "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "values": {
      "email_addresses": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "email-address",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "email_address": "ada@example.com"
        }
      ],
      "job_title": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "text",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "value": "Analyst"
        }
      ],
      "name": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "personal-name",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "first_name": "Ada",
          "full_name": "Ada Lovelace",
          "last_name": "Lovelace"
        }
      ]
    },
    "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
  },
  "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "values": {
    "email_addresses": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "email-address",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "email_address": "ada@example.com"
      }
    ],
    "job_title": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "text",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "value": "Analyst"
      }
    ],
    "name": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "personal-name",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "first_name": "Ada",
        "full_name": "Ada Lovelace",
        "last_name": "Lovelace"
      }
    ]
  },
  "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### List attributes

List the attributes defined on one object or list - the field names a record's values are keyed by. Returns each attribute's API slug, title, type, and whether it is writable, required, unique or holds several values. Run this first when you don't know what to put in an 'Attribute values' field.

**Inputs**

- Attributes of (`target`, text, required): Whether to read an object's attributes or a list's. A list has its own attributes on top of the record's. One of: `objects` (An object (people, companies, ...)), `lists` (A list). Default: `objects`.
- Object or list (`identifier`, text, required): Which object or list to read the attributes of. The choices follow the target chosen above.
- Limit (`limit`, number): How many results to return, 1-500. Defaults to 50. From 1 to 500. Default: `50`.
- Offset (`offset`, number): How many results to skip before returning. Feed the 'next_offset' from a previous run back in here to read the next page. From 0 to 100000. Default: `0`.
- Include archived attributes (`show_archived`, true/false): Include attributes that have been archived. Off by default, since an archived attribute cannot be written. Default: `false`.

**Outputs**

- `attributes` (list): The attributes defined on this object or list
- `count` (number): Results on this page
- `has_more` (true/false): Whether a page follows
- `identifier` (text): The object or list read
- `limit` (number): Page size used
- `next_offset` (number): The 'offset' that reads the next page, or empty at the end
- `offset` (number): How many were skipped
- `target` (text): 'objects' or 'lists'

**Example output**

```json
{
  "attributes": [
    {
      "api_slug": "email_addresses",
      "created_at": "2026-01-05T11:02:10.000000000Z",
      "description": null,
      "id": {
        "attribute_id": "41252299-f8c7-4b5e-99c9-4ff8321d2f96",
        "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "is_archived": false,
      "is_multiselect": true,
      "is_required": false,
      "is_system_attribute": true,
      "is_unique": true,
      "is_writable": true,
      "title": "Email addresses",
      "type": "email-address"
    }
  ],
  "count": 1,
  "has_more": false,
  "identifier": "people",
  "limit": 50,
  "next_offset": null,
  "offset": 0,
  "target": "objects"
}
```

### List list entries

Read the entries on a list - which records are on it, and the list's own attributes for each of them, such as a stage or an owner. Filter and sort by any of those attributes.

**Inputs**

- List (`list`, text, required): Which list to work with. Pick from the list; the value sent is the list's API slug.
- Filter (`filter`, object): Narrow the results. The short form matches exactly - {"email_addresses": "ada@example.com"} - and Attio's $and/$or/$eq form works too for anything more involved. Leave empty for everything.
- Sort by attribute (`sort_attribute`, text): The API slug of the attribute to sort by, such as 'created_at' or 'name'. Leave empty for Attio's own ordering.
- Sort direction (`sort_direction`, text): Which way to sort. Only applies when an attribute is chosen. One of: `asc` (Ascending), `desc` (Descending). Default: `asc`.
- Sort by sub-field (`sort_field`, text): For an attribute made of several parts, which part to sort on - 'last_name' within a person's name, for example. Leave empty for the attribute as a whole.
- Limit (`limit`, number): How many results to return, 1-500. Defaults to 50. From 1 to 500. Default: `50`.
- Offset (`offset`, number): How many results to skip before returning. Feed the 'next_offset' from a previous run back in here to read the next page. From 0 to 100000. Default: `0`.

**Outputs**

- `count` (number): Results on this page
- `entries` (list): The matching entries
- `entry_ids` (list): Just the entry IDs, for chaining
- `has_more` (true/false): Whether a page follows
- `limit` (number): Page size used
- `list` (text): The list read
- `next_offset` (number): The 'offset' that reads the next page, or empty at the end
- `offset` (number): How many were skipped

**Example output**

```json
{
  "count": 1,
  "entries": [
    {
      "created_at": "2026-08-14T09:13:01.000000000Z",
      "entry_values": {},
      "id": {
        "entry_id": "2e6e29ea-c4e0-4f44-842c-3fbdc4dcd0e1",
        "list_id": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "parent_object": "people",
      "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
    }
  ],
  "entry_ids": [
    "2e6e29ea-c4e0-4f44-842c-3fbdc4dcd0e1"
  ],
  "has_more": false,
  "limit": 50,
  "list": "sales_pipeline",
  "next_offset": null,
  "offset": 0
}
```

### List lists

List every list in the workspace - the pipelines and working sets records get filed into. Returns each one's API slug, name, which objects it accepts, and who can see it.

**Inputs**: None.

**Outputs**

- `count` (number): How many there are
- `lists` (list): Every list the token can see
- `slugs` (list): Just the API slugs, for chaining

**Example output**

```json
{
  "count": 1,
  "lists": [
    {
      "api_slug": "sales_pipeline",
      "created_at": "2026-02-11T14:40:02.000000000Z",
      "created_by_actor": {
        "id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
        "type": "workspace-member"
      },
      "id": {
        "list_id": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "name": "Sales pipeline",
      "parent_object": [
        "people"
      ],
      "workspace_access": "read-and-write",
      "workspace_member_access": []
    }
  ],
  "slugs": [
    "sales_pipeline"
  ]
}
```

### List notes

Read notes, either across the whole workspace or just the ones on one record. Each note comes back with its title and its body in both plain text and markdown.

**Inputs**

- Record's object (`parent_object`, text): Narrow to notes on records of this object. Required if a record ID is given below.
- Record ID (`parent_record_id`, text): Narrow to notes on this one record. Leave both this and the object empty for every note in the workspace.
- Limit (`limit`, number): How many notes to return, 1-50. Attio caps this endpoint lower than the others. Defaults to 10. From 1 to 50. Default: `10`.
- Offset (`offset`, number): How many results to skip before returning. Feed the 'next_offset' from a previous run back in here to read the next page. From 0 to 100000. Default: `0`.

**Outputs**

- `count` (number): Results on this page
- `has_more` (true/false): Whether a page follows
- `limit` (number): Page size used
- `next_offset` (number): The 'offset' that reads the next page, or empty at the end
- `note_ids` (list): Just the note IDs, for chaining
- `notes` (list): The matching notes
- `offset` (number): How many were skipped

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "limit": 10,
  "next_offset": null,
  "note_ids": [
    "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70"
  ],
  "notes": [
    {
      "content_markdown": "Walked through the pilot. **Follow up in a week.**",
      "content_plaintext": "Walked through the pilot. Follow up in a week.",
      "created_at": "2026-08-14T09:14:20.000000000Z",
      "created_by_actor": {
        "id": null,
        "type": "api-token"
      },
      "id": {
        "note_id": "d1b9a1a1-8b0e-4f0c-9a5f-6f43a24e6a70",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "meeting_id": null,
      "parent_object": "people",
      "parent_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
      "tags": [],
      "title": "Intro call"
    }
  ],
  "offset": 0
}
```

### List objects

List every object in the Attio workspace - People, Companies and Deals, plus any object the workspace has added of its own. Returns each one's API slug, which is the value every other action's 'Object' field takes.

**Inputs**: None.

**Outputs**

- `count` (number): How many there are
- `objects` (list): Every object in the workspace
- `slugs` (list): Just the API slugs, for chaining

**Example output**

```json
{
  "count": 1,
  "objects": [
    {
      "api_slug": "people",
      "created_at": "2026-01-05T11:02:10.000000000Z",
      "id": {
        "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "plural_noun": "People",
      "singular_noun": "Person"
    }
  ],
  "slugs": [
    "people"
  ]
}
```

### List records

Search one object's records - every person, company, deal or whatever else the object holds - filtered and sorted however you like. Returns each record with all of its attribute values, its Attio link, and its ID, and reports the offset that reads the next page. With no filter at all this is the whole object.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Filter (`filter`, object): Narrow the results. The short form matches exactly - {"email_addresses": "ada@example.com"} - and Attio's $and/$or/$eq form works too for anything more involved. Leave empty for everything.
- Sort by attribute (`sort_attribute`, text): The API slug of the attribute to sort by, such as 'created_at' or 'name'. Leave empty for Attio's own ordering.
- Sort direction (`sort_direction`, text): Which way to sort. Only applies when an attribute is chosen. One of: `asc` (Ascending), `desc` (Descending). Default: `asc`.
- Sort by sub-field (`sort_field`, text): For an attribute made of several parts, which part to sort on - 'last_name' within a person's name, for example. Leave empty for the attribute as a whole.
- Limit (`limit`, number): How many results to return, 1-500. Defaults to 50. From 1 to 500. Default: `50`.
- Offset (`offset`, number): How many results to skip before returning. Feed the 'next_offset' from a previous run back in here to read the next page. From 0 to 100000. Default: `0`.

**Outputs**

- `count` (number): Results on this page
- `has_more` (true/false): Whether a page follows
- `limit` (number): Page size used
- `next_offset` (number): The 'offset' that reads the next page, or empty at the end
- `object` (text): The object searched
- `offset` (number): How many were skipped
- `record_ids` (list): Just the record IDs, for chaining
- `records` (list): The matching records

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "limit": 50,
  "next_offset": null,
  "object": "people",
  "offset": 0,
  "record_ids": [
    "891dcbfc-9141-415d-9b2a-2238a6cc012d"
  ],
  "records": [
    {
      "created_at": "2026-08-14T09:12:33.481000000Z",
      "id": {
        "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
        "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "values": {
        "email_addresses": [
          {
            "active_from": "2026-08-14T09:12:33.481000000Z",
            "active_until": null,
            "attribute_type": "email-address",
            "created_by_actor": {
              "id": null,
              "type": "api-token"
            },
            "email_address": "ada@example.com"
          }
        ],
        "job_title": [
          {
            "active_from": "2026-08-14T09:12:33.481000000Z",
            "active_until": null,
            "attribute_type": "text",
            "created_by_actor": {
              "id": null,
              "type": "api-token"
            },
            "value": "Analyst"
          }
        ],
        "name": [
          {
            "active_from": "2026-08-14T09:12:33.481000000Z",
            "active_until": null,
            "attribute_type": "personal-name",
            "created_by_actor": {
              "id": null,
              "type": "api-token"
            },
            "first_name": "Ada",
            "full_name": "Ada Lovelace",
            "last_name": "Lovelace"
          }
        ]
      },
      "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
    }
  ]
}
```

### List tasks

Read tasks, narrowed to one record, one assignee or one state. Each comes back with its text, its deadline, whether it is done, who it is for and what it is about.

**Inputs**

- Limit (`limit`, number): How many results to return, 1-500. Defaults to 50. From 1 to 500. Default: `50`.
- Offset (`offset`, number): How many results to skip before returning. Feed the 'next_offset' from a previous run back in here to read the next page. From 0 to 100000. Default: `0`.
- Order by (`sort`, text): What order to return the tasks in. One of: `created_at:asc` (Created, oldest first), `created_at:desc` (Created, newest first), `completed_at:asc` (Completed, oldest first), `completed_at:desc` (Completed, newest first). Default: `created_at:asc`.
- Linked record's object (`linked_object`, text): Which object the linked record belongs to. Required whenever a linked record ID is given.
- Linked record ID (`linked_record_id`, text): The record the task is about. Paste its app.attio.com link or its ID.
- Assigned to (`assignee`, text): Only tasks assigned to this workspace member. Leave empty for everyone's.
- Completed (`is_completed`, text): Whether to return open tasks, done ones, or both. One of: `any` (Both), `false` (Only tasks still open), `true` (Only completed tasks). Default: `any`.

**Outputs**

- `count` (number): Results on this page
- `has_more` (true/false): Whether a page follows
- `limit` (number): Page size used
- `next_offset` (number): The 'offset' that reads the next page, or empty at the end
- `offset` (number): How many were skipped
- `task_ids` (list): Just the task IDs, for chaining
- `tasks` (list): The matching tasks

**Example output**

```json
{
  "count": 1,
  "has_more": false,
  "limit": 50,
  "next_offset": null,
  "offset": 0,
  "task_ids": [
    "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11"
  ],
  "tasks": [
    {
      "assignees": [
        {
          "referenced_actor_id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
          "referenced_actor_type": "workspace-member"
        }
      ],
      "completed_at": null,
      "content_plaintext": "Follow up on the pilot",
      "created_at": "2026-08-14T09:15:44.000000000Z",
      "created_by_actor": {
        "id": null,
        "type": "api-token"
      },
      "deadline_at": "2026-09-01T15:00:00.000000000Z",
      "id": {
        "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11",
        "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
      },
      "is_completed": false,
      "linked_records": [
        {
          "target_object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
          "target_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
        }
      ]
    }
  ]
}
```

### Remove record from list

Take an entry off a list. The record itself is untouched - it stays on its object with everything else that points at it; only its membership of this list ends.

**Inputs**

- List (`list`, text, required): Which list to work with. Pick from the list; the value sent is the list's API slug.
- Entry ID (`entry_id`, text, required): The entry to remove. "List list entries" returns these in 'entry_ids'.

**Outputs**

- `deleted` (true/false): True once Attio has removed it
- `entry_id` (text): The entry that was removed
- `list` (text): The list it was on

**Example output**

```json
{
  "deleted": true,
  "entry_id": "2e6e29ea-c4e0-4f44-842c-3fbdc4dcd0e1",
  "list": "sales_pipeline"
}
```

### Update record

Change attribute values on a record. Only the attributes you send are touched; the rest are left alone. For an attribute that holds several values at once, choose whether to replace them or add to them.

**Inputs**

- Object (`object`, text, required): Which kind of record to work with - People, Companies, Deals, or any object this workspace has added. Pick from the list; the value sent is the object's API slug.
- Record ID (`record_id`, text, required): The record's ID. Paste the record's app.attio.com link if that is what you have - the ID is read out of it. 'List records' returns these in 'record_ids'.
- Attribute values (`values`, object, required): The attributes to set, keyed by their API slug - for example {"name": "Lovelace, Ada", "email_addresses": "ada@example.com", "job_title": "Analyst"}. Run "List attributes" against this object to see the slugs it has. A personal name given as plain text must be written "Last, First": text without a comma is stored as a first name only.
- For attributes holding several values (`multiselect_mode`, text): What to do with an attribute that already holds several values, such as a person's email addresses. Attributes holding one value are overwritten either way. One of: `overwrite` (Replace them with what I send), `append` (Add what I send, keeping the rest). Default: `overwrite`.

**Outputs**

- `multiselect_mode` (text): 'overwrite' or 'append', as chosen
- `object` (text): The object it is on
- `object_id` (text): Its object's ID
- `record` (object): The updated record
- `record_id` (text): Its ID
- `values` (object): Its attribute values, keyed by API slug
- `web_url` (text): Where to open it in Attio

**Example output**

```json
{
  "multiselect_mode": "overwrite",
  "object": "people",
  "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
  "record": {
    "created_at": "2026-08-14T09:12:33.481000000Z",
    "id": {
      "object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "values": {
      "email_addresses": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "email-address",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "email_address": "ada@example.com"
        }
      ],
      "job_title": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "text",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "value": "Analyst"
        }
      ],
      "name": [
        {
          "active_from": "2026-08-14T09:12:33.481000000Z",
          "active_until": null,
          "attribute_type": "personal-name",
          "created_by_actor": {
            "id": null,
            "type": "api-token"
          },
          "first_name": "Ada",
          "full_name": "Ada Lovelace",
          "last_name": "Lovelace"
        }
      ]
    },
    "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
  },
  "record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d",
  "values": {
    "email_addresses": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "email-address",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "email_address": "ada@example.com"
      }
    ],
    "job_title": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "text",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "value": "Analyst"
      }
    ],
    "name": [
      {
        "active_from": "2026-08-14T09:12:33.481000000Z",
        "active_until": null,
        "attribute_type": "personal-name",
        "created_by_actor": {
          "id": null,
          "type": "api-token"
        },
        "first_name": "Ada",
        "full_name": "Ada Lovelace",
        "last_name": "Lovelace"
      }
    ]
  },
  "web_url": "https://app.attio.com/lodol/person/891dcbfc-9141-415d-9b2a-2238a6cc012d"
}
```

### Update task

Change a task's deadline, tick it off, or change what it is about and who it is for. The task's text cannot be changed - Attio has no way to rewrite it - so changing the wording means creating a new task. Only the fields you set are touched.

**Inputs**

- Task ID (`task_id`, text, required): The task to change. "List tasks" returns these in 'task_ids'.
- Due (`deadline_at`, date and time): When the task is due. Leave empty for no deadline.
- Completed (`is_completed`, true/false): Tick the task off, or re-open it. Leave unset to leave it as it is.
- Linked record's object (`linked_object`, text): Which object the linked record belongs to. Required whenever a linked record ID is given.
- Linked record ID (`linked_record_id`, text): The record the task is about. Paste its app.attio.com link or its ID.
- Assignees (`assignees`, list): Who the task is for, replacing whoever is on it now. Leave the field untouched to keep the current assignees; choose nothing to take them all off. Only workspace members can be assigned a task.

**Outputs**

- `assignees` (list): Who it is for
- `content_plaintext` (text): The task's text, unchanged
- `deadline_at` (text): When it is due, if it is
- `is_completed` (true/false): Whether it is done
- `linked_records` (list): The records it is about
- `task` (object): The updated task
- `task_id` (text): Its ID

**Example output**

```json
{
  "assignees": [
    {
      "referenced_actor_id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
      "referenced_actor_type": "workspace-member"
    }
  ],
  "content_plaintext": "Follow up on the pilot",
  "deadline_at": "2026-09-01T15:00:00.000000000Z",
  "is_completed": true,
  "linked_records": [
    {
      "target_object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
      "target_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
    }
  ],
  "task": {
    "assignees": [
      {
        "referenced_actor_id": "50cf242c-7fa3-4cad-87d0-75b1af71c57b",
        "referenced_actor_type": "workspace-member"
      }
    ],
    "completed_at": null,
    "content_plaintext": "Follow up on the pilot",
    "created_at": "2026-08-14T09:15:44.000000000Z",
    "created_by_actor": {
      "id": null,
      "type": "api-token"
    },
    "deadline_at": "2026-09-01T15:00:00.000000000Z",
    "id": {
      "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11",
      "workspace_id": "14beef7a-99f7-4534-a87e-70b564330a4c"
    },
    "is_completed": true,
    "linked_records": [
      {
        "target_object_id": "97052eb9-e65e-443f-a297-f2d9a4a7f795",
        "target_record_id": "891dcbfc-9141-415d-9b2a-2238a6cc012d"
      }
    ]
  },
  "task_id": "5f2b0d9c-6a44-4d51-9d1c-96b6f2b64a11"
}
```
