Skip to main content
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]
ArgumentTypeRequired
EMAILtextno
OptionTypeDefaultDescription
--add-emailtext[]Additional email for this person (repeat for multiple).
--first-nametextFirst name
--last-nametextLast name
--phonetextPhone number
--linkedintextLinkedIn profile URL
--locationtextPrimary location
--country-codetextISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp.
--companytextCompany domain
--notestextIntake notes
--strictbooleanfalseFail fast on optional-field mismatches
--location-modetextcityLocation normalization mode: city|raw
--no-connectivity-probebooleanfalseSkip Modal connectivity preflight
--modal-synctextcheckModal sync strategy for mutation commands: check|deploy|skip
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride Attio API key
uv run gtm attio people search [OPTIONS]
OptionTypeDefaultDescription
--nametextSearch by name (fuzzy, case-insensitive)
--emailtextSearch by exact email address
--email-domaintextSearch by email domain (e.g. continue.dev)
--phonetextSearch by phone number (partial match)
--companytextSearch by company name or domain
--samplebooleanfalseFetch recent records without filtering (overrides all search criteria)
--limitinteger25Max results to return
--no-connectivity-probebooleanfalseSkip Modal connectivity preflight
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride Attio API key

gtm attio people update

uv run gtm attio people update [OPTIONS]
OptionTypeDefaultDescription
--emailtextEmail to look up person
--idtextAttio record ID
--add-emailtext[]Email to merge onto the person (repeat for multiple). Existing addresses are kept; duplicates are dropped.
--replace-emailsbooleanfalseReplace stored emails with lookup identity (—email) plus —add-email only (no merge with existing).
--first-nametextFirst name
--last-nametextLast name
--phonetextPhone number
--linkedintextLinkedIn profile URL
--locationtextPrimary location
--country-codetextISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp.
--companytextCompany domain
--notestextIntake notes
--strictbooleanfalseFail fast on optional-field mismatches
--location-modetextcityLocation normalization mode: city|raw
--no-connectivity-probebooleanfalseSkip Modal connectivity preflight
--modal-synctextcheckModal sync strategy for mutation commands: check|deploy|skip
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride Attio API key

gtm attio people upsert

uv run gtm attio people upsert [OPTIONS] [EMAIL]
ArgumentTypeRequired
EMAILtextno
OptionTypeDefaultDescription
--add-emailtext[]Extra email to store (repeat for multiple). On update, merged with existing unless —replace-emails.
--replace-emailsbooleanfalseOn update, set emails to identity email plus —add-email only.
--first-nametextFirst name
--last-nametextLast name
--phonetextPhone number
--linkedintextLinkedIn profile URL
--locationtextPrimary location
--country-codetextISO-3166-1 alpha-2 country code paired with —location (e.g. US, IN). Required for the location to be written; see ai-sfp.
--companytextCompany domain
--notestextIntake notes
--strictbooleanfalseFail fast on ambiguity or optional-field mismatches
--location-modetextcityLocation normalization mode: city|raw
--no-connectivity-probebooleanfalseSkip Modal connectivity preflight
--modal-synctextcheckModal sync strategy for mutation commands: check|deploy|skip
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride 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]
ArgumentTypeRequired
NAMEtextno
OptionTypeDefaultDescription
--domaintextCompany domain
--descriptiontextCompany description
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride the Attio API key for this invocation
Search for companies in Attio.
uv run gtm attio companies search [OPTIONS]
OptionTypeDefaultDescription
--nametextSearch by company name
--domaintextSearch by exact domain
--limitinteger25Max results to return
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride the Attio API key for this invocation

gtm attio companies update

Update an existing company in Attio.
uv run gtm attio companies update [OPTIONS]
OptionTypeDefaultDescription
--domaintextDomain to look up company
--idtextAttio record ID
--nametextNew company name
--descriptiontextNew description
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride 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]
OptionTypeDefaultDescription
--titletextDisplay title for the new attribute
--api-slugtextAPI slug for the new attribute (derived from title when omitted)
--typetextselectAttio attribute type (e.g. select, text, number)
--descriptiontext""Attribute description shown in Attio
--is-multiselect, --no-is-multiselectbooleantrueAllow multiple values per record
--is-required, --no-is-requiredbooleanfalseRequire a value on every record
--is-unique, --no-is-uniquebooleanfalseEnforce unique values across records
--applybooleanfalsePerform the write to Attio (default is preview)
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride 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]
ArgumentTypeRequired
TITLEtextno
CONTENTtextno
OptionTypeDefaultDescription
--objecttext""Parent object: ‘people’ or ‘companies’
--record-idtextParent record ID
--emailtextLook up person by email
--domaintextLook up company by domain
--formattextplaintextContent format: plaintext or markdown
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride 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]
ArgumentTypeRequired
NOTE_IDtextno
OptionTypeDefaultDescription
--titletextNew title
--contenttextNew content
--formattextplaintextContent format: plaintext or markdown
--jsontextJSON payload (overrides flags)
--attio-api-keytextOverride 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]
OptionTypeDefaultDescription
--ext-tam-filtertextJSON filter for ext_tam (e.g., ’{“source”:“snowflake_scored_accounts_csv”}‘)
--company-idstextComma-separated Company record IDs
--limitintegerMax Companies to process
--sleep-secondsfloat0.0Sleep between Companies
--applybooleanfalseActually PATCH (default: preview only)
--jsontextFull JSON payload (overrides flags)
--attio-api-keytextOverride the Attio API key for this invocation
--exa-api-keytextOverride 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