Command line

Every tool from a terminal or a CI job, with stable exit codes.

Embed
Preview of the card
<a href="https://seolyticize.com/docs/command-line"><img src="https://seolyticize.com/docs/_api/public/orgs/71cb2b7a-a719-4003-b3ea-6321dc1db8ab/spaces/3bf2dbf7-3faa-473c-ba3b-30588f5f8de4/pages/b6879783-7140-4732-bbe4-df6fec5edbc1/social-card.svg?v=3e7ae33eec8b" alt="Command line" width="600" height="315"></a>

The seolyticize command calls any tool from a terminal or a script. It reads the tool list from discovery when it runs, so a tool added to the platform today is a command today, without a new release. It is built on the TypeScript SDK, and waits out rate limits the same way.

Installing

The command line is not yet published to npm. Build it from the Seolyticize repository:

pnpm --filter @seolyticize/sdk build && pnpm --filter @seolyticize/cli build
node apps/cli/dist/index.js --help

Point an alias or a symlink named seolyticize at apps/cli/dist/index.js to use the commands below as written.

Log in

# Piped, so the key never lands in shell history:
printf '%s' "$KEY" | seolyticize login

# Or interactively (the key is not echoed):
seolyticize login

The key is checked against the API before it is stored, in ~/.config/seolyticize/config.json (or $XDG_CONFIG_HOME/seolyticize/config.json), with permissions 0600 on the file and 0700 on its directory.

SEOLYTICIZE_API_KEY and SEOLYTICIZE_BASE_URL override the stored values, which is how CI should provide them.

seolyticize whoami      # role, reach (agency-wide or one client), tool count
seolyticize logout

Call tools

seolyticize tools                         # what this key may call
seolyticize describe get_top_searches     # a tool's options
seolyticize call get_top_searches --market=uk --since=2026-09-01 --limit=20
seolyticize get_top_searches --market=uk --since=2026-09-01   # same, without "call"

Input can also come as JSON, inline, from a file, or from stdin; options apply on top:

seolyticize call get_keyword_gap --input '{"clientId":"<clientId>","competitorDomains":["a.com"]}'
seolyticize call get_keyword_gap --file gap.json
cat gap.json | seolyticize call get_keyword_gap --file -

Options are typed from the tool's schema: numbers and booleans are converted, arrays take repeated options or commas (--domains=a.com,b.com), objects take JSON, null is null where the schema allows it, and --client-id is accepted for clientId.

Shortcuts

seolyticize clients                        # list_clients
seolyticize rank <trackerId> --client <id> # get_rank_summary
seolyticize alerts --client <id> [--since 2026-10-01T00:00:00Z]   # last 7 days by default

Output

Human-readable tables by default. Scripts should pass --json, which prints the tool's result exactly as the API returned it under data:

seolyticize clients --json | jq -r '.clients[].id'

Errors go to stderr; results go to stdout.

Exit codes

Stable, so scripts can branch on them:

Code

Meaning

0

success

1

unexpected error

2

usage error (bad command, option or JSON)

3

authentication failed (missing, unknown, revoked)

4

not permitted (role or client scope)

5

not found (no such tool for this key)

6

invalid input (did not match the tool's schema)

7

refused (a well-formed request the product declined)

8

rate limited (after the SDK's retries)

9

server error or network failure

Updated