A fully-typed TypeScript CLI for managing Attio via its REST API, optimized for both human and agent use.
ATTIO_API_KEY=your_api_key_hereAll commands support:
--api-key <key>: Override API key (default: $ATTIO_API_KEY)--format <json|table|csv>: Output format (default: json)--help: Show help for command--version: Show CLI version
attio <resource> <action> [options]
List all workspace members
Options:
--limit <number>: Maximum results--format <json|table>: Output format
Output: List of workspace members with id, name, email, access_level
Get specific workspace member
Arguments:
member_id: Workspace member UUID
Output: Full workspace member details
List all objects in workspace
Options:
--format <json|table>: Output format
Output: List of objects with slug, name (singular/plural)
Get object definition
Arguments:
object: Object ID or slug (e.g.,people,companies,deals)
Output: Full object definition
Create custom object
Options:
--slug <string>: API slug (required)--singular <string>: Singular noun (required)--plural <string>: Plural noun (required)
Output: Created object
List attributes on object or list
Arguments:
target: Eitherobjectorlistidentifier: Object/list ID or slug
Example: attio attribute list object people
Output: List of attributes with slug, title, type, required, unique
Get specific attribute
Arguments:
target: Eitherobjectorlistidentifier: Object/list ID or slugattribute: Attribute ID or slug
Output: Full attribute definition
Create attribute
Arguments:
target: Eitherobjectorlistidentifier: Object/list ID or slug
Options:
--slug <string>: API slug (required)--title <string>: Display title (required)--type <string>: Attribute type (required)--required: Make field required--unique: Enforce uniqueness--multiselect: Allow multiple values
Output: Created attribute
List select/status options for attribute
Arguments:
target: Eitherobjectorlistidentifier: Object/list ID or slugattribute: Attribute ID or slug
Output: List of options
List records
Arguments:
object: Object ID or slug (e.g.,people,companies,deals)
Options:
--limit <number>: Maximum results--offset <number>: Skip results--filter <json>: Filter conditions as JSON string--sort <attribute:direction>: Sort by attribute (e.g.,name:asc)
Example:
attio record list people --limit 10 --filter '{"email_addresses": {"$not_empty": true}}'Output: List of records
Get specific record
Arguments:
object: Object ID or slugrecord_id: Record UUID
Output: Full record with all attributes
Create record
Arguments:
object: Object ID or slug
Options:
--data <json>: Record data as JSON string (required)--file <path>: Load data from JSON file
Example:
attio record create people --data '{"name": {"first_name": "John", "last_name": "Doe"}, "email_addresses": [{"email_address": "john@example.com"}]}'Output: Created record
Update record
Arguments:
object: Object ID or slugrecord_id: Record UUID
Options:
--data <json>: Update data as JSON string (required)--file <path>: Load data from JSON file
Output: Updated record
Create or get existing record
Arguments:
object: Object ID or slug
Options:
--matching-attribute <slug>: Attribute to match on (required)--data <json>: Record data as JSON string (required)--file <path>: Load data from JSON file
Output: Record (created or existing)
List all lists
Options:
--format <json|table>: Output format
Output: List of lists with slug, name, parent_object
Get list definition
Arguments:
list: List ID or slug
Output: Full list definition
Create list
Options:
--slug <string>: API slug (required)--name <string>: Display name (required)--parent-object <string>: Parent object slug (required)--workspace-access <string>: Access level (default: full-access)
Output: Created list
Query list entries
Arguments:
list: List ID or slug
Options:
--limit <number>: Maximum results--offset <number>: Skip results--filter <json>: Filter conditions as JSON string--sort <attribute:direction>: Sort by attribute
Output: List of entries
Get specific entry
Arguments:
list: List ID or slugentry_id: Entry UUID
Output: Full entry with all attributes
Add record to list
Arguments:
list: List ID or slug
Options:
--record-id <uuid>: Parent record ID (required)--data <json>: Entry attribute values as JSON string--file <path>: Load data from JSON file
Example:
attio entry create my_list --record-id abc-123 --data '{"status": "active"}'Output: Created entry
Update entry attributes
Arguments:
list: List ID or slugentry_id: Entry UUID
Options:
--data <json>: Update data as JSON string (required)--file <path>: Load data from JSON file
Output: Updated entry
Remove entry from list
Arguments:
list: List ID or slugentry_id: Entry UUID
Output: Success message
List notes
Options:
--limit <number>: Maximum results (default: 10, max: 50)--offset <number>: Skip results--parent-object <string>: Filter by object slug--parent-record-id <uuid>: Filter by record ID
Output: List of notes
Get specific note
Arguments:
note_id: Note UUID
Output: Full note with content
Create note
Options:
--parent-object <string>: Object ID or slug (required)--parent-record-id <uuid>: Record UUID (required)--title <string>: Note title (required)--format <plaintext|markdown>: Content format (required)--content <string>: Note content (required)--file <path>: Load content from file--meeting-id <uuid>: Associated meeting ID
Example:
attio note create --parent-object people --parent-record-id abc-123 --title "Meeting" --format markdown --content "## Notes\n- Point 1"Output: Created note
Update note
Arguments:
note_id: Note UUID
Options:
--title <string>: Update title--format <plaintext|markdown>: Content format--content <string>: Update content--file <path>: Load content from file
Output: Updated note
Delete note
Arguments:
note_id: Note UUID
Output: Success message
List tasks
Options:
--limit <number>: Maximum results (default: 500)--offset <number>: Skip results--sort <created_at:asc|created_at:desc>: Sort order (default: created_at:asc)--linked-object <string>: Filter by object type (e.g., people, companies)--linked-record-id <uuid>: Filter by specific record ID--assignee <string>: Filter by workspace member email or ID--completed <boolean>: Filter by completion status (true/false)
Example:
attio task list --linked-object people --completed false --assignee user@example.comOutput: List of tasks
Get specific task
Arguments:
task_id: Task UUID
Output: Full task details
Create task
Options:
--content <string>: Task content (required, max 2000 chars)--deadline <iso-date>: Deadline in ISO 8601 format--completed <boolean>: Completion status (default: false)--linked-record-id <uuid>: Link to record (required)--assignee <string>: Workspace member email or ID (can be repeated)
Example:
attio task create --content "Follow up on proposal" --deadline 2024-12-31T23:59:59Z --linked-record-id abc-123 --assignee user@example.comOutput: Created task
Update task
Arguments:
task_id: Task UUID
Options:
--deadline <iso-date>: Update deadline--completed <boolean>: Update completion status--assignee <string>: Update assignees (replaces all)
Output: Updated task
Delete task
Arguments:
task_id: Task UUID
Output: Success message
List meetings
Options:
--limit <number>: Maximum results (1-200, default: 50)--cursor <string>: Pagination cursor--linked-object <string>: Filter by object slug or ID--linked-record-id <uuid>: Filter by specific record ID--participants <emails>: Comma-separated participant emails--sort <start_asc|start_desc>: Sort order (default: start_asc)--ends-from <iso-date>: Filter meetings ending after timestamp--starts-before <iso-date>: Filter meetings starting before timestamp--timezone <tz>: Timezone for all-day meetings (default: UTC)
Example:
attio meeting list --linked-object people --starts-before 2024-12-31T23:59:59Z --sort start_descOutput: List of meetings with pagination cursor
Get specific meeting
Arguments:
meeting_id: Meeting UUID
Output: Full meeting details including participants and linked records
Every command supports --help:
attio --help
attio record --help
attio record create --helpUsage: attio record create <object> [options]
Create a new record in the specified object
Arguments:
object Object ID or slug (e.g., people, companies, deals)
Options:
--data <json> Record data as JSON string (required unless --file)
--file <path> Load record data from JSON file
--api-key <key> Override API key (default: $ATTIO_API_KEY)
--format <format> Output format: json, table, csv (default: json)
-h, --help Display help for command
Examples:
attio record create people --data '{"name": {"first_name": "John"}}'
attio record create companies --file ./company.json
For more information, visit: https://docs.attio.com
{
"error": true,
"status_code": 400,
"type": "validation_error",
"code": "invalid_request",
"message": "Description of the error"
}0: Success1: General error2: Invalid arguments3: Authentication error4: Rate limit exceeded5: Resource not found
- JSON Output: Default JSON output for easy parsing
- Predictable Structure: Consistent response format
- Explicit IDs: Always return full IDs for created resources
- Stdin Support: Commands accept JSON from stdin using
--file - - Exit Codes: Clear exit codes for programmatic error handling
- No Interactive Prompts: All required data via options/arguments
attio record create people --data '{
"name": {"first_name": "John", "last_name": "Doe"},
"email_addresses": [{"email_address": "john@example.com"}]
}'attio record list people \
--filter '{"email_addresses": {"email_address": {"$contains": "@example.com"}}}' \
--limit 50# First get the person record ID
RECORD_ID=$(attio record list people --filter '{"email_addresses": {"email_address": {"$eq": "john@example.com"}}}' | jq -r '.data[0].id.record_id')
# Then add to list
attio entry create my_list --record-id $RECORD_ID --data '{"status": "active"}'attio note create \
--parent-object people \
--parent-record-id abc-123 \
--title "Call Notes" \
--format markdown \
--content "## Discussion\n- Discussed pricing\n- Follow up next week"