Skip to main content
The gtm CLI is the front door to the SDK: ten command groups covering account research, CRM sync, web search, enrichment, meeting exports, and webhook operations.

Invocation

The package installs a gtm entrypoint; both forms are equivalent:
uv run gtm <group> <command> [OPTIONS]
uv run python -m cli.main <group> <command> [OPTIONS]
Two root-level commands exist outside the groups: gtm hello (smoke test) and gtm version (prints gtm v<VERSION>).

Command groups

GroupCovers
gtm accountsGTM workflows: research, enrichment, people discovery, batch CRM loads
gtm apolloApollo people and organization enrichment and search
gtm attioAttio CRM: people, companies, notes, enrichment backfills
gtm enrichmentLinkedIn enrichment via Harvest
gtm exaExa web search, company and people discovery
gtm gmailGmail URL and token decoding
gtm granolaLocal-first Granola meeting exports
gtm parallelParallel web search, content extraction, entity discovery
gtm sanitySanity CMS content downloads
gtm webhookWebhook registry: Modal endpoints + Hookdeck wiring

Shared conventions

Every command follows the CLI contract:
  • Success data is JSON on stdout; errors and logs go to stderr.
  • Mutations preview by default--apply (or --modal-sync on Attio people commands) is required to write.
  • Provider-backed commands execute on your deployed Modal app; local-only commands (version, gmail url decode, granola export, sanity blog download, webhook list) need no deployment.
  • Every command accepts --json with a full payload that overrides individual flags.
  • Keys resolve per Secrets and API keys, with per-invocation --<service>-api-key overrides.
The per-group reference pages are generated from the CLI’s own --help text by scripts/docs-cli_reference-generate.py, and CI fails if they drift from the code — what you read here is what the binary ships.
Last modified on July 14, 2026