> **Building with AI coding agents?** If you're using an AI coding agent, install the official Scalekit plugin. It gives your agent full awareness of the Scalekit API — reducing hallucinations and enabling faster, more accurate code generation.
>
> - **Claude Code**: `/plugin marketplace add scalekit-inc/claude-code-authstack` then `/plugin install <auth-type>@scalekit-auth-stack`
> - **GitHub Copilot CLI**: `copilot plugin marketplace add scalekit-inc/github-copilot-authstack` then `copilot plugin install <auth-type>@scalekit-auth-stack`
> - **Codex**: run the bash installer, restart, then open Plugin Directory and enable `<auth-type>`
> - **Skills CLI** (Windsurf, Cline, 40+ agents): `npx skills add scalekit-inc/skills --list` then `--skill <skill-name>`
>
> `<auth-type>` / `<skill-name>`: `agent-auth`, `full-stack-auth`, `mcp-auth`, `modular-sso`, `modular-scim` — [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Attio

<div class="grid grid-cols-5 gap-4 items-center">
 <div class="col-span-4">
  Connect to Attio to manage CRM records, people, companies, deals, tasks, notes, and workspace data
 </div>
 <div class="flex justify-center">
  <img src="https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg" width="64" height="64" alt="Attio logo" />
 </div>
</div>

Supports authentication: OAuth 2.0

## Set up the agent connector

<SetupAttioSection />

## Usage

<UsageAttioSection />

## Tool list

## `attio_create_person`

Create a new person record in Attio. Throws an error if a unique attribute like `email_addresses` conflicts with an existing record. The `values` object maps attribute slugs to their typed values — use `attio_list_attributes` on the `people` object first to discover available slugs and types.

**Example `values`:**
```json
{
  "name": [{ "first_name": "Alice", "last_name": "Smith" }],
  "email_addresses": [{ "email_address": "alice@acme.com", "attribute_type": "email" }],
  "company": [{ "target_record_id": "<company_record_id>" }]
}
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `values` | object | Yes | Attribute values keyed by attribute slug. Multi-value attributes (e.g., `email_addresses`, `phone_numbers`) must be arrays. Single-value attributes (e.g., `name`) must also be arrays with one item. |

## `attio_list_people`

List person records with optional filtering and sorting. Returns paginated results. Use `attio_list_attributes` on `people` to find filterable attribute slugs before building a `filter` object.

**Filter example** — find people at a specific company:
```json
{ "company": [{ "target_record_id": "<company_record_id>" }] }
```

**Sort example** — most recently created first:
```json
[{ "direction": "desc", "attribute": "created_at" }]
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Attribute-based filter conditions. Keys are attribute slugs; values are match expressions |
| `sorts` | array | No | Array of sort objects, each with `attribute` (slug) and `direction` (`asc` or `desc`) |
| `limit` | integer | No | Number of records to return per page (default `500`) |
| `offset` | integer | No | Number of records to skip for pagination (default `0`) |

## `attio_get_person`

Retrieve a single person record by its `record_id`. Returns all attribute values with temporal and audit metadata, including `created_by_actor` and `active_from`/`active_until` per value.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the person record to retrieve |

## `attio_delete_person`

Permanently delete a person record by its `record_id`. This operation is irreversible and cannot be undone. The underlying contact data, linked tasks, notes, and list entries associated with this person are also affected.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the person record to delete |

## `attio_create_company`

Create a new company record in Attio. Throws an error if a unique attribute like `domains` conflicts with an existing company. Use `attio_list_attributes` on `companies` to discover available attribute slugs.

**Example `values`:**
```json
{
  "name": [{ "value": "Acme Corp" }],
  "domains": [{ "domain": "acme.com" }],
  "description": [{ "value": "Enterprise SaaS company" }]
}
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `values` | object | Yes | Attribute values keyed by attribute slug. The `domains` attribute is unique — creating a company with an existing domain will throw a conflict error |

## `attio_list_companies`

List company records with optional filtering and sorting. Returns paginated results.

**Filter example** — companies in a specific industry:
```json
{ "categories": [{ "value": "Software" }] }
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Attribute-based filter conditions |
| `sorts` | array | No | Array of sort objects with `attribute` and `direction` |
| `limit` | integer | No | Number of records per page (default `500`) |
| `offset` | integer | No | Records to skip for pagination (default `0`) |

## `attio_get_company`

Retrieve a single company record by its `record_id`. Returns all attribute values with full audit metadata.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the company record to retrieve |

## `attio_delete_company`

Permanently delete a company record by its `record_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the company record to delete |

## `attio_create_deal`

Create a new deal record in Attio. Throws an error if a unique attribute conflict is detected. Provide at least one attribute value. Use `attio_list_attributes` on `deals` to discover available slugs.

**Example `values`:**
```json
{
  "name": [{ "value": "Acme Enterprise Contract" }],
  "value": [{ "currency_value": 50000, "currency_code": "USD" }],
  "stage": [{ "status": "In progress" }],
  "associated_company": [{ "target_record_id": "<company_record_id>" }]
}
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `values` | object | Yes | Attribute values keyed by attribute slug |

## `attio_list_deals`

List deal records with optional filtering and sorting. Returns paginated results.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Attribute-based filter conditions |
| `sorts` | array | No | Array of sort objects with `attribute` and `direction` |
| `limit` | integer | No | Number of records per page (default `500`) |
| `offset` | integer | No | Records to skip for pagination (default `0`) |

## `attio_get_deal`

Retrieve a single deal record by its `record_id`. Returns all attribute values with temporal and audit metadata.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the deal record to retrieve |

## `attio_delete_deal`

Permanently delete a deal record by its `record_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the deal record to delete |

## `attio_create_record`

Create a new record for any Attio object type — including `people`, `companies`, `deals`, and custom objects. Use this as a generic alternative to `attio_create_person` / `attio_create_company` when the object type is dynamic. Throws an error if a unique attribute conflict is detected.

**Example — create a custom object record:**
```json
{
  "object": "projects",
  "values": {
    "name": [{ "value": "Q2 Migration" }],
    "status": [{ "status": "active" }]
  }
}
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug (e.g., `people`, `companies`, `deals`) or UUID — use `attio_list_objects` to discover available objects |
| `values` | object | Yes | Attribute values keyed by attribute slug. Use `attio_list_attributes` on the target object to discover valid slugs and types |

## `attio_list_records`

List and filter records for any Attio object type. Returns guaranteed up-to-date data. Prefer this over `attio_search_records` when you need exact filtering by attribute value (e.g., find by email, status, or domain). Use `attio_search_records` for fuzzy, name-based lookups.

**Example — filter people by email:**
```json
{
  "object": "people",
  "filter": { "email_addresses": [{ "email_address": { "$eq": "alice@acme.com" } }] }
}
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug or UUID |
| `filter` | object | No | Attribute-based filter. Structure depends on attribute type — use `attio_list_attributes` to discover filter syntax per attribute |
| `sorts` | array | No | Array of sort objects with `attribute` (slug) and `direction` (`asc`/`desc`) |
| `limit` | integer | No | Records per page (default `500`) |
| `offset` | integer | No | Records to skip for pagination (default `0`) |

## `attio_search_records`

Search records using a fuzzy text query. Returns matching records with their IDs, labels, and key attributes. Best for user-facing search (e.g., "find the company called Acme"). For precise attribute-based filtering, use `attio_list_records` instead.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug (e.g., `people`, `companies`, `deals`) |
| `query` | string | Yes | Fuzzy text query matched against names, emails, and domains. Pass an empty string to return all records |
| `limit` | integer | No | Number of results to return (default `20`) |
| `offset` | integer | No | Results to skip for pagination (default `0`) |

## `attio_get_record`

Retrieve a specific record by object type and record ID. Returns the full record including all attribute values with their complete audit trail (`created_by_actor`, `active_from`, `active_until`).

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug or UUID |
| `record_id` | string | Yes | UUID of the record to retrieve |

## `attio_delete_record`

Permanently delete a record by object type and record ID. This action is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug or UUID |
| `record_id` | string | Yes | UUID of the record to delete |

## `attio_get_record_attribute_values`

Retrieve all values for a specific attribute on a record. Useful for inspecting multi-value attributes (e.g., all email addresses on a person) or retrieving the full value history when `show_historic` is set. Not available for COMINT or enriched attributes.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug or UUID |
| `record_id` | string | Yes | UUID of the record |
| `attribute` | string | Yes | Attribute slug or UUID to retrieve values for |
| `show_historic` | boolean | No | Set to `true` to include all historical values, not just the current ones |

## `attio_create_task`

Create a new task in Attio. Tasks can be linked to one or more CRM records and assigned to workspace members. Only plaintext is supported for task content.

**`linked_records` structure:**
```json
[{ "target_object": "people", "target_record_id": "<person_record_id>" }]
```

**`assignees` structure** — use `attio_list_workspace_members` to get UUIDs:
```json
[{ "referenced_actor_type": "workspace-member", "referenced_actor_id": "<member_uuid>" }]
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `content` | string | Yes | Task content in plaintext (max 2000 characters) |
| `deadline_at` | string | No | ISO 8601 deadline timestamp including milliseconds and timezone, e.g. `2026-04-01T17:00:00.000Z` |
| `is_completed` | boolean | No | Initial completion status (default: `false`) |
| `linked_records` | array | No | Records to link this task to — each item needs `target_object` (slug) and `target_record_id` (UUID) |
| `assignees` | array | No | Workspace members to assign the task to — each item needs `referenced_actor_type` (`workspace-member`) and `referenced_actor_id` (UUID) |

## `attio_list_tasks`

List tasks in Attio. Filter by linked record to retrieve tasks for a specific contact, company, or deal. Filter by completion status to show only open or completed tasks.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `linked_object` | string | No | Object type slug to filter tasks by linked record type (e.g., `people`, `companies`) |
| `linked_record_id` | string | No | UUID of the record to filter tasks linked to a specific record — use with `linked_object` |
| `is_completed` | boolean | No | Filter by completion status: `true` for completed, `false` for open, omit to return all |
| `limit` | integer | No | Number of tasks to return (default `20`) |
| `offset` | integer | No | Tasks to skip for pagination (default `0`) |

## `attio_get_task`

Retrieve a single task by its `task_id`. Returns the task content, deadline, completion status, assignees, and linked records.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `task_id` | string | Yes | UUID of the task to retrieve |

## `attio_delete_task`

Permanently delete a task by its `task_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `task_id` | string | Yes | UUID of the task to delete |

## `attio_create_note`

Create a note on a CRM record (person, company, deal, or custom object). Notes support plaintext or Markdown. Optionally backdate the note using `created_at` or associate it with an existing meeting via `meeting_id`.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `parent_object` | string | Yes | Object type slug the record belongs to (e.g., `people`, `companies`, `deals`) |
| `parent_record_id` | string | Yes | UUID of the record to attach the note to |
| `title` | string | No | Plaintext title for the note |
| `content` | string | No | Note body — plaintext or Markdown depending on `format` |
| `format` | string | No | Content format: `plaintext` (default) or `markdown` |
| `created_at` | string | No | ISO 8601 timestamp to backdate the note (e.g., `2026-01-15T10:30:00Z`) — defaults to now |
| `meeting_id` | string | No | UUID of an existing meeting to associate with this note |

## `attio_list_notes`

List notes in Attio. Filter by parent object and record to retrieve notes for a specific person, company, or deal. Maximum 50 results per page.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `parent_object` | string | No | Object type slug to filter notes by record type — must be provided together with `parent_record_id` |
| `parent_record_id` | string | No | UUID of the record to filter notes — must be provided together with `parent_object` |
| `limit` | integer | No | Number of notes to return (max `50`, default `10`) |
| `offset` | integer | No | Notes to skip for pagination (default `0`) |

## `attio_get_note`

Retrieve a single note by its `note_id`. Returns the note's title, content in both plaintext and Markdown, tags, and creator information.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `note_id` | string | Yes | UUID of the note to retrieve |

## `attio_delete_note`

Permanently delete a note by its `note_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `note_id` | string | Yes | UUID of the note to delete |

## `attio_create_select_option`

Adds a new select option to a `select` or `multiselect` attribute on an Attio object or list.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `attribute` | string | Yes | Attribute slug or UUID of the select/multiselect attribute |
| `object` | string | Yes | Object slug or UUID (e.g. `people`, `companies`, `deals`) |
| `title` | string | Yes | Display title for the new select option |

## `attio_create_status`

Adds a new status to a status attribute on an Attio object or list. Company and person objects do not support status attributes.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `attribute` | string | Yes | Attribute slug or UUID of the status attribute |
| `object` | string | Yes | Object slug or UUID (e.g. `deals`) |
| `title` | string | Yes | Display title for the new status |

## `attio_create_user_record`

Creates a new user record in Attio. Requires `primary_email_address`, `user_id`, and `workspace_id` in the values field. Optionally link to an existing person record.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `values` | object | Yes | Attribute values for the new user record |

## `attio_create_webhook`

Creates a webhook and subscribes to events in Attio. Returns the webhook configuration including a one-time signing secret for verifying event authenticity.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `target_url` | string | Yes | HTTPS URL that will receive webhook event payloads |
| `subscriptions` | array | Yes | Array of event subscription objects (each needs `event_type` and `filter` fields) |
| `secret` | string | No | Optional signing secret for verifying webhook payloads |

## `attio_create_workspace_record`

Creates a new workspace record in Attio. The `workspace_id` field is required and must be unique. Throws an error on conflicts of unique attributes.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `values` | object | Yes | Attribute values for the new workspace record |

## `attio_create_comment`

Create a comment on a CRM record or list entry. To comment on a record, provide `record_object` and `record_id`. To comment on a list entry, provide `list_id` and `entry_id`. To reply to an existing thread, include `thread_id`. Content is always plaintext.

Use `attio_list_workspace_members` to look up the `author_actor_id` UUID.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `author_actor_id` | string | Yes | UUID of the workspace member authoring the comment — retrieve with `attio_list_workspace_members` |
| `content` | string | Yes | Comment content in plaintext |
| `record_object` | string | No | Object type slug when commenting on a record (e.g., `people`, `companies`) |
| `record_id` | string | No | UUID of the record to comment on |
| `list_id` | string | No | UUID of the list when commenting on a list entry |
| `entry_id` | string | No | UUID of the list entry to comment on |
| `thread_id` | string | No | UUID of an existing comment thread to reply to — omit to start a new thread |

## `attio_get_comment`

Retrieve a single comment by its `comment_id`. Returns the comment content, author, thread ID, and resolution status.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `comment_id` | string | Yes | UUID of the comment to retrieve |

## `attio_delete_comment`

Permanently delete a comment by its `comment_id`. If the comment is the head of a thread, all replies in that thread are also deleted.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `comment_id` | string | Yes | UUID of the comment to delete |

## `attio_list_threads`

List all comment threads on a record or list entry. Returns all threads with their messages and resolution status.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_object` | string | No | Object type slug when listing threads for a record |
| `record_id` | string | No | UUID of the record |
| `list_id` | string | No | UUID of the list when listing threads for a list entry |
| `entry_id` | string | No | UUID of the list entry |

## `attio_list_lists`

Retrieve all CRM lists in the Attio workspace. Lists track pipeline stages, outreach targets, or custom groupings of records. Optionally filter returned entries by a specific parent record.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `parent_record_id` | string | No | Filter list entries to those belonging to this record UUID |
| `parent_object` | string | No | Object type slug to scope entry filtering (use with `parent_record_id`) |

## `attio_create_list`

Create a new CRM list in Attio. After creation, add custom attributes with `attio_create_attribute` and add records with `attio_add_to_list`.

**`workspace_member_access` structure** — to give a specific member full access:
```json
[{ "workspace_member_id": "<member_uuid>", "level": "full-access" }]
```
Pass an empty array `[]` to rely solely on `workspace_access` for all members.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | string | Yes | Display name for the list |
| `api_slug` | string | Yes | URL-safe identifier used in API calls (e.g., `q2-outreach`) |
| `workspace_access` | string | Yes | Default access for all workspace members: `full-access`, `read-and-write`, or `read-only` |
| `workspace_member_access` | array | Yes | Per-member access overrides — each item needs `workspace_member_id` and `level`. Pass `[]` for uniform access |

## `attio_get_list`

Retrieve details of a single list by its UUID or slug, including its name, parent object type, and access configuration.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list` | string | Yes | List UUID or API slug |

## `attio_list_entries`

List entries in a given Attio list. Returns the records that belong to the list along with any list-specific attribute values (e.g., pipeline stage, entry date).

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list` | string | Yes | List UUID or API slug |
| `filter` | object | No | Filter conditions on list-level attributes |
| `sorts` | array | No | Sort objects with `attribute` and `direction` |
| `limit` | integer | No | Number of entries to return |
| `offset` | integer | No | Entries to skip for pagination |

## `attio_get_list_entry`

Retrieve a single list entry by its `entry_id`. Returns detailed information about the entry including list-specific attribute values.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list` | string | Yes | List UUID or API slug |
| `entry_id` | string | Yes | UUID of the list entry to retrieve |

## `attio_add_to_list`

Add a record to a specific Attio list. Returns the newly created list entry with its `entry_id` — save this if you need to remove the entry later. If the record is already in the list, a new entry is created (Attio supports multiple entries per record in the same list).

Optionally set list-level attribute values (e.g., pipeline stage) on the entry using `entry_values`.

**`entry_values` example** — set stage on add:
```json
{ "stage": [{ "status": "Qualified" }] }
```

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list` | string | Yes | List UUID or API slug |
| `record_id` | string | Yes | UUID of the record to add |
| `entry_values` | object | No | Attribute values to set on the list entry itself (not the underlying record). Keys are list attribute slugs |

## `attio_assert_company`

Creates or updates a company record in Attio using a unique attribute. If a company with the same matching attribute value exists, it is updated; otherwise a new one is created.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `matching_attribute` | string | Yes | The attribute slug to match on for upsert (e.g. `domains`) |
| `values` | object | Yes | Attribute values for the company record |

## `attio_assert_list_entry`

Creates or updates a list entry for a given parent record in Attio. If an entry with the specified parent record exists, it is updated. Otherwise a new entry is created.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list_id` | string | Yes | The unique identifier or slug of the list |
| `matching_attribute` | string | Yes | Attribute slug to match on for upsert |
| `parent_object` | string | Yes | Object slug of the parent record (e.g. `people`, `companies`) |
| `parent_record_id` | string | Yes | The unique identifier of the parent record |
| `entry_values` | object | No | Optional attribute values for the list entry |

## `attio_assert_person`

Creates or updates a person record in Attio using a unique attribute. If a person with the same matching attribute value exists, it is updated; otherwise a new one is created.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `matching_attribute` | string | Yes | The attribute slug to match on for upsert (e.g. `email_addresses`) |
| `values` | object | Yes | Attribute values for the person record |

## `attio_assert_record`

Trigger an Attio automation workflow for a specific record by upserting the record, which fires any automations configured on record create or update events. Matches on a unique attribute to avoid duplicates.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `matching_attribute` | string | Yes | The attribute slug to use as the unique match key (e.g. `email_addresses` for people, `domains` for companies) |
| `object` | string | Yes | The slug or UUID of the object type to upsert into (e.g. `people`, `companies`, `deals`) |
| `values` | object | Yes | Attribute values for the record |

## `attio_assert_user_record`

Creates or updates a user record in Attio using a unique attribute. If a user with the same matching attribute exists, it is updated; otherwise a new one is created.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `matching_attribute` | string | Yes | The attribute slug to match on for upsert (e.g. `primary_email_address`) |
| `values` | object | Yes | Attribute values for the user record |

## `attio_assert_workspace`

Creates or updates a workspace record in Attio using a unique attribute. If a workspace with the same matching attribute value exists, it is updated; otherwise a new one is created.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `matching_attribute` | string | Yes | The attribute slug to match on for upsert (e.g. `workspace_id`) |
| `values` | object | Yes | Attribute values for the workspace record |

## `attio_remove_from_list`

Remove a specific entry from an Attio list by its `entry_id`. Deletes the list entry but does not delete the underlying record. Use the `entry_id` returned by `attio_add_to_list` or `attio_list_record_entries`.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list` | string | Yes | List UUID or API slug |
| `entry_id` | string | Yes | UUID of the list entry to remove — this is the entry ID, not the record ID |

## `attio_list_record_entries`

List all list memberships for a specific record across all lists. Returns the list IDs, entry IDs, and creation timestamps — useful for finding the `entry_id` needed to remove a record from a list.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object type slug or UUID |
| `record_id` | string | Yes | UUID of the record |

## `attio_patch_record`

Updates a record by its `record_id` using PATCH for any object type. For multiselect attributes, values are prepended to existing values. Use `attio_put_record` to overwrite or remove multiselect values.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object slug or UUID (e.g. `people`, `companies`, `deals`) |
| `record_id` | string | Yes | The unique identifier of the record to update |
| `values` | object | Yes | Attribute values to update on the record |

## `attio_put_record`

Updates a record by its `record_id` using PUT for any object type. For multiselect attributes, values overwrite existing values. Use `attio_patch_record` to append without removing.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object slug or UUID (e.g. `people`, `companies`, `deals`) |
| `record_id` | string | Yes | The unique identifier of the record to update |
| `values` | object | Yes | Attribute values to set on the record (overwrites existing multiselect values) |

## `attio_query_records`

Queries records for a specific Attio object using server-side filtering operators and sorting. Use for complex filter criteria rather than simple listing.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object slug or UUID to query records for (e.g. `companies`, `people`, `deals`) |
| `filter` | object | No | Filter criteria for the query |
| `sorts` | array | No | Sorting criteria for the results |
| `limit` | number | No | Maximum number of records to return |
| `offset` | number | No | Number of records to skip for pagination |

## `attio_list_objects`

Retrieve all objects available in the Attio workspace — both system objects (`people`, `companies`, `deals`, `users`, `workspaces`) and any custom objects. Call this first to discover what object types exist before querying or writing records.

This tool takes no input parameters.

## `attio_get_object`

Retrieve details of a single object by its slug or UUID, including its display name, API slug, and whether it is system-defined or custom.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object slug (e.g., `people`, `companies`) or UUID |

## `attio_create_object`

Create a new custom object type in the Attio workspace. Use this when you need an object beyond the standard types. After creation, add attributes with `attio_create_attribute`.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `singular_noun` | string | Yes | Singular display name (e.g., `Project`) |
| `plural_noun` | string | Yes | Plural display name (e.g., `Projects`) |
| `api_slug` | string | Yes | URL-safe identifier used in API calls (e.g., `projects`) |

## `attio_list_attributes`

List the attribute schema for an object or list — including slugs, types, and configuration for `select`/`status` attributes. **Call this before filtering or writing** to confirm the correct slugs and understand the expected value structure for each attribute type.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | No | Object slug or UUID to list attributes for (e.g., `people`, `companies`) |
| `list` | string | No | List slug or UUID to list attributes for |

## `attio_get_attribute`

Retrieve full details of a single attribute including its type, slug, configuration, required/unique flags, and metadata.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | No | Object slug or UUID containing the attribute |
| `list` | string | No | List slug or UUID containing the attribute |
| `attribute` | string | Yes | Attribute slug or UUID |

## `attio_create_attribute`

Create a new attribute on an object or list. The required `type` determines the structure of the `config` object.

**Supported `type` values:**
`text`, `number`, `select`, `multiselect`, `status`, `date`, `timestamp`, `checkbox`, `currency`, `record-reference`, `actor-reference`, `location`, `domain`, `email-address`, `phone-number`, `interaction`

**`config` by type:**
- Most types (text, number, date, checkbox, etc.): pass `{}`
- `select` / `multiselect`: pass `{}` — add options via `attio_list_attribute_options` after creation
- `record-reference`: pass `{ "relationship": { "object": "<target_object_slug>" } }`

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | No | Object slug or UUID to add the attribute to (provide either `object` or `list`) |
| `list` | string | No | List slug or UUID to add the attribute to |
| `api_slug` | string | Yes | URL-safe identifier for the attribute — must be unique within the object |
| `title` | string | Yes | Display name shown in the Attio UI |
| `type` | string | Yes | Attribute data type — see supported values above |
| `description` | string | Yes | Human-readable description of what this attribute stores |
| `is_required` | boolean | Yes | Whether a value is required when creating records of this type |
| `is_unique` | boolean | Yes | Whether values must be unique across all records |
| `is_multiselect` | boolean | Yes | Whether multiple values are allowed per record |
| `config` | object | Yes | Type-specific configuration — pass `{}` for most types; see examples above |

## `attio_list_attribute_options`

List all select options for a `select` or `multiselect` attribute. Returns option IDs, titles, and color configuration. Use this before writing to a select attribute to confirm valid option values.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | No | Object slug or UUID containing the attribute |
| `list` | string | No | List slug or UUID containing the attribute |
| `attribute` | string | Yes | Attribute slug or UUID of the `select` or `multiselect` attribute |

## `attio_list_attribute_statuses`

List all statuses for a `status` attribute, including their IDs, titles, and celebration configuration. Use this before writing to a status attribute to confirm valid status titles.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | No | Object slug or UUID containing the attribute |
| `list` | string | No | List slug or UUID containing the attribute |
| `attribute` | string | Yes | Attribute slug or UUID of the `status` attribute |

## `attio_list_workspace_members`

List all workspace members. Use this to retrieve member UUIDs needed when assigning task owners, setting `actor-reference` attributes, or identifying comment authors.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer | No | Number of members to return |
| `offset` | integer | No | Members to skip for pagination |

## `attio_get_workspace_member`

Retrieve a single workspace member by their UUID. Returns name, email address, access level, and avatar information.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `workspace_member_id` | string | Yes | UUID of the workspace member to retrieve |

## `attio_list_user_records`

List user records in Attio with optional filtering and sorting. User records represent end-users of the connected product and are distinct from workspace members. Returns paginated results.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Attribute-based filter conditions |
| `sorts` | array | No | Array of sort objects with `attribute` and `direction` |
| `limit` | integer | No | Number of records to return |
| `offset` | integer | No | Records to skip for pagination |

## `attio_delete_user_record`

Permanently delete a user record by its `record_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the user record to delete |

## `attio_list_workspace_records`

List workspace records in Attio with optional filtering and sorting. Workspace records represent instances of connected SaaS products (e.g., a Slack workspace). Returns paginated results.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Attribute-based filter conditions |
| `sorts` | array | No | Array of sort objects with `attribute` and `direction` |
| `limit` | integer | No | Number of records to return |
| `offset` | integer | No | Records to skip for pagination |

## `attio_get_workspace_record`

Retrieve a single workspace record by its `record_id`. Returns all attribute values with temporal and audit metadata.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the workspace record to retrieve |

## `attio_delete_workspace_record`

Permanently delete a workspace record by its `record_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | UUID of the workspace record to delete |

## `attio_list_webhooks`

Retrieve all webhooks configured in the Attio workspace. Returns webhook configurations, event subscriptions, and statuses.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `limit` | integer | No | Number of webhooks to return |
| `offset` | integer | No | Webhooks to skip for pagination |

## `attio_get_webhook`

Retrieve a single webhook by its `webhook_id`. Returns the target URL, subscribed event types, current status, and metadata.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `webhook_id` | string | Yes | UUID of the webhook to retrieve |

## `attio_delete_webhook`

Permanently delete a webhook by its `webhook_id`. This operation is irreversible.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `webhook_id` | string | Yes | UUID of the webhook to delete |

## `attio_list_meetings`

List all meetings in the Attio workspace. Optionally filter by participants or linked records.
**Caution:** This tool is in beta and may change without notice.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `filter` | object | No | Filter conditions (e.g., by participant UUIDs or linked record IDs) |
| `limit` | integer | No | Number of meetings to return |
| `offset` | integer | No | Meetings to skip for pagination |

## `attio_get_current_token_info`

Identify the current access token, the workspace it belongs to, the actor that authenticated, and the OAuth scopes granted. Use this to verify a user's token is active, confirm which workspace is connected, and check permissions before making write calls.

This tool takes no input parameters. It returns:

| Field | Type | Description |
| --- | --- | --- |
| `active` | boolean | Whether the token is currently active and usable |
| `workspace.id` | string | UUID of the connected Attio workspace |
| `workspace.name` | string | Display name of the connected Attio workspace |
| `actor.type` | string | Who authenticated — `workspace-member` for a user OAuth token, `api-token` for a service token |
| `actor.id` | string | UUID of the workspace member or API token |
| `actor.name` | string | Display name of the authenticated actor |
| `actor.email` | string | Email address of the workspace member (present for `workspace-member` actors only) |
| `scopes` | array | OAuth scopes granted to this token (e.g., `record_permission:read`, `note:read-write`) |

**When to call this:**
- After a user completes OAuth — confirm the connection succeeded and identify which workspace they authorized.
- Before a write operation — verify the required scope is in `scopes` to give a clear error rather than a cryptic API rejection.
- When debugging — check `active` is `true` and that expected scopes are present.

## `attio_update_attribute`

Updates an existing attribute on an Attio object or list by its slug or ID. Can modify title, description, or archive the attribute. Cannot modify system attributes.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `attribute` | string | Yes | Attribute slug or UUID to update |
| `object` | string | Yes | Object slug or UUID (e.g. `people`, `companies`, `deals`) |
| `title` | string | No | New display title for the attribute |
| `is_archived` | boolean | No | Whether to archive the attribute |

## `attio_update_company`

Updates a company record in Attio by its `record_id` using PATCH. Only the provided attributes are updated. For multiselect attributes, values are prepended. Note: `logo_url` cannot be updated via API.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | The unique identifier of the company record to update |
| `values` | object | Yes | Attribute values to update on the company record |

## `attio_update_deal`

Updates a deal record in Attio by its `record_id` using PATCH. Only the provided fields are updated, leaving other fields unchanged.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | The unique identifier of the deal record to update |
| `values` | object | Yes | Attribute values to update on the deal record |

## `attio_update_list`

Updates an existing list in Attio. Can modify name, api_slug, or permissions. Changing the parent object of a list is not possible through the API.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list_id` | string | Yes | The unique identifier or slug of the list to update |
| `name` | string | No | New display name for the list |
| `api_slug` | string | No | New snake_case identifier for the list |
| `workspace_access` | string | No | New access level for workspace members |

## `attio_update_list_entry`

Updates a list entry by its `entry_id` in Attio using PATCH. For multiselect attributes, values are prepended to existing values. Use PUT to overwrite multiselect values.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `list_id` | string | Yes | The unique identifier or slug of the list |
| `entry_id` | string | Yes | The unique identifier of the list entry to update |
| `entry_values` | object | Yes | Attribute values to update on the list entry |

## `attio_update_object`

Updates a single object's configuration in Attio. Can modify the object's API slug, singular noun, or plural noun.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | Object slug or UUID to update |
| `singular_noun` | string | No | New singular noun for the object type |
| `plural_noun` | string | No | New plural noun for the object type |
| `api_slug` | string | No | New snake_case identifier for the object |

## `attio_update_person`

Updates a person record in Attio by its `record_id` using PATCH. Only the provided attributes are updated. For multiselect attributes, values are prepended. Note: `avatar_url` cannot be updated via API.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | The unique identifier of the person record to update |
| `values` | object | Yes | Attribute values to update on the person record |

## `attio_update_record`

Update an existing record's attributes in Attio. For multiselect attributes, the supplied values will overwrite (replace) the existing list. Supports people, companies, deals, and custom objects.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `object` | string | Yes | The slug or UUID of the object type (e.g. `people`, `companies`, `deals`) |
| `record_id` | string | Yes | The UUID of the record to update |
| `values` | object | Yes | Attribute values to update (multiselect values replace all existing) |

## `attio_update_select_option`

Updates an existing select option for a `select` or `multiselect` attribute in Attio. Can rename or archive an option. Archived options are hidden from selection but preserve historical data.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `attribute` | string | Yes | Attribute slug or UUID of the select/multiselect attribute |
| `object` | string | Yes | Object slug or UUID (e.g. `people`, `companies`, `deals`) |
| `option_id` | string | Yes | The unique identifier of the select option to update |
| `title` | string | No | New display title for the select option |
| `is_archived` | boolean | No | Whether to archive the select option |

## `attio_update_status`

Updates a status on a status attribute in Attio. Can modify title or archive the status. Company and person objects do not support status attributes.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `attribute` | string | Yes | Attribute slug or UUID of the status attribute |
| `object` | string | Yes | Object slug or UUID (e.g. `deals`) |
| `status_id` | string | Yes | The unique identifier of the status to update |
| `title` | string | No | New display title for the status |
| `is_archived` | boolean | No | Whether to archive the status |

## `attio_update_task`

Updates an existing task in Attio by its `task_id`. Only deadline, is_completed, linked_records, and assignees can be updated via this endpoint.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `task_id` | string | Yes | The unique identifier of the task to update |
| `deadline_at` | string | No | ISO 8601 datetime string for the task deadline |
| `is_completed` | boolean | No | Whether the task is completed |
| `linked_records` | array | No | Records linked to this task |
| `assignees` | array | No | Workspace members assigned to this task |

## `attio_update_user_record`

Updates a user record in Attio by its `record_id` using PATCH. Only the provided attributes are updated; other fields remain unchanged.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | The unique identifier of the user record to update |
| `values` | object | Yes | Attribute values to update on the user record |

## `attio_update_webhook`

Updates a webhook's target URL and/or event subscriptions in Attio. Each subscription must be an object with an `event_type` field.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `webhook_id` | string | Yes | The unique identifier of the webhook to update |
| `target_url` | string | No | New HTTPS URL that will receive webhook events |
| `subscriptions` | array | No | New array of event subscription objects to replace current subscriptions |

## `attio_update_workspace_record`

Updates a workspace record in Attio by its `record_id` using PATCH. Only the provided attributes are updated.

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `record_id` | string | Yes | The unique identifier of the workspace record to update |
| `values` | object | Yes | Attribute values to update on the workspace record |

---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
