Free tools and guides
Attio API guide: log calls and recording links
Use Attio's API to attach call notes and recording files to CRM records. See real request schemas, scopes, secure links, and retry guidance.
Last reviewed: . Free to use. No signup required.
What this integration does
Your calling provider places the phone call. After it ends, your backend can match the Attio record, upload approved audio, and attach a note. The examples below use fictional record IDs and an example playback domain. Replace them with verified values in your own backend.
These requests create a CRM note and a record file. They do not place calls, create an Attio Call Recording object, or start Attio's meeting recorder. Keep post-call CRM work outside the live audio path.
- Capture a stable call ID and the linked CRM record ID.
- Queue the post-call job with the call outcome and approved recording.
- Upload the file if your recording and retention policy permits it.
- Create or reconcile the note. Store the returned note and file IDs.
- Check the write result and expose a safe retry for failed work.
1. Authenticate on the server
Attio supports OAuth for integrations across workspaces and an API key for a single workspace. Both use bearer authentication. Request only the scopes each operation needs. Source: Attio authentication.
Keep tokens in a backend secret store. Do not use a public environment variable, client component, CSV export, or browser storage for credentials. Your application must authenticate the user and authorize the record operation before making the request.
| Operation | Required scopes | Source |
|---|---|---|
| Query People records | record_permission:read, object_configuration:read | List records |
| Create a note | note:read-write, object_configuration:read, record_permission:read | Create a note |
| Upload a record file | file:read-write, object_configuration:read, record_permission:read | Upload a file |
| Download a record file | file:read, object_configuration:read, record_permission:read | Download a file |
2. Bind the call to the right record
If a call came from an Attio list entry, preserve its parent record ID and entry ID. This is safer than guessing a record from a phone number. If you only have a phone number, normalize it and query your configured phone attribute.
POST https://api.attio.com/v2/objects/people/records/query
Authorization: Bearer <server-held-access-token>
Content-Type: application/json
{
"filter": {
"phone_numbers": {
"phone_number": { "$eq": "+12025550123" }
}
},
"limit": 10,
"offset": 0
}The query example uses the standard People phone_numbers attribute. Attio documents phone_number as the explicit filter property for normalized phone searches. Source: Attio phone-number attributes.
Confirm your schema with List attributes. Paginate results and confirm the number on the returned record. If more than one person matches, ask a rep to select the record. Do not silently choose the first match.
Read the List records reference and filtering guide for the schema and supported filters. No match is a policy decision: leave it unlinked or create a person only if your workspace permits creation.
3. Create a call note
POST https://api.attio.com/v2/notes
Authorization: Bearer <server-held-access-token>
Content-Type: application/json
{
"data": {
"parent_object": "people",
"parent_record_id": "67af55a8-7545-4f8f-b6de-4ef9cd664eb6",
"title": "Outbound call: callback requested",
"format": "markdown",
"content": "Outcome: callback requested.\n\nNext step: confirm a time with the account owner.\n\n[Recording](https://dialer.example.com/recordings/call-demo-001)\n\nCall reference: call-demo-001"
}
}The required fields are inside data. format can be plaintext or markdown. A successful response returns the note ID at data.id.note_id. Store it with your call ID. Source: Attio, Create a note.
The recording URL is a placeholder for your protected playback page. It must check user and record access. If you do not have that page, omit the link. A note does not update campaign stages automatically. Apply separately configured, writable attribute mappings if your workflow needs them.
For later edits, Attio provides PATCH /v2/notes/{note_id}. Supplying content replaces the whole note body. Reconcile against your stored call ID before an uncertain create is retried. Source: Attio, Update a note.
4. Upload the approved recording
# Run on your backend. Set the token in its secret store.
curl --request POST 'https://api.attio.com/v2/files/upload' \
--header "Authorization: Bearer $ATTIO_ACCESS_TOKEN" \
--form 'object=people' \
--form 'record_id=67af55a8-7545-4f8f-b6de-4ef9cd664eb6' \
--form 'file=@./call-demo-001.mp3;type=audio/mpeg'Send multipart fields file, object, and record_id. Let your HTTP client set the multipart boundary. The response file ID is data.id.file_id. The upload endpoint is beta, allows files up to 50 MB, and has a limit of one request per second. Check workspace storage and billing limits too. Source: Attio, Upload a file.
For retrieval, your authorized backend can call GET /v2/files/{file_id}/download, which redirects to a signed URL. Do not treat that temporary URL as a permanent recording link. Never put the API token in the URL. Source: Attio, Download a file.
Get recording consent through your approved process before collecting audio. Limit access and retention. This is not legal advice. Use the recording consent reference when reviewing your policy.
5. Make retries safe
Keep post-call jobs durable. Store the call ID, record binding, intended write, and returned provider IDs. A timeout after a create does not prove the create failed. Reconcile existing notes and files before repeating a request that could create a duplicate.
On a confirmed 429 response, honor Attio's Retry-After header, which its guide specifies as an HTTP date. Use bounded retries and visible failure states. Endpoint-specific limits can be lower than the general API limit. Source: Attio rate limits.
Redialler separates live calling from durable post-call processing. Its sync settings control notes, transcripts, protected playback links, and recording-file uploads. Configure these settings and test the actual connection before relying on them. See Redialler for Attio.
Related tools and guides
Frequently asked questions
Does this Attio API example place a phone call?
No. It writes a note and uploads an existing recording file to a CRM record. Your telephony provider or dialer places the call. These examples do not create an Attio Call Recording object or run its meeting intelligence.
Can I put my Attio API key in browser JavaScript?
No. Keep access tokens in your backend or secret store. Authenticate users and check record access before your server writes to Attio or serves a recording.
What fields does an Attio call note need?
POST /v2/notes requires a data object containing parent_object, parent_record_id, title, format, and content. The note format can be plaintext or markdown. The returned note ID is data.id.note_id.
Can I link directly to an uploaded recording's download endpoint?
The Attio download endpoint requires authorized API access and redirects to a signed URL. Use an access-controlled playback page or the CRM's file view. Do not put an access token or a temporary signed download URL in a permanent public note.
Keep your calling work in Attio.
Set up your calling workspace in minutes. Questions about your CRM or team? Talk to us before you start.