Install and sign in
Install the era command, sign in with your browser, and read or change anything in Era from your terminal.
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 --helpNode 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 loginConfirm 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.| Flag | What it does |
|---|---|
--no-browser | Only 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:3001 | Sign in to another Era (development). |
--profile work | Keep 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.ioCheck who you are
era whoamiAda 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
| Code | Meaning |
|---|---|
0 | Done |
2 | Bad command or input |
3 | Not signed in, or the sign-in ended |
4 | Refused: no permission, not found, or a precondition failed |
5 | Failed |
6 | Could not reach Era |
7 | Timed 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.