Wave CLI
Install the wave command, sign in from your browser, and list, search, export, and organize your recordings from the terminal.
The Wave CLI puts your recordings in the terminal. It's an npm package called @waveai/cli that installs a wave command, so you can list sessions, search them, print a transcript, download audio, or pipe any of it into a script. Every command that returns data takes --json, which makes it easy to compose with other tools.
It's free on every Wave plan and needs Node.js 20 or newer. It runs on macOS, Linux, and Windows.
Install
npm install -g @waveai/cliTo try it without installing anything:
npx @waveai/cli sessions listSign in
Run:
wave loginYour browser opens an Authorize Wave CLI page showing the account you're signed in as and what the CLI will be able to do. Click Authorize CLI, and the page confirms with You can close this tab and return to your terminal. The terminal picks up the credential and reports how many sessions you have.
Signing in this way creates an API token named Wave CLI with every permission your account supports — including permanently deleting sessions. If you want something narrower, skip the browser flow: create a token with only the permissions you need on the Developer API page and run wave login --token wave_api_... instead.
Two other ways to authenticate:
wave login --token wave_api_...— paste a token you created yourself. Good for CI and headless machines.- Set a
WAVE_API_KEYenvironment variable. It takes precedence over whateverwave loginstored, which makes it easy to run one command as a different account.
wave whoami shows the account, subscription state, and session count. wave logout clears the stored credential from this machine.
To cut off a machine you no longer control, revoke the token named Wave CLI in the Wave web app under the Integrations tab, then Developer API. That kills it everywhere it was used.
The commands
Sessions
wave sessions list— with--limit,--since(accepts7d,2w,1m),--type,--folder,--tag(repeatable), and--tag-mode.wave sessions get <id>— metadata, summary, notes, tags, and phone-call details for one session.wave sessions update <id>— set--title,--notes,--tags,--favorite/--no-favorite.wave sessions add-folder <session_id> <folder_id>andwave sessions remove-folder— folders are non-exclusive, so adding one doesn't remove another.wave sessions action-items get <session_id>andwave sessions action-items update <session_id>— read action items with their version, then write them back from a file or stdin, optionally guarded with--if-matchso a concurrent edit in the app is rejected rather than overwritten.wave sessions delete <id>— permanent, and it asks for confirmation unless you pass--force.
Content
wave search "your query"— semantic search, with--limitand--tagfilters.wave transcript <id>— print a transcript.--formattakestext(the default),srt, orsegments;--speakersswitches to speaker-labeled output, and--jsonreturns the raw response.wave media urls <id>— signed audio and video URLs.wave media download <id>— saves the audio; add--videofor MP4 or--outputfor a specific path.wave bulk [ids...]— export up to 50 sessions at once, with--summaryand--transcript.wave stats— counts and durations broken down by type and platform.
Folders
wave folders list— names, ids, and session counts.wave folders create "Customer research" --color "#6D28D9"— safe to re-run; a matching name returns the existing folder.
Events and webhooks
wave events list --ack,wave events ack <cursor>, andwave events tail --interval 3 --ack --json— consume new sessions without hosting a webhook receiver. Wave remembers your position per token.wave webhooks list / create / update / test / rotate-secret / delete— manage push delivery, including sending a test event and rotating a signing secret.
Config
wave config get, wave config set <key> <value>, and wave config path manage api_key, api_url, and default_format in your OS config directory. wave config path prints the exact file, which is handy when you're wiping credentials by hand.
A couple of things worth scripting
Back up the last week of recordings, transcript included:
wave sessions list --since 7d --limit 50 --json \
| jq -r '.sessions[].id' \
| xargs wave bulk --summary --transcript --json > backup.jsonWatch for new sessions and act on each one as it lands:
wave events tail --interval 3 --ack --jsonCommands map one-to-one onto the Wave Developer API, so anything the CLI does you can also do from your own code — and the CLI is a quick way to see what a response looks like before you write any.
FAQ
api.wave.co/cli lists every command with examples, and wave --help (or --help on any subcommand) prints the same thing locally. The package itself is at npmjs.com/package/@waveai/cli.
The sign-in gives up after about a minute. Make sure you finish it in the browser profile where you're signed in to Wave, then run wave login again. On a machine with no browser, use wave login --token wave_api_....
API tokens expire a year after they're created. Run wave login again to mint a fresh one.
Yes — set WAVE_API_KEY for that one command. It overrides the stored credential without changing it.
Was this article helpful?
Still need help?