Guides

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 --version

The 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.sh

The 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 json

Sign 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 json

To 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 create

Search 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 120

Edit 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 HIDDEN

Use --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 --global

Choose 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 --project

Run 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 --global

Claude 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.json

Configure 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 5m

Use 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.

sellapp wallet topups create CUSTOMER_ID 25.00 \
  --payment-method STRIPE \
  --idempotency-key topup-customer-001

Replace 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-001

These 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_ID

Closing 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.

On this page