CLI
Manage your Vendo data pipeline from the terminal with the Vendo CLI. Log in, manage apps, sources, destinations and jobs, and use JSON output in scripts, CI and AI agents.
Last reviewed October 10, 2026
Command-line interface. Manage apps, sources, destinations, jobs and models from your terminal.
Installation
curl -fsSL https://app2.vendodata.com/install.sh | bashThe installer downloads the latest Vendo CLI binary for your platform and verifies its SHA-256 checksum. It installs vendo to ~/.local/bin and sets up shell completions when possible. If ~/.local/bin is not on your PATH, the installer tells you. Add it, then open a new terminal.
The CLI is one native binary for macOS (Apple silicon and Intel) and Linux (x64 and arm64). It uses the certificates of your system for HTTPS, for example the macOS keychain. To use a company certificate, add it to the certificate store of your system.
The CLI source code, releases and issue tracker are at github.com/vendo-analytics/vendo-cli .
Quickstart
vendo login
vendo workspace
vendo statusLog in
The CLI stores credentials in a profile at ~/.config/vendo/config.json. Log in once and every command after that works with no flags.
Browser login (recommended)
vendo loginWhen the CLI has no API key that works, vendo login signs you in through the browser:
- The CLI prints the sign-in URL and opens it in your browser when you press Enter.
- In the browser, confirm the Vendo account. If you have access to more than one account, select the account.
- The CLI saves an account-scoped API key in a profile. The profile name is the account slug.
- The CLI checks the key with
/api/v1/meand shows thevendo workspacescreen for the profile that it saved.
Acme Corp · acme-corp
Account ID: 7f3a9b2c-1d4e-4f5a-8b6c-2d1e0f9a8b7c
Profile: acme-corp
Base URL: https://app2.vendodata.com
API key: vend...8b7c (key ID key_2f752aed, scopes full access)
Checks
[ok] CLI 1.1.0 at ~/.local/bin/vendo, on PATH
[ok] Config ~/.config/vendo/config.json
[ok] Zsh completions installed
[ok] Signed in as Acme Corp
Next steps
Run `vendo help` to see everything you can do.
Done: Vendo CLI setup complete.If the key check fails, vendo login shows the screen with the failed check, then the error, and exits with code 1.
If the saved key works, vendo login keeps it and shows the screen again. It does not create a second key. These cases start a new browser sign-in:
- You add
--force. - The API rejects the saved key (HTTP 401 or 403).
- You use
--envor--base-urlto select a different Vendo instance from the saved profile’s instance.--envacceptsstagingandprod, for examplevendo login --env staging.
If the key check fails for a different reason, for example a network error, vendo login changes nothing. It exits with code 1.
If stdin is a pipe or a file, vendo login reads a line from it in place of the Enter key. See Prompts in scripts and CI.
vendo init, the old name, still works. It does the same as vendo login, but it is not in the help.
Log in with VENDO_API_KEY
When the VENDO_API_KEY environment variable is set, the CLI uses that key in place of the profile’s key. vendo login then checks that key and never opens a browser. If the key works, vendo login shows Using the API key in VENDO_API_KEY. and the workspace screen. It does not save the key.
In these cases, vendo login stops with exit code 1. The error tells you to unset VENDO_API_KEY to sign in through the browser:
- The API rejects the key (HTTP 401 or 403).
- You add
--force. - You use
--envor--base-urlto select a different Vendo instance from the key’s instance.
Headless login (CI, scripts, automation)
For environments without a browser, create an account-scoped API key in Workspace Settings → Developers → API Keys (see Creating an API Key). Then give the key and the account ID to vendo login:
vendo login --api-key vendo_sk_… --account <account-id>The CLI checks the credentials with /api/v1/me and writes the same profile that the browser login writes. Commands after that need no flags.
Check the session
vendo workspace # the account, your profiles and the setup checks
vendo logout # remove the saved credentials of the active profile
vendo logout --all # remove every saved profilevendo workspace shows who you are and checks your setup on one screen:
Acme Corp · acme-corp
Account ID: 7f3a9b2c-1d4e-4f5a-8b6c-2d1e0f9a8b7c
Profile: acme-corp
Base URL: https://app2.vendodata.com
API key: vend...8b7c (key ID key_2f752aed, scopes full access)
Profiles
* acme-corp 7f3a9b2c…
sandbox 0c1d2e3f… stg.vendodata.com
Checks
[ok] CLI 1.1.0 at ~/.local/bin/vendo, on PATH
[ok] Config ~/.config/vendo/config.json
[ok] Zsh completions installed
[ok] Signed in as Acme Corp- The first line is the account name and the account slug. The API key shows masked.
- Profiles shows when you have two or more saved profiles.
*marks the profile in use. - Checks shows
[ok],[warn]or[fail]for each check. A check with a problem shows its fix below it.
vendo workspace also works when you are not logged in or offline. It then shows the values that your config has and the checks with their fixes.
vendo workspace exits with code 1 only when you are not signed in. For example, the API key is missing, the profile does not exist or the API rejects the key. No answer from the API also gives code 1. A setup problem, for example the CLI not on your PATH, is a warning. Scripts can use vendo workspace as a sign-in check.
vendo workspace replaces vendo whoami and vendo doctor. These commands, vendo profile current and vendo config show still work and show the same as vendo workspace. They are not in the help. vendo doctor exits with code 1 when any check fails, also a setup check.
vendo logout --all asks for confirmation at a terminal. In a script or CI, add --yes. See Prompts in scripts and CI.
Profiles and accounts
Each login saves a profile. Use the profile commands to see and change profiles:
vendo profile list # all saved profiles; * marks the profile in use
vendo profile switch # select a profile from a list (at a terminal)
vendo profile switch <profile> # switch by profile name
vendo profile switch --account <accountId> # switch by account ID
vendo profile set --account <account-id> # set values on the active profile
vendo --profile # select a profile from a list and make it active
vendo --profile <name> status # use a profile for one command
vendo status --profile # select a profile from a list for this command only--profile with no name opens a list of your saved profiles at a terminal. Each row shows the profile name, the account ID and the host of the base URL. The default base URL shows no host. * marks the profile in use. Use the arrow keys to move, type to filter and press Enter to select:
vendo --profilewith no command makes the profile that you select active. It does the same asvendo profile switch <name>.--profileas the last word of a command runs that command with the profile that you select. The saved active profile does not change.
vendo profile switch with no profile name opens the same list.
--profile with no name must be the last word. The CLI reads the word after --profile as the profile name. Where the list cannot open (see Prompts in scripts and CI), --profile with no name is a usage error (exit code 2). When you have no saved profiles, it shows No profiles to choose from. and exits with code 2.
vendo profile set accepts --api-key, --account and --base-url. The vendo config commands still work: config use is profile switch, config set is profile set, and config reset is logout --all.
Select a profile with VENDO_PROFILE
The VENDO_PROFILE environment variable selects a profile in the same way as --profile. Use it to select a profile for one shell or one CI job:
export VENDO_PROFILE=sandbox
vendo statusThe CLI selects the profile in this order:
--profile <name>VENDO_PROFILE- The active profile that you saved with
vendo profile switchorvendo login
An empty VENDO_PROFILE has no effect. VENDO_PROFILE never changes the saved active profile:
vendo profile setwrites to the profile thatVENDO_PROFILEselects.vendo logoutremoves the profile thatVENDO_PROFILEselects.vendo logindoes not make the profile that it saves active. It tells you how to select that profile withVENDO_PROFILE.
vendo profile switch changes the saved active profile. If VENDO_PROFILE names a different profile, the CLI tells you that VENDO_PROFILE still overrides the active profile in this shell. With --json, it does not show this note.
If no profile has the name in VENDO_PROFILE, a command that sends a request with the profile’s API key stops with exit code 1. vendo logout stops too:
Error: Profile "nope" not found (VENDO_PROFILE selects it).
Run `vendo profile list` to see your profiles, or unset VENDO_PROFILE to use the active profile.vendo profile list and vendo profile switch still work. vendo profile set creates a profile with that name.
Find a command
vendo help (or vendo --help) shows all commands in three sections. Each group shows its commands on the line below its description, for example list, diagnose, get, …:
Account:
login Authenticate with your Vendo account
logout Remove stored credentials
workspace Show the current account, your profiles and setup checks
status Account health overview
help Print this message or the help of the given subcommand(s)
version Print version
profile Manage account profiles
list, switch, set
update Update the Vendo CLI using the hosted installer
Data pipeline:
apps Manage apps
list, diagnose, get, pause, resume, delete, create, update
…| Section | Commands |
|---|---|
| Account | login, logout, workspace, status, help, version, profile, update |
| Data pipeline | apps, sources, destinations, jobs |
| Data catalog | catalog, dictionary, metrics, models, measurement |
vendo <command> --help shows the flags and examples of a command. vendo help <command> shows the same help. On each command’s help, --profile and --debug are under Global options.
vendo version shows the CLI version, as vendo --version does. With --json, it prints {"version": "<version>"}.
vendo commands is not in the help. It shows the same list as vendo help. For the full command tree as JSON, see vendo commands --json.
Group menu
At a terminal, run a group without its command, for example vendo apps or vendo measurement ltv. The CLI shows a menu of the commands in that group:
- Use the up and down arrow keys to move.
- Type to filter by name and description.
- Press Enter to run the selected command. If you select a group, its menu opens.
- Press Esc or Ctrl-C to close the menu. The CLI exits with code 0 and runs nothing.
The CLI runs the selected command as if you typed it, with the global options that you typed. If the command needs a value, for example <appId>, the CLI asks for it. See Missing values.
The menu shows only when stdin, stdout and stderr are terminals. In these cases, a group without its command shows the group’s help on stderr and exits with code 2:
- The command runs in a script, a pipe or CI.
CIorVENDO_NO_INPUTturns off prompts. See Prompts in scripts and CI.TERMisdumb.
vendo with no command shows the main help, as before.
Missing values
At a terminal, a command that you type without a required value asks for that value. The CLI does not ask for optional values.
? vendo apps get
> a0000001... Demo Shop shopify source active
a0000002... Demo Ads google_ads source, destination active
a0000003... Demo Warehouse bigquery destination inactive
[↑↓ to move, enter to select, type to filter]- An ID of an app, source, destination, job, model or metric: a list of the items that the
listcommand of the group returns. Each row shows the short ID and a few columns that tell the items apart. The list shows the newest 500 items or fewer. - A platform, for example for
vendo catalog getorvendo apps create --type: a list of the platforms that are ready to connect. - A methodology, a cohort period, a dictionary entry, a sync type or a data type: a list of the values that you can use.
- A name, a search text, a date or a file path: a question on one line. Type the value and press Enter.
The CLI puts the value where you would type it and runs the command as if you typed it. A delete or a cancel still asks for confirmation. --dry-run, --json and --output apply as usual.
- If the list is empty, the CLI shows a message, for example
No apps to choose from., and exits with code 2. - Press Esc or Ctrl-C to stop. The CLI exits with code 0 and runs nothing.
- If the command cannot run, for example because there is no API key, the CLI shows that error before it asks.
The CLI asks only where the group menu can show. In other cases, a missing value is a usage error (exit code 2), as before.
Select from a list
At a terminal, these commands show their rows as a list that you can select from:
vendo apps list,vendo sources list,vendo destinations listandvendo jobs listvendo catalog list,vendo dictionary list,vendo metrics listandvendo models listvendo measurement methodologies list,vendo measurement ltv listandvendo measurement signals listvendo profile list
The list has the same rows as the table, without the header. The count of the table is in the line below the list. Use the arrow keys to move and type to filter. Press Enter to select an item:
- The CLI shows the details of the item, as the
getcommand of the group shows them. For a cohort, it shows the details asvendo measurement ltv cohortdoes. For a signal or a profile, it shows no details. - A menu shows the actions that you can do with the item, and back.
? vendo apps
> pause Pause an app
delete Delete an app (soft delete)
back Back to the list| Item | Actions |
|---|---|
| App | pause when it is active or resume when it is inactive, delete |
| Source | sync when it is active, pause or resume, delete |
| Destination | sync when it is active, refresh-source when it has a source app, pause or resume, delete |
| Job | tail and cancel when it is queued, pending or running |
| Metric | activate when it is a draft, delete |
| Signal | click-path for the click_path signal |
| Profile | switch, if it is not the saved active profile |
The menu does not show update, because update needs at least one flag. To change an item, type vendo <group> update <id> with the flags to change.
A platform, a dictionary entry, a model, a methodology and a cohort have no actions. Their menu shows only back.
The CLI runs the action that you select as if you typed it, for example vendo apps pause <appId>. A delete or a cancel still asks for confirmation. After the action, the CLI stops with the exit code of the action. Select back to go back to the list. Press Esc or Ctrl-C to stop. The CLI exits with code 0 and runs nothing.
The list shows only where the group menu can show. Where the list cannot show, the command prints the table, as before. With --json or --output, the command prints what it did before: the JSON or the chosen field. If there are no rows, the command prints the table and its count.
The get commands and the actions also work as commands that you type, without the list.
Commands
Account health
vendo statusShows the total, active, paused and errored apps, sources and destinations in your account. It also shows the recent job failures and the next steps.
Apps
vendo apps list # list all apps
vendo apps diagnose # show apps that need attention
vendo apps get <appId> # get app details
vendo apps pause <appId> # pause an app
vendo apps resume <appId> # resume a paused app
vendo apps delete <appId> # delete an app (asks for confirmation)Sources
vendo sources list # list all data sources
vendo sources get <sourceId> # get source details
vendo sources sync <sourceId> # start a manual sync
vendo sources sync <id> --watch # sync and wait until the job completes
vendo sources pause <sourceId> # pause a source
vendo sources resume <sourceId> # resume a paused source
vendo sources delete <sourceId> # delete a source (asks for confirmation)Destinations
A destination sends data from Vendo to another platform.
vendo destinations list # list all destinations
vendo destinations get <destinationId> # get destination details
vendo destinations sync <destinationId> # start a manual sync
vendo destinations sync <id> --watch # sync and wait until the job completes
vendo destinations refresh-source <id> # import source data that is missing for a time window
vendo destinations pause <destinationId> # pause a destination
vendo destinations resume <destinationId> # resume a paused destination
vendo destinations delete <destinationId> # delete a destination (asks for confirmation)The old command names vendo integrations and vendo int still work. They do the same as vendo destinations.
Jobs
vendo jobs list # list sync jobs
vendo jobs list --status running # filter by status
vendo jobs get <jobId> # get job details
vendo jobs tail <jobId> # follow one job live
vendo jobs tail --source <id> # follow the latest job of a source
vendo jobs tail --integration <destinationId> # follow the latest job of a destination
vendo jobs tail --source <id> --next # wait for the next new job, then follow it
vendo jobs cancel <jobId> # cancel a pending or running job (asks for confirmation)
vendo jobs watch # live view of running and pending jobsjobs list --status accepts queued, pending, running, completed, warning, failed and canceled. jobs list --type accepts import, export, data_quality and attribution. Press TAB after the flag to see the values.
The --integration flag of jobs list, jobs tail and jobs watch takes a destination ID.
jobs tail --next
With --source or --integration, the --next flag changes what jobs tail follows. The CLI does not follow the latest job that exists. It waits for the next new job and then follows it. Use it before you start a sync, so that you see the job from the start.
# Wait for the next job of this source, then follow it
vendo jobs tail --source 1a2b3c4d --next
# Wait for the next job of this destination
vendo jobs tail --integration 5e6f7a8b --nextUse jobs tail to follow one sync. Use jobs watch for a live view of all running and pending jobs:
vendo jobs watch --interval 10 # refresh every 10 seconds
vendo jobs watch --source <id> # only the jobs of one sourceCatalog
vendo catalog list # the platforms that are ready to connect
vendo catalog list --all # every platform, also the ones on request
vendo catalog list --category advertising # filter by category
vendo catalog list --role destination # filter by role (source, destination)
vendo catalog get <appType> # details of one platformvendo catalog list shows the platforms that are ready to connect. At a terminal, you can select a platform to see its details (see Select from a list). The Availability column shows ready or on request. The last line counts the platforms and tells you how to see all of them:
35 ready · 560 more on request (vendo catalog list --all)With --category or --role, the counts are for that filter, and the hint keeps the filter, for example (vendo catalog list --category advertising --all). vendo catalog get shows the availability of one platform on its Availability line.
The catalog commands need an API key, but they do not need an account ID.
Models
vendo models list # list data models
vendo models get <modelId> # get model detailsmodels list shows the ID, name, type, validity and last validation of each data model. The type is the model type, for example sql. models get shows the details of one model, for example its description, primary keys and SQL query.
Other commands
vendo dictionary, vendo metrics and vendo measurement are in the main help. Run vendo <command> --help to see their commands and flags.
Connect an AI tool
CLI 1.1.0 removed the vendo mcp command. To connect an AI tool such as Claude or Cursor to Vendo, see MCP Server.
Short IDs
Most tables show the first 8 characters of an ID and then ..., for example 1a2b3c4d.... The Job ID column of vendo status shows the 8 characters without .... You can use these 8 characters in place of the full ID of an app, source, destination, job, metric, model or methodology. Type them with or without the ...:
vendo apps list
vendo apps get 1a2b3c4d
vendo apps get 1a2b3c4d...
vendo jobs list --source 1a2b3c4dThe CLI finds the full ID in the list of that resource just before it sends the request:
- If one item matches, the CLI uses its full ID.
- If more than one item matches, the command stops with exit code 1 before it sends the request. The error lists the matching items (10 or fewer) and tells you to use the full ID.
- If no item matches, the CLI sends the short ID as you typed it. The API then answers as for any other unknown ID.
Error: Short ID 1a2b3c4d matches 2 apps:
1a2b3c4d-1111-4111-8111-111111111111 Demo Shop shopify
1a2b3c4d-2222-4222-8222-222222222222 Demo Ads google_ads
Use the full ID.The CLI reads the first 500 items of the list, in the order of the API. For jobs, these are the 500 newest jobs. For an item that is not in the first 500, use the full ID. For metrics, the CLI also looks at archived metrics when no other metric matches.
The CLI does not look up a full ID. It does not look up a short ID on a --dry-run. For a delete or a cancel, it looks up the short ID only after you confirm.
JSON output and AI agents
The CLI works well for scripts and AI agents. Add --json to get output that a program can read.
JSON output
With --json, most commands that show API data print the API response as the API sent it. Other commands make their own JSON, for example vendo workspace, vendo status and vendo apps diagnose.
vendo workspace --json has all the keys that vendo whoami --json and vendo doctor --json had. data is the /api/v1/me response, and config shows where each value comes from. summary, checks and suggestions show the checks. When the CLI gets no answer from /api/v1/me, the JSON has no data and no identity, and stderr has no JSON error.
These commands got --json in CLI 1.1. Their JSON does not include the API key:
| Command | JSON on stdout |
|---|---|
vendo login | {"profile", "baseUrl", "accountId", "auth", "accountName", "workspace"}. auth is verified, unverified or incomplete. workspace is what vendo workspace --json prints for the profile. Messages, for example the sign-in URL, go to stderr. |
vendo logout | {"removed": [profile names]} |
vendo profile list | {"profiles": [{"name", "active", "accountId", "baseUrl"}]} |
vendo profile switch | {"profile": {...}}. With --json, the command never opens the list. profile is null when you give no profile name or --account, or when there are no profiles. |
vendo profile set | {"profile": {...}, "configPath"} |
vendo jobs tail | Nothing while it waits. Then the last job, as vendo jobs get --json prints it. |
vendo jobs watch | One line of JSON each time the job list changes (newline-delimited JSON) |
vendo completions <shell> | {"shell", "script"} |
vendo completions | {"shell", "installed"}. Both are null when the CLI cannot detect your shell. |
vendo update | {"previousVersion", "version", "installPath", "binaryPath"}. The installer’s output goes to stderr. |
vendo version | {"version"} |
--debug output, warnings and the update notice go to stderr, so they do not change the JSON on stdout.
JSON errors
With --json, an error is one line of JSON on stderr. It is the last line on stderr. It always has this shape:
{"error":{"message":"App not found","code":"NOT_FOUND","status":404,"requestId":"req_2f752aed80804759"}}| Field | Value |
|---|---|
message | The text that the error shows after Error: |
code | The API’s error code, for example NOT_FOUND. null when the API sends no code. |
status | The HTTP status of the API’s answer. null when no answer came back, for example after a timeout or a network error. |
requestId | The ID on the Request ID: line of the text error. null when the text error has no Request ID: line. |
An error that the CLI finds itself has only a message. For example, no API key, a missing --yes or a bad flag value:
{"error":{"message":"This deletes app 1a2b3c4d-0000-0000-0000-000000000000. Re-run with --yes to confirm.","code":null,"status":null,"requestId":null}}The exit codes do not change with --json:
1for an error.2for a usage error, for example an unknown command or a missing argument. When the command includes--json, the usage error is JSON too. Its message includes the tips of the text error, for exampletip: a similar subcommand exists: 'list'.
--debug output, warnings and the update notice can come before the JSON error on stderr. Read the last line.
Some commands print a JSON error and exit with code 0, as their text versions do:
vendo logout --jsonwhen you are not logged in.vendo jobs tail --jsonwhen the job fails or the wait times out. Stdout still has the last job.
vendo destinations refresh-source --json prints the API response on stdout also when the API answers with the status unavailable. It then prints the JSON error on stderr and exits with code 1.
The command tree
vendo commands --json prints every command as a tree. The CLI reads it from its own command definitions, so it always matches the help. Each command has these fields:
name,path,descriptionandaliasesargumentsandoptionscommands: the commands in a group
Each option has name, short, valueName, description, required, default and global. possibleValues lists the values that the CLI accepts. suggestedValues lists the values that TAB offers, for example the job statuses of jobs list --status. help, completions and old command names, for example vendo init, vendo int, vendo whoami and vendo self-update, are not in the tree.
Prompts in scripts and CI
The CLI asks a question only when stdin and stdout are terminals. These are the questions and menus:
- The y/N confirmation of
delete,jobs cancelandlogout --all - The group menu
- The questions for missing values
- The profile list of
vendo profile switchand of--profilewith no name - The lists of the
listcommands (see Select from a list)
The menus and lists show only when stdin, stdout and stderr are terminals.
The “Press ENTER to open in the browser” step of vendo login is different. vendo login always shows this line. In these cases, it reads stdin and opens the browser when it reads a line:
- Stdin is not a terminal, for example a pipe.
echo | vendo loginopens the browser. - Stdin is a terminal and prompts are on. Stdout does not have to be a terminal.
To turn off all prompts, also at a terminal, set CI or VENDO_NO_INPUT. Any value turns prompts off, except an empty value, 0 or false. Most CI services set CI for you. There is no --no-input flag.
export VENDO_NO_INPUT=1When prompts are off, or when the CLI runs without a terminal:
- A delete, cancel or
logout --allneeds--yes. Without--yes, the command stops with exit code 1 before it sends a request.--jsondoes not replace--yes. - A group without its command shows its help and exits with code 2.
- A command without a required value shows its usage error and exits with code 2.
- The
listcommands print their tables. vendo profile switchwithout a profile name does not ask. It printsCancelled.and changes nothing.--profilewithout a name is a usage error (exit code 2).
When CI or VENDO_NO_INPUT turns off prompts at a terminal, vendo login does not wait for Enter and does not open a browser. It prints the sign-in URL and waits for the sign-in. If stdin is a pipe or a file, vendo login still reads it, also when CI or VENDO_NO_INPUT is set.
TERM=dumb turns off the group menu, the questions for missing values, the profile list and the lists of the list commands. The y/N confirmations still ask.
An AI agent that runs vendo on a pseudo-terminal waits at these menus, questions and lists. For example, vendo apps list waits at the list and does not print the table. Set VENDO_NO_INPUT=1 for the agent, or add --json or --output to a list command.
CI example
For CI, use a headless login once at the start of the job:
vendo login --api-key vendo_sk_… --account <account-id>
vendo sources sync 1a2b3c4d --watch --json
vendo apps delete <appId> --yesKeep the API key in a secret of your CI service. The headless login writes the same profile that the browser login writes. All commands after it in the same runner need no flags.
Options
Global options
| Flag | Description |
|---|---|
--profile <name> | Use a specific account profile (or set VENDO_PROFILE). With no name, select a profile from a list (see Profiles and accounts) |
--debug | Show request diagnostics and request IDs on stderr |
-h, --help | Show help for any command |
-V, --version | Show the CLI version |
--debug
The --debug flag (or the VENDO_DEBUG=1 environment variable) shows diagnostics for each request:
- Request: the method, the URL and the CLI’s request ID.
- Response: the status, the server’s request ID (
X-Request-Id) and the duration in milliseconds. - Failure: the API’s error message and error code.
# Turn on with the flag
vendo sources list --debug
# Turn on with an environment variable
VENDO_DEBUG=1 vendo jobs list --status failedThe debug output goes to stderr, so it does not change --json output that you send to other tools.
Common command flags
| Flag | Description |
|---|---|
--json | Print JSON (see JSON output and AI agents) |
--limit <n> | Number of results (default: 20) |
--offset <n> | Pagination offset |
--output <field> | Print a single field for each row, for example id |
-y, --yes | Skip the confirmation (delete, cancel and logout --all) |
--dry-run | Show what the command does without doing it |
--watch | Wait until the job completes after you start a sync |
Examples
Scripting with JSON output
# Get the IDs of all failed jobs
vendo jobs list --status failed --json | jq -r '.data[].id'
# Count the sources
vendo sources list --json | jq '.meta.pagination.total'
# Read the error code of a failed command
vendo apps get <appId> --json 2>&1 >/dev/null | tail -n 1 | jq -r '.error.code'Monitoring
# Follow the next source sync live
vendo jobs tail --source 1a2b3c4d --next
# Check the account and the setup
vendo workspaceStart a sync and wait
# Sync and wait until the job completes
vendo sources sync 1a2b3c4d --watch
# Or start the sync and monitor it separately
vendo sources sync 1a2b3c4d
vendo jobs list --source 1a2b3c4dShell completions
The installer sets up TAB completion for bash, zsh and fish when it can. It saves the completion script and makes your shell load it:
| Shell | Where the installer sets up completions |
|---|---|
| zsh | ~/.zshrc |
| bash | ~/.bashrc. On macOS, also the login file that bash reads: ~/.bash_profile, ~/.bash_login or ~/.profile. If none exists, the installer creates ~/.bash_profile. |
| fish | ~/.config/fish/completions/vendo.fish |
On macOS, Terminal opens bash as a login shell. A login shell reads the login file, not ~/.bashrc.
The installer and vendo update run vendo completions <shell>. The help does not list vendo completions, but you can run it. To see whether completions are set up for your shell, run vendo completions with no shell. It tells you what the command does, whether completions are installed and how to install them. It writes this text to stderr and nothing to stdout. vendo workspace checks completions too.
Set up completions manually
Zsh. Add these lines at the end of ~/.zshrc:
autoload -Uz compinit && compinit
eval "$(vendo completions zsh)"Put them after the line that loads a framework such as oh-my-zsh, Prezto or Zim. A compinit that runs after the eval line removes the Vendo completions. vendo completions and vendo workspace count the eval line only when compinit, or a framework that runs it, comes before it.
Bash. Add this line to ~/.bashrc. On macOS, add it to ~/.bash_profile, or to the login file that your bash reads:
eval "$(vendo completions bash)"Fish. Save the script where fish loads it:
vendo completions fish > ~/.config/fish/completions/vendo.fishThen open a new terminal.
TAB also offers the values of flags that have a fixed list of values, for example vendo jobs list --status.
Updating
vendo status, vendo workspace and the browser sign-in of vendo login check for a new version once a day. When a new version is available, the CLI tells you on stderr.
vendo updateTo install a specific version, not the latest:
vendo update --version 1.1.0The --version flag downloads and installs that release. Use it to go back to a version that you know works, or to keep CI on one CLI version. To install a specific version with the installer, set VENDO_VERSION:
curl -fsSL https://app2.vendodata.com/install.sh | VENDO_VERSION=1.1.0 bashFrom CLI 0.3.x, update with vendo self-update. In 1.1.0, vendo self-update still works and does the same as vendo update.
Coming from an earlier version
CLI 1.1.0 replaces the TypeScript CLI 0.3.1. Your profiles, your config file and your scripts keep working. The old command names still work, but they are not in the help:
| Old | Now |
|---|---|
vendo init | vendo login |
vendo integrations, vendo int | vendo destinations |
vendo config ... | vendo profile ... |
vendo config use | vendo profile switch |
vendo whoami, vendo doctor | vendo workspace |
vendo profile current, vendo config show | vendo workspace |
vendo config reset | vendo logout --all |
vendo self-update | vendo update |
Other changes that can affect a script:
- A delete,
jobs cancelandlogout --allneed--yeswhen no one can answer the question.--jsonno longer replaces--yes. See Prompts in scripts and CI. - With
--json, nested keys keep the API’s snake_case, and an error is one line of JSON on stderr. See JSON output and AI agents. - A wrong command or flag exits with code 2, not 1.
vendo mcpis removed. See MCP Server.
The full list of changes is in the CLI changelog .
Related
- Authentication: create and manage API keys
- API Overview: use the REST API directly
- MCP Server: connect AI tools to Vendo