Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to Attio

Scalekit connector
Open markdown

The Attio connector lets your AI agent act in each user's Attio account. Each user signs in to Attio once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 109 tools.

Tools
109
What they doRead · write · destructive
52 · 41 · 1652 read41 write16 destructive
Users sign in with
OAuth app
Scalekit's or your own

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Attio connection

    In AgentKit > Connections, create an Attio connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Attio, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.

    Use your own OAuth app

    Register your Attio OAuth app credentials with Scalekit so it can manage the OAuth 2.0 authentication flow and token lifecycle on your behalf. You’ll need a Client ID and Client Secret from the Attio Developer Portal.

    1. Create a connection in Scalekit and copy the redirect URI

      • Sign in to your Scalekit dashboard and go to AgentKit in the left sidebar.

      • Click Create Connection, search for Attio, and click Create.

      • On the connection configuration panel, locate the Redirect URI field. It looks like: https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback

      • Click the copy icon next to the Redirect URI to copy it to your clipboard.

      Scalekit Agent Auth showing the Redirect URI for the Attio connection

      Keep this tab open — you’ll return to it in step 3.

    2. Register the redirect URI in your Attio OAuth app

      • Sign in to build.attio.com and open the app you want to connect. If you don’t have one yet, click Create app.

      • In the left sidebar, click OAuth to open the OAuth settings tab for your app.

      • You’ll see your Client ID and Client Secret near the top of the page. Copy both values and save them somewhere safe — you’ll need them in step 3.

      • Scroll down to the Redirect URIs section. Click + New redirect URI.

      • Paste the Redirect URI you copied from Scalekit into the input field and confirm.

      Attio OAuth app settings showing Client ID, Client Secret, and the Redirect URIs section with the Scalekit callback URL added
    3. Add credentials and scopes in Scalekit

      • Return to your Scalekit dashboard → AgentKit > Connections and open the Attio connection you created in step 1.

      • Fill in the following fields:

        • Client ID — paste the Client ID from your Attio OAuth app

        • Client Secret — paste the Client Secret from your Attio OAuth app

        • Permissions — select the OAuth scopes your app requires. Choose the minimum scopes needed. Common scopes:

          ScopeWhat it allows
          record_permission:readRead CRM records (people, companies, deals)
          record_permission:read-writeRead and write CRM records
          object_configuration:readRead object and attribute schemas
          list_configuration:readRead list schemas
          list_entry:readRead list entries
          list_entry:read-writeRead and write list entries
          note:readRead notes
          note:read-writeRead and write notes
          task:read-writeRead and write tasks
          comment:read-writeRead and write comments
          webhook:read-writeManage webhooks
          user_management:readRead workspace members

          For a full list, see the Attio OAuth scopes reference.

      Scalekit connection configuration showing the Client ID, Client Secret, and Permissions fields for the Attio connection
      • Click Save. Scalekit will validate the credentials and mark the connection as active.
  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'attio'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Attio:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'attio_get_current_token_info',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • attio_download_fileDownloads a file by redirecting to a signed URL.Read-only

    Download File

    Downloads a file by redirecting to a signed URL. Use attio_get_file first if you only need file metadata such as name, size, or MIME type. This endpoint is in beta.

    Inputs

    file_idstringrequired
    The UUID of the file to download.
  • attio_get_attributeRetrieves details of a single attribute on an Attio object or list, including its type, slug, configuration, and metadata.Read-only

    Get Attribute

    Retrieves details of a single attribute on an Attio object or list, including its type, slug, configuration, and metadata.

    Inputs

    attributestringrequired
    Attribute slug or UUID.
    objectstringrequired
    Object slug or UUID.
  • attio_get_call_recordingRetrieves a single call recording by its ID from Attio.Read-only

    Get Call Recording

    Retrieves a single call recording by its ID from Attio. Returns recording metadata including duration and associated meeting.

    Inputs

    meeting_idstringrequired
    The UUID of the meeting the call recording belongs to.
    recording_idstringrequired
    The UUID of the call recording to retrieve.
  • attio_get_call_transcriptRetrieves the transcript for a call recording in Attio.Read-only

    Get Call Transcript

    Retrieves the transcript for a call recording in Attio. Returns the full transcript text with speaker attribution and timestamps.

    Inputs

    meeting_idstringrequired
    The UUID of the meeting the call recording belongs to.
    recording_idstringrequired
    The UUID of the call recording to get the transcript for.
  • attio_get_commentRetrieves a single comment by its comment_id in Attio.Read-only

    Get Comment

    Retrieves a single comment by its comment_id in Attio. Returns the comment's content, author, thread, and resolution status.

    Inputs

    comment_idstringrequired
    The unique identifier of the comment.
  • attio_get_companyRetrieves a single company record by its record_id from Attio.Read-only

    Get Company

    Retrieves a single company record by its record_id from Attio. Returns all attribute values with temporal and audit metadata.

    Inputs

    record_idstringrequired
    The unique identifier of the company record.
  • attio_get_current_token_infoIdentifies the current access token, the workspace it is linked to, and its permissions.Read-only

    Get Current Token Info

    Identifies the current access token, the workspace it is linked to, and its permissions. Use to verify token validity or retrieve workspace information.

    Inputs

    This tool takes no inputs.

  • attio_get_dealRetrieves a single deal record by its record_id from Attio.Read-only

    Get Deal

    Retrieves a single deal record by its record_id from Attio. Returns all attribute values with temporal and audit metadata.

    Inputs

    record_idstringrequired
    The unique identifier of the deal record.

Workflows

Proxy API call
// --- Query people records with a filter ---
const people = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/objects/people/records/query',
method: 'POST',
body: {
filter: {
email_addresses: [{ email_address: { $eq: 'alice@example.com' } }],
},
limit: 10,
},
});
console.log('People:', people.data);
// --- Create a company record ---
const company = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/objects/companies/records',
method: 'POST',
body: {
data: {
values: {
name: [{ value: 'Acme Corp' }],
domains: [{ domain: 'acme.com' }],
},
},
},
});
const companyId = company.data.data.id.record_id;
console.log('Created company:', companyId);
// --- Create a person record and associate with the company ---
const person = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/objects/people/records',
method: 'POST',
body: {
data: {
values: {
name: [{ first_name: 'Alice', last_name: 'Smith' }],
email_addresses: [{ email_address: 'alice@acme.com', attribute_type: 'email' }],
company: [{ target_record_id: companyId }],
},
},
},
});
const personId = person.data.data.id.record_id;
console.log('Created person:', personId);
// --- Add a note to the person record ---
const note = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/notes',
method: 'POST',
body: {
data: {
parent_object: 'people',
parent_record_id: personId,
title: 'Initial outreach',
content: 'Spoke with Alice about Q2 pricing. Follow up next week.',
format: 'plaintext',
},
},
});
console.log('Created note:', note.data.data.id.note_id);
// --- Create a task linked to the person ---
const deadlineAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); // 7 days from now
const task = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/tasks',
method: 'POST',
body: {
data: {
content: 'Send Q2 pricing proposal to Alice',
deadline_at: deadlineAt,
is_completed: false,
linked_records: [{ target_object: 'people', target_record_id: personId }],
},
},
});
console.log('Created task:', task.data.data.id.task_id);
// --- Verify current token and workspace ---
const tokenInfo = await actions.request({
connectionName: 'attio',
identifier: 'user_123',
path: '/v2/self',
method: 'GET',
});
console.log('Connected to workspace:', tokenInfo.data.data.workspace.name);
console.log('Granted scopes:', tokenInfo.data.data.scopes.join(', '));
Execute a tool
const result = await actions.executeTool({
connector: 'attio',
identifier: 'user_123',
toolName: 'attio_add_to_list',
toolInput: {},
});
console.log(result);