Back to skills
SKILL.md
Attio Hello World
ASecurity'Make your first Attio API calls -- list objects, create a person, query companies, and read attributes. Use when starting a new Attio integration or learning the API. Trigger: \"attio hello world\", \"attio example\", \"first attio call\", \"attio quick start\", \"try attio API\". '
- 3 stars
- 0 votes
- 0 copies
- 4 views
- Added September 12, 2026
Works with
Security analysis
96/100- Uses curl or wget to download content
npx -y skills add thedixitjain/the-mega-skill-library --skill attio-hello-world --agent claude-codeAre you the author of Attio Hello World?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/thedixitjain-attio-hello-world)---
name: attio-hello-world
description: "'Make your first Attio API calls -- list objects, create a person, query companies, and read attributes. Use when starting a new Attio integration or learning the API. Trigger: \"attio hello world\", \"attio example\", \"first attio call\", \"attio quick start\", \"try attio API\". '"
allowed-tools: "Read, Write, Edit, Bash(curl:*), Bash(npx:*)"
category: backend-and-data
source_repo: jeremylongshore/claude-code-plugins-plus-skills
source_path: "plugins/saas-packs/attio-pack/skills/attio-hello-world/SKILL.md"
source_url: https://github.com/jeremylongshore/claude-code-plugins-plus-skills/blob/HEAD/plugins/saas-packs/attio-pack/skills/attio-hello-world/SKILL.md
---
# Attio Hello World
## Overview
Five progressively deeper API calls that exercise the Attio object/record model. Every call targets `https://api.attio.com/v2` and returns JSON.
## Prerequisites
- Completed `attio-install-auth` (valid `ATTIO_API_KEY` in env)
- Scopes: `object_configuration:read`, `record_permission:read`, `record_permission:read-write`
## Instructions
### Step 1: List Workspace Objects
Every Attio workspace has system objects (people, companies) and optional objects (deals, users, workspaces). Custom objects can be created.
```bash
curl -s https://api.attio.com/v2/objects \
-H "Authorization: Bearer ${ATTIO_API_KEY}" | jq '.data[] | {slug: .api_slug, singular: .singular_noun}'
```
```json
{"slug": "people", "singular": "Person"}
{"slug": "companies", "singular": "Company"}
{"slug": "deals", "singular": "Deal"}
```
### Step 2: List Attributes on an Object
Objects have attributes (fields). Use the slug from Step 1.
```bash
curl -s "https://api.attio.com/v2/objects/people/attributes" \
-H "Authorization: Bearer ${ATTIO_API_KEY}" | jq '.data[] | {slug: .api_slug, type: .type}'
```
Common people attributes: `name` (personal-name), `email_addresses` (email-address), `phone_numbers` (phone-number), `description` (text), `primary_location` (location), `company` (record-reference).
### Step 3: Create a Person Record
```typescript
const person = await attioFetch<{ data: { id: { record_id: string } } }>({
method: "POST",
path: "/objects/people/records",
body: {
data: {
values: {
email_addresses: ["ada@example.com"],
name: [
{
first_name: "Ada",
last_name: "Lovelace",
full_name: "Ada Lovelace",
},
],
description: ["First computer programmer"],
},
},
},
});
console.log("Created person:", person.data.id.record_id);
```
**Key detail:** Values are keyed by attribute slug. Most attributes accept an array (Attio supports multiselect by default). String shortcuts work for emails and domains.
### Step 4: Query Records with Filters
```typescript
// List people whose email contains "example.com"
const results = await attioFetch<{
data: Array<{ id: { record_id: string }; values: Record<string, any> }>;
}>({
method: "POST",
path: "/objects/people/records/query",
body: {
filter: {
email_addresses: {
email_address: { $contains: "example.com" },
},
},
sorts: [
{
attribute: "created_at",
field: "created_at",
direction: "desc",
},
],
limit: 10,
},
});
console.log(`Found ${results.data.length} people`);
```
### Step 5: Create a Company and Link It
```typescript
// Create company
const company = await attioFetch<{ data: { id: { record_id: string } } }>({
method: "POST",
path: "/objects/companies/records",
body: {
data: {
values: {
name: ["Acme Corp"],
domains: ["acme.com"],
description: ["Enterprise widget manufacturer"],
},
},
},
});
// Update person to link to company via record-reference
await attioFetch({
method: "PATCH",
path: `/objects/people/records/${person.data.id.record_id}`,
body: {
data: {
values: {
company: [
{
target_object: "companies",
target_record_id: company.data.id.record_id,
},
],
},
},
},
});
```
## Attio Data Model Quick Reference
```
Workspace
└── Objects (people, companies, deals, custom)
├── Attributes (name, email, phone, custom)
└── Records (individual people, companies)
└── Values (attribute data on each record)
└── Lists (pipelines, boards, custom groupings)
└── Entries (records added to a list with list-specific attributes)
```
## Error Handling
| Error | Status | Cause | Solution |
|-------|--------|-------|----------|
| `not_found` | 404 | Wrong object slug or record ID | Verify slug with `GET /v2/objects` |
| `validation_error` | 422 | Invalid attribute value format | Check attribute type in docs |
| `insufficient_scopes` | 403 | Token missing write scope | Add `record_permission:read-write` |
| `duplicate_record` | 409 | Record with same unique field exists | Use `PUT` (assert) instead |
## Resources
- [Attio Create Record](https://docs.attio.com/rest-api/endpoint-reference/records/create-a-record)
- [Attio List Records](https://docs.attio.com/rest-api/endpoint-reference/records/list-records)
- [Attio Attribute Types](https://docs.attio.com/docs/attribute-types/attribute-types)
- [Attio Slugs and IDs](https://docs.attio.com/docs/slugs-and-ids)
## Next Steps
Proceed to `attio-local-dev-loop` for development workflow, or `attio-core-workflow-a` for record CRUD patterns.
---
**Source:** [`jeremylongshore/claude-code-plugins-plus-skills`](https://github.com/jeremylongshore/claude-code-plugins-plus-skills) → `plugins/saas-packs/attio-pack/skills/attio-hello-world/SKILL.md`
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.