Webhook tool

Attio AI voice agents that log every caller as a person

The agent looks the caller up in Attio by phone number, creates the person if there is no match, and adds a note with what the caller asked for.

Inbound sales agent

Finds or creates the Attio person and notes the call.

Instructions

Look up the caller by phone number. If there is no match, ask for their first and last name and create the person. Before the call ends, add a note with what they asked for and anything you promised. Transfer to sales if they ask for a person.

Handoff
Sales rep

Connected tools

  • Find personWebhook
  • Create personWebhook
  • Add noteWebhook
  • Transfer to salesTransfer

What a Attio AI voice agent can do

Open one to watch a call. The grey lines are the tools the agent calls mid-sentence.

A query on the phone_numbers attribute tells the agent if the caller is already a person in Attio, and returns the record ID.

Tool definitions

Webhook tools go to POST /v1/agents/tools. Transfers are a system tool on the agent. Replace the placeholder values in capitals with your own.

Webhook

Find person

Finds a person by the caller's phone number.

Show the JSON definition
find_person
{
  "type": "webhook",
  "name": "find_person",
  "description": "Finds the caller in Attio by phone number. Returns the matching person record, including its record_id, or an empty list.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.attio.com/v2/objects/people/records/query",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "filter": {
          "type": "object",
          "properties": {
            "phone_numbers": {
              "type": "string",
              "dynamic_variable": "system__caller_id"
            }
          }
        },
        "limit": {
          "type": "integer",
          "constant_value": 1
        }
      },
      "required": []
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_ATTIO_ACCESS_TOKEN"
      }
    }
  }
}

Webhook

Create person

Creates a person with the caller's name and number.

Show the JSON definition
create_person
{
  "type": "webhook",
  "name": "create_person",
  "description": "Creates a person in Attio for a caller who is not on record yet. Returns the new record_id.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.attio.com/v2/objects/people/records",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "data": {
          "type": "object",
          "properties": {
            "values": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "The caller's name written as last name, comma, first name. For example: Rossi, Marco"
                },
                "phone_numbers": {
                  "type": "array",
                  "description": "One item: the caller's number, {{system__caller_id}}, starting with +.",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "name",
                "phone_numbers"
              ]
            }
          },
          "required": [
            "values"
          ]
        }
      },
      "required": [
        "data"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_ATTIO_ACCESS_TOKEN"
      }
    }
  }
}

Webhook

Add note

Adds a plaintext note to the person.

Show the JSON definition
add_note
{
  "type": "webhook",
  "name": "add_note",
  "description": "Adds a note about this call to the caller's person record. Use it once, before the call ends.",
  "pre_tool_speech": "auto",
  "execution_mode": "async",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.attio.com/v2/notes",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "data": {
          "type": "object",
          "properties": {
            "parent_object": {
              "type": "string",
              "constant_value": "people"
            },
            "parent_record_id": {
              "type": "string",
              "description": "The record_id from find_person or create_person."
            },
            "title": {
              "type": "string",
              "description": "A short title, such as Phone call about team pricing."
            },
            "format": {
              "type": "string",
              "constant_value": "plaintext"
            },
            "content": {
              "type": "string",
              "description": "What the caller asked for and what you told them, in two or three sentences."
            }
          },
          "required": [
            "parent_record_id",
            "title",
            "content"
          ]
        }
      },
      "required": [
        "data"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_ATTIO_ACCESS_TOKEN"
      }
    }
  }
}

Transfer

Transfer to sales

Cold transfer to a sales rep.

Show the JSON definition
transfer_to_sales
{
  "config": {
    "system_tools": {
      "transfer_to_number": {
        "description": null,
        "pre_tool_speech": "auto",
        "transfers": [
          {
            "destination": {
              "type": "phone",
              "phone_number": "+14155550141"
            },
            "condition": "The caller asks to speak with a person, after the note is added."
          }
        ]
      }
    }
  }
}

Set it up

No native connector. The tools call Attio's REST API directly with an access token from your workspace, stored as a bearer secret. Vendor details read in November 2026.

  1. Create an access token

    In Attio's developer settings, create an app for your workspace and generate an access token with record_permission:read-write, object_configuration:read and note:read-write.

  2. Add the tools

    Add the three webhook tools with the token as a bearer secret. find_person reads system__caller_id, so the agent never asks for the number.

  3. Write the instructions

    Say when to create a person, which questions to ask first, and that the note goes in before any transfer.

  4. Test with two numbers

    Call from a number that is on a person in Attio, then from a new number, and check the person and the note in each case.

Before you build

Phone numbers need a country code

Attio validates phone numbers against E.164, and a string value has to start with + and the country code.

Large records get cut off

Attio returns every attribute value on a record, and Cartesia passes at most 16 KiB of a response to the model. If your people records are large, put a small service in front.

Rate limits

Attio allows 100 read requests and 25 write requests per second, and answers with 429 and a Retry-After header above that. A few calls per phone call stays far below it.

Create fails on duplicates

The create endpoint throws if a unique attribute, such as an email address, already belongs to another person. Search first, as the instructions say.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

Attio AI voice agent FAQs

How do I connect Attio to an AI voice agent?

In Attio's developer settings, create an app for your workspace and an access token with record_permission:read-write, object_configuration:read and note:read-write. Add the three webhook tools with that token as a bearer secret.

Can it write to Attio companies or deals instead of people?

Yes. The same records endpoints take another object slug, such as companies, in place of people. Check the attribute slugs in your workspace first, since custom attributes have their own.

What happens if a person record is too large for the agent?

Attio returns every attribute value on a record, and Cartesia passes at most 16 KiB of a tool response to the model. If your people records are large, put a small service in front that returns only the fields the agent needs.

Who bills the phone minutes on an Attio voice agent?

Cartesia bills the agent at $0.03/min, plus LLM usage and telephony. Phone minutes depend on the number. Cartesia-provisioned numbers are US only and carry Cartesia's telephony fee. Numbers from your Twilio account or a SIP trunk pay your carrier's rates instead. Attio's limits of 100 reads and 25 writes per second leave plenty of room.

What happens if the caller is already in Attio?

The agent finds them. find_person looks the caller up by phone number first, and the agent creates a person only when there is no match. That order matters, because Attio's create endpoint fails if a unique attribute such as an email address already belongs to another person.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia