Install and sign in

Install the era command, sign in with your browser, and read or change anything in Era from your terminal.

The API, SDK and CLI

era is Era from your terminal: every resource and every action of every module, plus sites (era init, era deploy) and AI assistants (era mcp). It talks to the public Era API as you — it can never do more than you can in the app.

Install

npm install -g @getera/cli
# or: bun add -g @getera/cli
era --help

Node 18 or newer is enough for everything except the site commands (era init, era dev, era build, era deploy), which need Bun — run those as bunx era ….

Sign in

era login

Confirm the code

era login prints an address and a short code, and opens your browser. Check that the code in the browser matches the one in your terminal.

Choose what the terminal may reach

On Era's consent card pick the workspace, which modules the terminal may use and whether it may only read. The terminal gets exactly that — never more than you can do there.

Done

  Signed in as Ada Lovelace — workspace 7f1c… — 14 modules.
FlagWhat it does
--no-browserOnly print the address (SSH sessions, servers). Open it on any device.
--scope "crm retail:read"Ask for less than everything, e.g. sales in full and the shop read-only.
--base-url http://localhost:3001Sign in to another Era (development).
--profile workKeep several sign-ins side by side; pass --profile to any command.

The sign-in is stored in one file only you can read — %APPDATA%\era\credentials.json on Windows, ~/.config/era/credentials.json elsewhere (ERA_CONFIG_DIR moves it). It renews itself; after 60 days without use, sign in again. era logout signs out and revokes the token.

In CI and scripts

Skip era login and set one environment variable; it wins over the saved sign-in:

export ERA_API_KEY=era_…        # an API key (Settings → Advanced → API keys)
# or
export ERA_TOKEN=erat_…         # an OAuth access token
export ERA_BASE_URL=https://app.getera.io

Check who you are

era whoami
Ada Lovelace  (2b9e…)
workspace  7f1c…
signed in  era login  ·  https://app.getera.io
scopes     * offline_access
modules    crm(read,write) retail(manage,read,write) …

Your first commands

era resources                                   # what you can read here
era orders list --status unfulfilled --limit 20 # any column is a filter
era orders list --where "total_amount[gte]=10000" --json
era orders get ORDER_ID
era actions retail                               # every retail action you may run
era actions retail.cancel_order                  # its fields and refusals
era orders cancel_order ORDER_ID --reason "Customer asked"
era crm capture_lead --customer-id CUSTOMER_ID --message "Wants the yearly plan"
era run crm.capture_lead --data '{"customerId": "CUSTOMER_ID"}'
era api GET /api/v1/me                           # any API call
era memory recall "what did Ada ask for?"

Fields are --field value (kebab-case works: --customer-id); a whole JSON body is --data '{…}', --data @file.json or --data - for stdin. Output is a table; --json gives raw JSON. Every write is sent with an idempotency key, so a retry after a dropped connection does not do the work twice.

Messages fail clearly when the channel is not connected — nothing goes out some other way:

era channels
era whatsapp send --customer CUSTOMER_ID --text "Your order is on its way"
# era: WhatsApp is not connected — connect it in Settings → Integrations (…). Nothing was sent.

Exit codes

CodeMeaning
0Done
2Bad command or input
3Not signed in, or the sign-in ended
4Refused: no permission, not found, or a precondition failed
5Failed
6Could not reach Era
7Timed out — check the result before retrying a write

Inside an Era chat

In the terminal of an Era Desktop chat, era is the chat's own session command (The era command) — it needs no era login. Everywhere else, the same binary is the public command described on this page.

Next

Was this page helpful?