Skip to main content
The norbelys CLI puts your whole Norbelys workspace in your terminal. People, campaigns, senders, segments, deliverability, analytics — each is a command, and it stays perfectly in step with the platform because every command is generated from the same definitions the product itself uses. Sign in once and drive everything from the shell or a script.
A terminal session: curl installs the CLI, norbelys login signs in to the Xuxil org, whoami confirms it, and people list prints a table of leads.

Install, sign in, and go — the CLI reads back exactly what the API returns.

The CLI works on the same Norbelys workspace as the dashboard and the API — the same fields, the same limits, the same safety rails. Whatever you can do in the app, you can do here, scripted.

Install

1

Run the installer

It downloads a single self-contained bundle, drops a norbelys launcher in ~/.norbelys/bin, and adds that to your PATH. The CLI runs on Bun or Node; if you have neither, the installer sets Bun up for you. Override the location with NORBELYS_INSTALL.
2

Open a new terminal

So the updated PATH takes effect (or run the export PATH=… line the installer prints). Verify:
3

Sign in

See Sign in below for the browser flow and the API-key alternative.
On a machine you’d rather not run a compiled binary on, the CLI is just a JS bundle — the launcher runs it with your existing bun/node. Nothing is hidden.

Sign in

Two credentials work, and both authenticate the exact same way (Authorization: Bearer …). The CLI stores them in ~/.config/norbelys/config.json, readable only by you (mode 0600).
Four steps: you run login and a local listener opens the browser; you approve in Clerk and pick the org; Clerk redirects to 127.0.0.1 with a one-time code; the CLI exchanges it for a ~24h token that auto-refreshes.

norbelys login opens your browser once; the CLI then keeps the session fresh on its own.

  • norbelys whoami shows the active organization, the auth method, and the profile.
  • norbelys logout revokes the session and deletes the stored credential.
  • Browser sessions last about 24 hours and refresh automatically — you sign in once and the CLI keeps the token fresh until you log out. API keys never expire.

How commands work

Commands mirror the API’s procedures, folded into a tree: norbelys <resource> <verb> [id] [--flags]. Nested paths become nested commands (programs senders add). --help at any level lists what’s there, and every flag is generated from the procedure’s own schema.
  • Positional argument = path parameternorbelys people find <id>.
  • Flags = body/query fields, named exactly as in the API (--givenName, --status).
  • Nested fields are flags too--<field>.<sub>, so nothing routine needs hand-written JSON:
    --help lists every nested flag, so the shape is never a guess.
  • Open key/value fields take pairs--customFields "company=Acme,city=Bogotá".
  • Lists are comma-separated--expand steps,senders (repeating a flag keeps only the last).
  • --data carries a whole body when you want one: inline '{…}', @file.json, or - for stdin. Individual flags override it per field, so you can keep a base body in a file and change one value on the command line.
  • norbelys api <METHOD> <path> calls any endpoint directly, like curl with your auth already attached: norbelys api GET /organization.
Inputs are validated against the same schemas as the API before the request goes out, so a wrong field is caught locally with the exact error — no round-trip to find out.

What you can reach

Run norbelys --help for the full grouped list, or norbelys <group> --help to drill in.

Output & scripting

Human-friendly tables by default; add --json for raw JSON on stdout. Everything non-data — prompts, spinners, notices — goes to stderr, so pipelines stay clean.
  • Exit codes are stable: 0 success, non-zero on error; auth failures print a clear re-authenticate hint.
  • --json silences color, tables, and the update notice — safe to parse.
Anything destructive or outward-facing — deletes, messages create (a real email, even a test), programs bulk, programs launch/resumeasks you to confirm. Pass --yes to skip the prompt. In a non-interactive shell these fail closed unless --yes is given, so a piped script can never silently blast mail.

Audit a campaign before launch

programs audit is a read-only preflight. It expands the saved cadence and mailboxes, checks that the campaign is genuinely complete, validates Liquid in the subject, preheader, and body, and renders every saved version against a bounded sample of enrolled leads. It sends nothing.
The report catches the failures that a campaign shell cannot show: missing arms or copy, subjects/preheaders that never personalize, Liquid that fails on real data, low-coverage merge fields, disabled tracking/unsubscribe, and a full UTM URL displayed as link text. A tracked link keeps its complete URL in href; the visible label can stay short, such as getarbol.com.

Import a CSV

Bringing a lead list in from a CSV is one command. It maps common columns automatically (Email, First Name, Last Name, Phone), and --map handles headers that don’t match.
  • Columns you don’t map become custom fields (keyed by the column name); pass --skip-unmapped to drop them instead.
  • Add everyone to a list or campaign as they import: --group grp_… / --campaign prog_….
  • Rows without an email are skipped; large files are sent in chunks, and new addresses are verified in the background.

Multiple organizations

Each credential is scoped to one organization, so multi-org means one profile per org:
Without --profile, commands use your default profile (or NORBELYS_PROFILE).

Staying current

The CLI also checks for a new release about once a day and prints a one-line notice to stderr when there is one. Silence it with --json, a CI environment, or NORBELYS_NO_UPDATE_CHECK=1.

Troubleshooting

Open a new terminal so the updated PATH loads, or run the export PATH="…/.norbelys/bin:$PATH" line the installer printed. Then norbelys version.
Your credential isn’t scoped to an organization. For an API key, create an org-scoped key (Settings → API keys). For browser login, make sure you picked an organization on the consent screen — that choice becomes the token’s org.
The CLI also prints the sign-in URL — open it manually. On a headless/SSH box without a browser, use an API key instead: norbelys login --api-key ak_… (or NORBELYS_API_KEY).
Set NORBELYS_API_KEY=ak_… in the environment — it short-circuits login entirely, so there’s no interactive step and nothing written to disk. Add --yes to any destructive command.

How it works

The CLI, the MCP server, Norbe, and the dashboard all act on one workspace through one API, with the same kind of credential. The CLI can only do what your credential can, on the organization it belongs to — nothing more. Pick whichever surface fits the task; they never disagree.

Prefer AI agents?

The same API is available to Claude, Cursor, and any MCP client via the Norbelys MCP server.