Skills Product & Business Manage Attio Lists, Notes, and Tasks

Manage Attio Lists, Notes, and Tasks

v20260423
attio-core-workflow-b
This skill provides comprehensive API access to manage core Attio workflow components. Users can list and query pipelines, create, update, and delete list entries, track activities via notes, and manage tasks assigned to records. It is ideal for automating complex CRM workflows, sales pipeline management, and activity logging within Attio.
Get Skill
139 downloads
Overview

Attio Lists, Notes & Tasks (Core Workflow B)

Overview

Lists are Attio's pipeline/board primitive -- they contain entries (records added to the list with list-specific attributes like stage or owner). This skill also covers notes and tasks, which attach to records for activity tracking.

Prerequisites

  • attio-install-auth completed
  • Scopes: object_configuration:read, record_permission:read, list_entry:read, list_entry:read-write, note:read-write, task:read-write, user_management:read

Instructions

Step 1: List All Lists

// GET /v2/lists
const lists = await client.get<{
  data: Array<{
    id: { list_id: string };
    api_slug: string;
    name: string;
    parent_object: string[];  // Which object types can be added
  }>;
}>("/lists");

console.log(lists.data.map((l) => `${l.api_slug}: ${l.name}`));
// Output: ["sales_pipeline: Sales Pipeline", "hiring: Hiring Pipeline"]

Step 2: Query List Entries

// POST /v2/lists/{list_slug}/entries/query
const entries = await client.post<{
  data: Array<{
    entry_id: string;
    record_id: string;
    created_at: string;
    values: Record<string, any[]>;
  }>;
}>("/lists/sales_pipeline/entries/query", {
  filter: {
    stage: { status: { $eq: "In Progress" } },
  },
  sorts: [
    { attribute: "created_at", field: "created_at", direction: "desc" },
  ],
  limit: 50,
});

Step 3: Add a Record to a List (Create Entry)

// POST /v2/lists/{list_slug}/entries
const entry = await client.post<{ data: { entry_id: string } }>(
  "/lists/sales_pipeline/entries",
  {
    data: {
      // The record to add to the list
      parent_record_id: companyRecordId,
      parent_object: "companies",
      // List-specific attribute values
      values: {
        stage: [{ status: "Qualified" }],
        deal_value: [{ currency_code: "USD", currency_value: 50000 }],
        owner: [{ referenced_actor_id: workspaceMemberId, referenced_actor_type: "workspace-member" }],
      },
    },
  }
);

Step 4: Update an Entry

// PATCH /v2/lists/{list_slug}/entries/{entry_id} -- append multiselect
await client.patch(
  `/lists/sales_pipeline/entries/${entryId}`,
  {
    data: {
      values: {
        stage: [{ status: "Won" }],
      },
    },
  }
);

// PUT /v2/lists/{list_slug}/entries/{entry_id} -- overwrite multiselect
await client.put(
  `/lists/sales_pipeline/entries/${entryId}`,
  {
    data: {
      values: {
        stage: [{ status: "Lost" }],
      },
    },
  }
);

Step 5: Delete an Entry (Remove from List)

// DELETE /v2/lists/{list_slug}/entries/{entry_id}
await client.delete(`/lists/sales_pipeline/entries/${entryId}`);
// Note: This removes from the list only. The underlying record is not deleted.

Step 6: Create a Note on a Record

// POST /v2/notes
const note = await client.post<{
  data: { id: { note_id: string } };
}>("/notes", {
  data: {
    // Link to a parent record
    parent_object: "companies",
    parent_record_id: companyRecordId,
    // Note content
    title: "Q1 Review Meeting",
    format: "plaintext",                     // or "markdown"
    content: "Discussed renewal timeline. Budget approved for next quarter.",
  },
});

Step 7: List Notes on a Record

// GET /v2/notes?parent_object=companies&parent_record_id={id}
const notes = await client.get<{
  data: Array<{
    id: { note_id: string };
    title: string;
    content: string;
    created_at: string;
    created_by_actor: { type: string; id: string };
  }>;
}>(`/notes?parent_object=companies&parent_record_id=${companyRecordId}`);

Step 8: Create and Manage Tasks

// POST /v2/tasks
const task = await client.post<{
  data: { id: { task_id: string } };
}>("/tasks", {
  data: {
    content: "Send renewal proposal to Acme Corp",
    deadline: "2025-07-15T17:00:00.000Z",
    is_completed: false,
    // Link to records
    linked_records: [
      { target_object: "companies", target_record_id: companyRecordId },
    ],
    // Assign to workspace members
    assignees: [
      { referenced_actor_id: memberId, referenced_actor_type: "workspace-member" },
    ],
  },
});

// Complete a task
await client.patch(`/tasks/${taskId}`, {
  data: { is_completed: true },
});

// List tasks (sorted oldest to newest by default)
const tasks = await client.get<{
  data: Array<{
    id: { task_id: string };
    content: string;
    deadline: string | null;
    is_completed: boolean;
  }>;
}>("/tasks");

Attio Lists vs Records Mental Model

Objects (people, companies, deals)
 └── Records  ← individual CRM entries (Step 1-7 of core-workflow-a)
      └── Notes, Tasks  ← activity attached to records

Lists (pipelines, boards)
 └── Entries  ← a record placed in a list context
      └── List-specific values (stage, owner, custom columns)

Error Handling

Error Status Cause Solution
not_found 404 Invalid list slug or entry ID Verify with GET /v2/lists
insufficient_scopes 403 Missing list_entry:read-write Update token scopes
validation_error 422 Wrong parent_object for list Check list's parent_object array
insufficient_scopes 403 Missing note:read-write for notes Add note scope to token
insufficient_scopes 403 Missing task:read-write + user_management:read Tasks need both scopes

Resources

Next Steps

For error diagnosis, see attio-common-errors. For webhooks on list/record changes, see attio-webhooks-events.

Info
Name attio-core-workflow-b
Version v20260423
Size 6.38KB
Updated At 2026-04-28
Language