---
title: "Attio API: Keys, Auth, and Developer Setup"
description: "How to get an Attio API key, authenticate requests, and set up a developer account, plus the rate limits and object model to know before you build."
canonical: https://www.stacksync.com/blog/how-to-get-an-attio-developer-account-and-start-working-with-attios-api
last_modified: 2026-08-24
---

# Attio API Guide: Developer Account Setup, API Keys and Authentication (2026)

How to get an Attio API key, authenticate requests, and set up a developer account, plus the rate limits and object model to know before you build.

Author

Ruben Burdin · Founder & CEO

Published

October 18, 2024

Updated

August 24, 2026

Read time

5 min read

DATA ENGINEERING

[Attio](https://attio.com/) has become a go-to CRM for technical teams thanks to its clean UI, real-time collaboration features, and powerful customizations. We use it ourselves at Stacksync.

But where [Attio](https://www.stacksync.com/blog/attio-crm-2025-review-features-pros-cons-pricing) *truly* stands out is its extensibility. While many CRMs offer surface-level integrations, Attio’s API and flexible data model lets you deeply integrate and automate your customer relationship workflows. The potential use cases are unlimited.

![Attio API setup at a glance: request developer access, create an integration, set scopes, grab your access token, then authenticate every request with a Bearer token.](https://www.stacksync.com/images/blog-highlights/attio-api-summary.webp)

If you're using a database like [Postgres](https://www.stacksync.com/connectors/postgresql) to manage customer information, syncing it with [Attio](https://www.stacksync.com/connectors/attio) removes a lot of manual work. The [Attio review](https://www.stacksync.com/blog/attio-crm-2025-review-features-pros-cons-pricing) covers whether the CRM itself fits. This guide walks you through the process of getting a developer account with Attio and building a simple integration to sync user data from your Postgres database to Attio.

## How to get a developer account on Attio

Unlike Salesforce or Hubspot that lets you sign up for a sandbox/dev account automatically, you'll need to [manually request developer access](https://developers.attio.com/docs/building-integrations#developer-workspaces). Send Attio a message through their live chat, or email them at [support@attio.com.](mailto:support@attio.com.)

This typically takes a couple days, after which you'll get access to a developer account with seeded test data. Alternatively, you could also sign up for a free trial and use that workspace as a dev sandbox (though you'll need to seed it yourself).

## Get started with Attio's API and API keys

Once you have your developer account, the next step is to create a new integration and set up authentication.

Create a new integration on Attio by clicking on your workspace logo > Workspace settings > Developers > "Create a new integration". Give it a name, description, and (optionally) an icon.

![Attio API setup pipeline: create a developer account, register an integration, set scopes, and generate the access token used to authenticate every API call.](https://www.stacksync.com/images/blog-diagrams/attio-api-setup-pipeline.webp)

*From developer account to a working API key.*

There are two ways to authenticate with Attio: access tokens, or OAuth. Access tokens are scoped to a single workspace, while OAuth is only required if you plan on publishing an integration.

![Sequence diagram: request developer access, create an integration and set scopes in Attio workspace settings, receive an access token, then send it as a Bearer token on every API request.](https://www.stacksync.com/images/blog-diagrams-mermaid/attio-api-auth-flow.webp)

By default, new access tokens don't have any scopes configured. You'll need to specify the scopes you need, which varies depending on the endpoints you're hitting - for example, reading a record requires both the "object configuration" and "record" scopes.

Set your scopes and copy your access token, this is your Attio API key. Every API call must be authenticated with this key in the `Authorization` header using `Bearer`. HTTP Basic Authentication is supported, but not recommended.

Now it’s time for the fun part, developing with the Attio API. The Attio API docs live at [developers.attio.com/docs](https://developers.attio.com/docs). Bookmark them, you’ll find everything from authentication steps to endpoint references and object schemas like `user` and `workspace`.

## Example: how to sync data from Postgres to Attio

Let’s walk through an example of syncing user data from a Postgres database to Attio using the API. We'll assume you have a table in Postgres storing user data.

First, write a function to connect to your PostgreSQL database, query the user information, and return the formatted results. For example:

`import psycopg2def fetch_postgres_users(): try: # Set up your PostgreSQL connection conn = psycopg2.connect( dbname="your_dbname", user="your_user", password="your_password", host="your_host", port="your_port" ) cursor = conn.cursor() # Query to get user data cursor.execute("SELECT email, first_name, last_name, job_title FROM users") rows = cursor.fetchall() # Transform rows into a list of dictionaries users = [ { "email": row[0], "first_name": row[1], "last_name": row[2], "job_title": row[3] } for row in rows ] # Close connections cursor.close() conn.close() return users except Exception as e: print(f"Error fetching users: {e}") return []users = fetch_postgres_users()for user in users: print(user)`

‍`‍`Now loop through each user and either create or update the corresponding `user` record in Attio using the [assert endpoint](https://developers.attio.com/reference/put_v2-objects-object-records). Records need to be matched with a `matching_attribute` query parameter. This is typically the user's email or UUID.

`import requestsAPI_URL = "https://api.attio.com/v2/objects/users/records"ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"def sync_user_to_attio(user): headers = { "Authorization": f"Bearer {ACCESS_TOKEN}", "Content-Type": "application/json" } payload = { "email_address": user["email"], "first_name": user["first_name"], "last_name": user["last_name"], "job_title": user["job_title"] } params = { "matching_attribute": "email_address" } response = requests.put(API_URL, json=payload, headers=headers, params=params) if response.status_code == 200: print(f"User {user['email']} synced successfully.") else: print(f"Failed to sync user {user['email']}: {response.status_code} - {response.text}")users = fetch_postgres_users()for user in users: sync_user_to_attio(user)`

‍`‍`To associate users to a workspace, you can use the `workspace` attribute on `user` to link them.

## Common roadblocks when using Attio's API

### Rate limits

Like most APIs, Attio has [rate limits](https://developers.attio.com/docs/rate-limiting):

- 100 requests/second for read requests
- 25 requests/second for write requests

Exceeding the rate limit will throw HTTP status code `429` with a special response:

\`HTTP/1.1 429 Too Many Requests
Retry-After: Tue, 23 May 2023 14:42:01 GMT
Content-Type: application/json

{
"status_code": 429,
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded, please try again later"
}
\`

If you're syncing large amounts of data, batch requests and implement exponential backoff to avoid rate limit issues.

### Referencing records

[Attio doesn't automatically create referenced records](https://developers.attio.com/docs/attribute-types-record-reference#writing-values) - the record you're referencing *must* exist, or the request will fail. This is problematic when asserting records, because you don't know if the reference exists yet.

To resolve this, you'll need to write in reverse-order: create the workspace first, *then* assert the person.

## Accelerate your Attio integration with Stacksync

While building a custom sync from Postgres to Attio using the API is powerful, it can get complex as you scale. That’s where [Stacksync](https://www.stacksync.com/) comes in.

Stacksync enables you to create no-code, bi-directional syncs between Attio and your Postgres database (or any other system, including BigQuery and Snowflake) without worrying about rate limits or API changes. This frees up your development time to focus on higher-value tasks.

- Bi-directional syncs: Sync not only from a database to Attio but also from Attio back to your database, ensuring data consistency across systems.
- Real-time updates: Stacksync automatically keeps Attio in sync with your latest user data, ensuring that your sales and customer success teams are always working with the freshest information.

By leveraging a tool like Stacksync, you can simplify and automate much of the integration work while ensuring that your data remains up-to-date in real-time.

FAQ

## Frequently asked questions

What is the Attio API and what can you build with it?

The Attio API is a REST API that lets developers read and write CRM data programmatically. You can sync records, manage contacts and companies, automate workflows, and build integrations with external databases like PostgreSQL. All Attio API calls require an access token included in the Authorization header using Bearer authentication.

How do I get an Attio developer account?

Unlike Salesforce or HubSpot, Attio requires you to manually request a developer workspace. Contact Attio via live chat or email support@attio.com. Access is typically granted within a couple of days and includes a workspace with seeded test data. Alternatively, a free trial workspace can serve as a developer sandbox while you build your integration.

How do I generate an Attio API key?

To generate an Attio API key, go to Workspace Settings > Developers > Create a new integration. After naming your integration, generate an access token. By default tokens have no scopes — you must configure the scopes your integration needs, such as object configuration and record scopes for reading records. Copy and store the API key securely.

Where can I find the Attio API docs?

The Attio API docs are at developers.attio.com/docs. They cover authentication, available endpoints, object references (users, workspaces, records), attribute types, and rate limiting rules. Attio API rate limits allow 100 read requests per second and 25 write requests per second, with HTTP 429 returned when limits are exceeded.

What are Attio's API rate limits?

Attio's API enforces 100 requests per second for read operations and 25 requests per second for write operations. Exceeding these limits returns HTTP 429 Too Many Requests with a Retry-After header. For large data syncs, implement batching and exponential backoff. Tools like Stacksync handle Attio API rate limit management automatically when syncing with databases.

About the author

Ruben Burdin

Founder & CEO

Ruben Burdin is the Founder and CEO of Stacksync, the first real-time and two-way sync for enterprise data at scale. Ruben is a Y Combinator alumni with a strong background in software engineering and business.

[All posts by Ruben Burdin](https://www.stacksync.com/blog/author/ruben-burdin)

About Stacksync

Stacksync powers real-time, two-way sync between CRMs, ERPs, and databases. Engineers sync data at scale and automate workflows, not dirty API plumbing.

Stacksync

Keep reading

## Related articles

[All articles](https://www.stacksync.com/blog)

[Data engineering The AI Agent Data Layer: Per-App MCP Servers vs a Synced Postgres Database 15 min read read](https://www.stacksync.com/blog/ai-agent-data-layer-mcp-vs-synced-database)

[Data engineering Demystifying Pricing Models: A Comparative Analysis of Stacksync, Heroku Connect, and Workato 27 min read read](https://www.stacksync.com/blog/demystifying-pricing-models-a-comparative-analysis-of-stacksync-heroku-connect-and-workato)

[Data engineering HubSpot NetSuite Integration: A Two-Way Sync Guide 13 min read read](https://www.stacksync.com/blog/hubspot-netsuite-integration)

## You just read how it should work. See it run on your own data.

[Book a demo](https://www.stacksync.com/book-a-demo) [Get started](https://app.stacksync.com/)
