Attio CRM commands.
Every command follows the CLI contract: JSON on stdout, errors on stderr, and command-specific mutation safety controls. Keys resolve as described in Secrets and API keys.
Examples
Search people by any combination of criteria (name, email, domain, phone, company):
uv run gtm attio people search --email-domain "acme.dev" --limit 10
# Browse recent records without a filter.
uv run gtm attio people search --sample
Create a person. This writes immediately after the default Modal deployment-parity
preflight; --modal-sync controls that preflight, not whether the write happens:
uv run gtm attio people add "jane@acme.dev" \
--first-name "Jane" \
--last-name "Doe" \
--company "acme.dev"
Update an existing person by email:
uv run gtm attio people update --email "jane@acme.dev" \
--company "acme.dev" \
--first-name "Jane"
Create or update deterministically by email with upsert:
uv run gtm attio people upsert "jane@acme.dev" \
--first-name "Jane" \
--last-name "Doe"
Company creation also writes when invoked (it does not use --apply):
uv run gtm attio companies add --domain "acme.dev" --name "Acme Corp"
gtm attio people
Manage people records in Attio.
gtm attio people add
uv run gtm attio people add [OPTIONS] [EMAIL]
| Argument | Type | Required |
|---|
EMAIL | text | no |
| Option | Type | Default | Description |
|---|
--add-email | text | [] | Additional email for this person (repeat for multiple). |
--first-name | text | — | First name |
--last-name | text | — | Last name |
--phone | text | — | Phone number |
--linkedin | text | — | LinkedIn profile URL |
--location | text | — | Primary location |
--country-code | text | — | ISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp. |
--company | text | — | Company domain |
--notes | text | — | Intake notes |
--strict | boolean | false | Fail fast on optional-field mismatches |
--location-mode | text | city | Location normalization mode: city|raw |
--no-connectivity-probe | boolean | false | Skip Modal connectivity preflight |
--modal-sync | text | check | Modal sync strategy for mutation commands: check|deploy|skip |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override Attio API key |
gtm attio people search
uv run gtm attio people search [OPTIONS]
| Option | Type | Default | Description |
|---|
--name | text | — | Search by name (fuzzy, case-insensitive) |
--email | text | — | Search by exact email address |
--email-domain | text | — | Search by email domain (e.g. continue.dev) |
--phone | text | — | Search by phone number (partial match) |
--company | text | — | Search by company name or domain |
--sample | boolean | false | Fetch recent records without filtering (overrides all search criteria) |
--limit | integer | 25 | Max results to return |
--no-connectivity-probe | boolean | false | Skip Modal connectivity preflight |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override Attio API key |
gtm attio people update
uv run gtm attio people update [OPTIONS]
| Option | Type | Default | Description |
|---|
--email | text | — | Email to look up person |
--id | text | — | Attio record ID |
--add-email | text | [] | Email to merge onto the person (repeat for multiple). Existing addresses are kept; duplicates are dropped. |
--replace-emails | boolean | false | Replace stored emails with lookup identity (—email) plus —add-email only (no merge with existing). |
--first-name | text | — | First name |
--last-name | text | — | Last name |
--phone | text | — | Phone number |
--linkedin | text | — | LinkedIn profile URL |
--location | text | — | Primary location |
--country-code | text | — | ISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp. |
--company | text | — | Company domain |
--notes | text | — | Intake notes |
--strict | boolean | false | Fail fast on optional-field mismatches |
--location-mode | text | city | Location normalization mode: city|raw |
--no-connectivity-probe | boolean | false | Skip Modal connectivity preflight |
--modal-sync | text | check | Modal sync strategy for mutation commands: check|deploy|skip |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override Attio API key |
gtm attio people upsert
uv run gtm attio people upsert [OPTIONS] [EMAIL]
| Argument | Type | Required |
|---|
EMAIL | text | no |
| Option | Type | Default | Description |
|---|
--add-email | text | [] | Extra email to store (repeat for multiple). On update, merged with existing unless —replace-emails. |
--replace-emails | boolean | false | On update, set emails to identity email plus —add-email only. |
--first-name | text | — | First name |
--last-name | text | — | Last name |
--phone | text | — | Phone number |
--linkedin | text | — | LinkedIn profile URL |
--location | text | — | Primary location |
--country-code | text | — | ISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp. |
--company | text | — | Company domain |
--notes | text | — | Intake notes |
--strict | boolean | false | Fail fast on ambiguity or optional-field mismatches |
--location-mode | text | city | Location normalization mode: city|raw |
--no-connectivity-probe | boolean | false | Skip Modal connectivity preflight |
--modal-sync | text | check | Modal sync strategy for mutation commands: check|deploy|skip |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override Attio API key |
gtm attio companies
Manage company records in Attio.
gtm attio companies add
Add a company to Attio.
uv run gtm attio companies add [OPTIONS] [NAME]
| Argument | Type | Required |
|---|
NAME | text | no |
| Option | Type | Default | Description |
|---|
--domain | text | — | Company domain |
--description | text | — | Company description |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
gtm attio companies search
Search for companies in Attio.
uv run gtm attio companies search [OPTIONS]
| Option | Type | Default | Description |
|---|
--name | text | — | Search by company name |
--domain | text | — | Search by exact domain |
--limit | integer | 25 | Max results to return |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
gtm attio companies update
Update an existing company in Attio.
uv run gtm attio companies update [OPTIONS]
| Option | Type | Default | Description |
|---|
--domain | text | — | Domain to look up company |
--id | text | — | Attio record ID |
--name | text | — | New company name |
--description | text | — | New description |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
gtm attio companies create-attribute-type
Create an attribute on companies.
uv run gtm attio companies create-attribute-type [OPTIONS]
| Option | Type | Default | Description |
|---|
--title | text | — | Display title for the new attribute |
--api-slug | text | — | API slug for the new attribute (derived from title when omitted) |
--type | text | select | Attio attribute type (e.g. select, text, number) |
--description | text | "" | Attribute description shown in Attio |
--is-multiselect, --no-is-multiselect | boolean | true | Allow multiple values per record |
--is-required, --no-is-required | boolean | false | Require a value on every record |
--is-unique, --no-is-unique | boolean | false | Enforce unique values across records |
--apply | boolean | false | Perform the write to Attio (default is preview) |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
Preview by default: without --apply this command prints the planned mutation and writes nothing. See the CLI contract.
gtm attio notes
Manage notes in Attio.
gtm attio notes add
Add a note to a person or company in Attio.
uv run gtm attio notes add [OPTIONS] [TITLE] [CONTENT]
| Argument | Type | Required |
|---|
TITLE | text | no |
CONTENT | text | no |
| Option | Type | Default | Description |
|---|
--object | text | "" | Parent object: ‘people’ or ‘companies’ |
--record-id | text | — | Parent record ID |
--email | text | — | Look up person by email |
--domain | text | — | Look up company by domain |
--format | text | plaintext | Content format: plaintext or markdown |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
gtm attio notes update
Update an existing note in Attio (replaces via delete + create).
uv run gtm attio notes update [OPTIONS] [NOTE_ID]
| Argument | Type | Required |
|---|
NOTE_ID | text | no |
| Option | Type | Default | Description |
|---|
--title | text | — | New title |
--content | text | — | New content |
--format | text | plaintext | Content format: plaintext or markdown |
--json | text | — | JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
gtm attio enrichment
Backfill missing fields on Attio records.
gtm attio enrichment backfill-domains
Backfill missing domains on Attio Companies.
uv run gtm attio enrichment backfill-domains [OPTIONS]
| Option | Type | Default | Description |
|---|
--ext-tam-filter | text | — | JSON filter for ext_tam (e.g., ’{“source”:“snowflake_scored_accounts_csv”}‘) |
--company-ids | text | — | Comma-separated Company record IDs |
--limit | integer | — | Max Companies to process |
--sleep-seconds | float | 0.0 | Sleep between Companies |
--apply | boolean | false | Actually PATCH (default: preview only) |
--json | text | — | Full JSON payload (overrides flags) |
--attio-api-key | text | — | Override the Attio API key for this invocation |
--exa-api-key | text | — | Override the Exa API key for this invocation |
Preview by default: without --apply this command prints the planned mutation and writes nothing. See the CLI contract. Last modified on July 14, 2026