SellApp CLI
Read your store, edit your catalog, and discover exact commands from your terminal.
Use the official sellapp CLI to work with your stores from the terminal.
Installation
Install with Node.js 22 or newer:
npm install -g @sell.app/cli
sellapp --versionThe npm package includes the matching executable. Installation and first use do
not download another binary. Linux and macOS support x64 and arm64. Windows
supports x64, arm64, and 32-bit x86 (ia32), including 32-bit Node.js on 64-bit
Windows. npm selects the executable that matches your Node.js architecture.
Standalone archives require neither Node.js nor Go. Download the matching archive
from GitHub Releases,
extract it, and put sellapp (sellapp.exe on Windows) on your PATH.
On macOS, Linux, and WSL, download and run the installer:
curl -fsSL https://sell.app/docs/cli/install.sh -o install.sh
sh install.shThe installer verifies the archive checksum and installs
without sudo to $XDG_BIN_HOME or ~/.local/bin. Set SELLAPP_INSTALL_DIR to
choose a directory, SELLAPP_INSTALL_VERSION to pin a version, or
SELLAPP_INSTALL_NO_MODIFY_PATH=1 to leave shell profiles unchanged. Follow its
PATH instructions; a new shell may be required.
From a source checkout, build with Go 1.25 or newer using
go build -o sellapp ./cmd/sellapp (-o sellapp.exe on Windows). Add the
executable to your PATH, or use ./sellapp. A plain source build supports
offline discovery, dry runs, and API-key authentication.
It does not include the official browser-login registration. Use an official
release for sellapp login and the MCP bridge.
First request
With the binary on your path, connect the official CLI and select a store:
sellapp login
sellapp stores list
sellapp stores use launch-lab
sellapp products list --limit 1 --output jsonSign in in the browser and approve access across current and future accessible
stores. The admin grant remains constrained by your current membership and role.
One available store is selected automatically; choose one in the terminal when
several are available. Replace launch-lab with a slug returned by stores list.
With no stores, login still succeeds. Use sellapp setup for guided connection,
selection or explicit creation and a bounded first read. For scripts:
sellapp setup --create --name "Launch Lab" --slug launchlab --output jsonTo create separately, use sellapp stores create --name "Launch Lab" --slug launchlab.
Add --use only when you want to select the result locally. Keep the
--idempotency-key and exact request when retrying one intended creation. If
selection fails after creation, use the returned slug with sellapp stores use;
the successful creation result is retained.
Your login is saved and refreshed automatically. Normal setup does not require a
keyring service or manual token handling. Use sellapp login --no-browser when
the browser cannot open. See CLI authorization for
troubleshooting and personal disconnect.
The CLI prints the products as a JSON array. [] with exit code 0 means
your store has no products and the request worked. The HTTP API wraps that
array in data; the CLI list output unwraps it.
See first-request troubleshooting if authentication fails.
Find the next command
sellapp search products
sellapp products create --help
sellapp products create --schema
sellapp --llms
sellapp workflow list
sellapp workflow show product-variant
sellapp docs products createSearch returns up to 10 command summaries. Use --limit (1–25) and --offset
to page through matches. JSON output includes results, total, and
next_offset; a null next_offset means there are no more pages. Zero matches
return an empty results array with exit code 0. Each result includes a
schema command for inspecting its complete inputs, authentication, effects,
pagination, and retry rules. Search and schemas work without login.
--llms lists commands and schema lookups without repeating their full metadata.
Use --llms-full only when you need the complete catalog.
Use the resource ID as a positional argument and parent IDs as named flags:
sellapp products get 120
sellapp product-variants get 4321 --product 120Edit your catalog
These requests create real records. A complete ordinary catalog edit runs directly; the terminal prompts for missing required inputs. Scripts must supply them explicitly.
sellapp products create \
--title "Design kit" \
--description "Templates for your next project." \
--visibility HIDDENUse --body @file.json or --body - for complex JSON. Use --set FIELD=JSON
for explicit nulls or nested values. Supplying the same field twice is an error.
Do not combine stdin for a body with stdin for an upload.
Consequential actions, including checkout creation and deletion, require
confirmation. Supply --yes in automation only when you intend the effect.
Use --dry-run to build a redacted request without contacting the API.
Agents and MCP
Install the bundled skill for this project or across projects:
sellapp skills add --project
sellapp skills add --globalChoose one scope. By default, the skill installs under .agents/skills/sellapp
in the project or your home directory. To select another client:
sellapp skills add --client claude-code --project
sellapp skills add --client cursor --projectRun the command for your client: Claude Code uses .claude/skills/sellapp;
Cursor uses .cursor/skills/sellapp. Replace --project with --global for
your user. Start a new agent session and select the sellapp skill. If it is
missing, check the reported installation directory and the client's project trust settings.
Repeating installation updates generated files while preserving local edits.
A conflict stops the update; --force explicitly replaces modified files.
Scripts must supply a scope.
The skill explains command discovery, account-wide access and the selected target,
bounded reads, dry runs, confirmations, idempotency, and error recovery.
sellapp agent print also prints the common guidance.
Register the hosted MCP bridge with your client:
sellapp mcp add --client codex --global
sellapp mcp doctor --client codex --globalClaude Code and Cursor are also supported. Check --help for supported scope
choices. Registration preserves unrelated configuration and refuses a conflicting
SellApp entry. It does not write tokens into client configuration. Diagnostics check local
configuration, hosted authentication and connection state without business mutations.
Bare sellapp mcp (or sellapp --mcp) starts a stdio bridge using your saved
OAuth login. It obtains a short-lived MCP-only credential internally and connects
to hosted Sell MCP. Compact mode is the default. Choose --mode catalog for the searchable tool
catalog, --mode full for individual tools, or --mode retrieval for search and
fetch. Both compact and catalog modes discover operation details on demand. Tool schemas, permissions and consequential
confirmation come from the hosted runtime. It does not fall back to local REST
execution when the server is unavailable. An API-key profile must run
sellapp login before using MCP. Normal business commands continue to use REST.
--llms prints the compact command index; --llms-full prints full metadata.
A leaf command's --schema works without authentication. The eight focused
workflows are also available through the MCP tool sellapp_get_workflow.
File transfers retain their CLI/SDK paths; hosted MCP cannot read local files.
Automation
Redirected output defaults to JSON. Explicit --output always wins. Response
data goes to stdout; diagnostics go to stderr. One page is the default;
--all enables pagination, with --max-items and --max-pages available to bound it.
sellapp products list --all --max-items 100 --output json > products.jsonConfigure an API key or authorize a CLI profile before running automation. Noninteractive commands do not start login implicitly. See OAuth authorization for credential isolation and store access.
API keys for automation
A server-side API key with the listing ability can read products through
SELLAPP_API_KEY and SELLAPP_STORE. An environment API key takes precedence
over saved OAuth access. Remove it from the environment to use the saved login.
Keep keys in your automation secret storage, outside source code and logs.
Updates
For npm installations, run npm install -g @sell.app/cli@latest. For standalone
installations, rerun the installer or use a verified new archive. The CLI does
not update in the background.
Charges, wallet top-ups, and ticket shortcuts
After sellapp login, select your store with sellapp stores use SLUG and check it with sellapp products list --limit 1. The commands below create real records or change balances and ticket state. Add --dry-run to inspect a request without sending it. Add --yes only when you intend to confirm a write in a script.
Create a charge
sellapp charges create 25.00 USD \
--email maya.chen@example.com \
--return-url https://example.com/payment-return \
--payment-methods '["STRIPE","PAYPAL"]'The positional amount uses major units: 25.00 USD sends total: 2500. JPY accepts whole amounts; supported currencies such as HUF and TWD use two ISO minor-unit places. Extra decimal places are rejected without rounding. The existing --total 2500 --currency USD and JSON-body forms remain available. Do not combine the amount shorthand with --total, --currency, --body, or --set.
Use --use-all-payment-methods to offer all usable methods, or --payment-method STRIPE to preselect one. For a custom method, pass --payment-method CUSTOM_PAYMENT_METHOD --custom-payment-method-id METHOD_ID. Use --custom-payment-method-ids '["METHOD_ID"]' with a custom-method choice to restrict the allowed methods. IDs must come from sellapp payment-methods custom list; availability depends on your store and currency.
Creation returns the charge and its data.url. It does not prove payment. A repeated charge creation can create a second charge: inspect the original result or list charges after an uncertain failure before trying again.
sellapp charges get CHARGE_ID
sellapp charges open CHARGE_ID
sellapp charges wait CHARGE_ID --timeout 5mUse the returned charge ID in these commands. open retrieves and opens its returned HTTPS checkout URL. wait polls every two seconds, for at most 300 reads and the chosen timeout. Use --interval and --max-polls to set smaller bounds. Only COMPLETED produces completed: true. REVIEW keeps waiting for independent merchant review; this command never approves payment. Failed, voided, reversed, refunded, or disputed states, unknown states, and timeout return a nonzero exit code with the last charge when available. A failed read stops polling.
Give a customer a wallet top-up payment link
sellapp wallet topups create CUSTOMER_ID 25.00 \
--payment-method STRIPE \
--idempotency-key topup-customer-001Replace CUSTOMER_ID with the existing customer's ID. The command returns checkout_url, the link to share with that customer, and charge_id, which you can inspect with charges get or charges wait. Both the HTTP API and CLI JSON wrap these fields in data: read data.checkout_url and data.charge_id.
Wallet top-ups use USD only. Wallets must be enabled and unfrozen, the amount must fit your store's top-up limits, and the selected payment method must be enabled for wallet top-ups. You need both wallet and charge permissions. Custom methods also require --custom-payment-method-id METHOD_ID.
Creating the link leaves the wallet balance unchanged. Successful payment credits the deposit and any bonus saved at creation once. Custom-method modifiers do not change the deposit. Submitted payment proof and browser returns do not prove payment; verify funds independently before approving a custom payment. Return and cancel links lead to the store's customer portal wallet.
Retain the same idempotency key, customer, store, amount, and payment method to recover a response within 24 hours. Changed input returns 409. After an uncertain provider outcome, inspect charges before starting a new top-up. For integer cents or nested JSON, use the original form: wallet topups create CUSTOMER_ID --amount-cents 2500 --payment-method STRIPE --idempotency-key KEY.
Adjust a wallet directly
sellapp wallet credit CUSTOMER_ID 25.00 --note "Goodwill credit" --idempotency-key goodwill-001
sellapp wallet debit CUSTOMER_ID 5.00 --note "Correct an earlier credit" --idempotency-key correction-001These commands change spendable USD funds immediately without collecting payment. Both require a note and an explicit, stable idempotency key. Supply a positive amount; the command applies the direction. Debits cannot exceed available funds after holds. Reuse the same key and identical input for a retry; use a new key for a new adjustment. These keys belong to the saved wallet transaction and do not expire like the 24-hour response receipts. wallet adjust retains the full integer-cents request interface.
Update a ticket
sellapp tickets close TICKET_ID --idempotency-key ticket-close-001
sellapp tickets reopen TICKET_ID
sellapp tickets archive TICKET_IDClosing an open ticket notifies the customer. Close and reopen change only status; archive changes only the archive flag. Use tickets update TICKET_ID --archived=false to unarchive. For response replay after a lost connection, retain the optional idempotency key and inputs. Current ticket permissions and write confirmation still apply.