Command line reference

Install cloutctl, join a computer, run the shared service and use the complete command and flag reference.

14 min read

On this page

cloutctl operates the same engine as the desktop app from a terminal. It can manage a Linux server without a desktop app window, while browsers themselves can run visibly on a virtual display.

Command line card listing cloutctl commands
cloutctl uses the same engine from a terminal.

Install

Download cloutctl-0.0.52.zip from Download or portal Downloads. It contains the bundled cloutctl.js, data assets, a cloutctl shim and a systemd template. Node 24 or later is required; there is no npm installation step.

node --version
unzip cloutctl-0.0.52.zip -d /opt
ln -s /opt/cloutctl-0.0.52/cloutctl /usr/local/bin/cloutctl
cloutctl --version
cloutctl system doctor

Use a writable installation directory and the privileges appropriate to your server. CLOUTCTL_NODE selects another Node executable for the shim.

Choose the store

Use --store <path> when you intend a specific store. SUNCTL_STORE is the environment equivalent. The default app-support roots are:

OSDefault root
macOS~/Library/Application Support/SunProfiles
Windows%APPDATA%\SunProfiles
Linux$XDG_CONFIG_HOME/SunProfiles, or ~/.config/SunProfiles

An enrolled CLI uses the synced store.sqlite3; the legacy local store is sunprofiles.sqlite3. Profiles created locally before enrolment can remain in that legacy store. About → Data directory and system doctor help verify what you are operating.

Close a desktop that holds the store before starting another writer. A running system serve owns the shared queue; lifecycle commands forward to it when the store matches. --local explicitly bypasses that service for diagnosis.

Join the account

A device join token is created under Settings → Security. Pass it through stdin:

export CLOUT_SYNC_URL=https://sync.cloutlabs.co/v1
export CLOUT_ACCOUNT_API_URL=https://app.cloutlabs.co/api

printf %s "$CLOUT_JOIN_TOKEN" | cloutctl auth join --token - --label agency-node-a
cloutctl auth status
cloutctl node status

A workspace API token is a different credential:

printf %s "$CLOUT_TOKEN" | cloutctl auth login --token - --base-url https://app.cloutlabs.co/api
cloutctl auth whoami --refresh
cloutctl node enrol --self --label agency-node-a

The token needs devices.enrol for self-enrolment. One-time-code enrolment uses node enrol --code instead. Do not put a token directly into a command argument: arguments can remain in shell history and process listings.

auth logout --yes removes the stored workspace credential and cache. Revoke it in the portal too if it should no longer authorise requests.

Prepare browsers on Linux

Use a graphical session, or an X virtual framebuffer for visible browsers:

sudo apt install xvfb
Xvfb :99 -screen 0 1920x1080x24 -nolisten tcp &
export DISPLAY=:99
cloutctl system doctor

run launch --headless is supported, but a hidden browser has a different detection surface. Cookie robot refuses headless operation. Do not treat published concurrency examples as a capacity guarantee for your host.

Prepare engines and launch one profile

cloutctl kernel status --for-fleet
cloutctl kernel install --for-fleet
cloutctl profile list --json
cloutctl run launch --id "$PROFILE_ID"
cloutctl run watch --id "$PROFILE_ID"
cloutctl run stop --id "$PROFILE_ID"

Use an ID returned by profile list. run launch returns pid, port, browser, websocket and log. The detached browser survives the launching command’s exit. Stop through Clout to collect its session.

Run the shared service

cloutctl system serve --daemon --pidfile /run/cloutctl.pid

The service runs the Local API, launch queue and sync loop. It shares global and per-proxy-host admission limits across forwarded launches. Independent one-shot invocations without the service do not share one queue.

Sync only runs inside serve. Local write verbs enqueue account changes on an enrolled box, and serve drains them. A device-token-only box needs CLOUT_ACCOUNT_API_URL for its account write path; a workspace login records its base URL. If the address is missing, writes stay queued locally and the service reports why.

SIGTERM stops new admission, drains accepted launches and exits without killing running browsers. A second signal exits immediately. --json emits a readiness line for supervision.

Use the included cloutctl.service as a template: set its user, working directory and service URLs before enabling it. A CLI installation is not a reason to give a browser computer a database connection.

Script output and refusals

Pipes get JSON on stdout; terminals get readable output. --json forces JSON, --pretty indents it and --quiet suppresses the payload. Errors and progress go to stderr. run watch emits NDJSON state changes.

ExitMeaningResponse
0CompletedContinue
1Operation failedInvestigate the reported error
2Invalid command or flagsFix the command
3Refused by stateRead the refusal before retrying

Engine errors and state refusals carry code, message and detail as JSON on stderr. Usage errors and ordinary errors can be plain text; do not require every stderr line to be JSON. Destructive verbs require --yes or --confirm <n>. The latter is the expected item count, not a generic yes. A mismatch refuses the operation.

The command reference below is transcribed from the CLI’s verb declarations. cloutctl <noun> <verb> --help gives required flags, types, defaults and examples for the installed version.

Global flags

FlagTypePurpose
--storestringOpen this store instead of the default one
--read-onlybooleanOpen the store read-only; a write verb will fail
--jsonbooleanForce JSON on stdout even on a terminal
--prettybooleanIndent JSON output by 2
--quietbooleanPrint no payload on stdout; the exit code is the answer
--yesbooleanConsent to a destructive verb without naming a count
--confirmnumberConsent to a destructive verb by naming the number of items it will touch
--helpbooleanShow this verb’s flags and exit
--versionbooleanPrint the version, source sha, Node and platform

Commands and flags

Commands are grouped by noun. string and number flags take a value; boolean flags can use the --no- form. Required flags are marked required. Repeatable flags accumulate. Global flags apply to every row.

Auth

CommandPurposeFlags
auth loginStore a workspace API token minted in the portal--token (string, required); --base-url (string, default: CLOUT_ACCOUNT_API_URL)
auth joinJoin this machine to an account with a device token from Settings--token (string, required); --label (string, default: the hostname); --server (string, default: CLOUT_SYNC_URL); --agent-dir (string, default: <app-support>/agent)
auth statusWhether this machine is enrolled as a device, and on which account--agent-dir (string, default: <app-support>/agent)
auth logoutDelete the stored token and the cached caps Requires destructive-operation confirmation.None beyond global flags
auth whoamiWhat this machine believes about its account, and how old that belief is--refresh (boolean)

Node

CommandPurposeFlags
node enrolJoin this machine to an account’s fleet with a one-time code--code (string); --self (boolean); --label (string, default: the hostname); --server (string, default: CLOUT_SYNC_URL); --agent-dir (string, default: <app-support>/agent)
node statusEnrolment, cursor and how much of the offline window is left--agent-dir (string, default: <app-support>/agent)

Profile

CommandPurposeFlags
profile listList profiles with live runtime state--group (string); --source (string); --running (boolean); --limit (number); --no-config (boolean); --facts (boolean)
profile getOne profile, including its runtime state (absorbs the old status)--id (string, required); --facts (boolean)
profile createCreate a profile: mint a fingerprint locally, or clone a record with --from--from (string); --group-id (string); --set (string, repeatable); --tab (string, repeatable); --launch-arg (string, repeatable); --disabled-font (string, repeatable); --tls-cipher (string, repeatable); --cookie-file (string); --copy-browser-data (boolean); --name (string); --group (string); --remark (string); --ua (string); --ua-os (string); --cookie (string); --proxy-setting (string); --proxy-type (string); --proxy-host (string); --proxy-port (string); --proxy-user (string); --proxy-pass (string); --proxy-soft (string); --ip-checker (string); --webrtc (string); --timezone-mode (string); --timezone (string); --location-mode (string); --geoposition (string); --language-mode (string); --language (string); --display-language-mode (string); --display-language (string); --screen-resolution-mode (string); --screen-resolution (string); --fonts-mode (string); --webgl-mode (string); --webgl-vendor (string); --webgl-renderer (string); --webgpu-mode (string); --cpu-mode (string); --ram-mode (string); --device-name-mode (string); --device-name (string); --mac-mode (string); --mac-address (string); --do-not-track (string); --port-scan (string); --port-scan-ports (string); --hardware-accel (string); --disable-tls (string); --random-fingerprint-on-startup (string); --chrome-version (number); --cpu-cores (number); --ram-gb (number); --media-mic (number); --media-camera (number); --media-speaker (number); --noise-canvas (boolean); --noise-webgl-image (boolean); --noise-audio (boolean); --noise-media (boolean); --noise-client-rects (boolean); --noise-speech (boolean); --location-ask (boolean); --merge-cookie (boolean)
profile updateEdit the Label and Safe-subset fields of a profile--id (string, required); --name (string); --remark (string); --group-id (string); --config (string)
profile duplicateCopy a profile under a new id--id (string, required); --name (string); --group-id (string); --copy-browser-data (boolean)
profile deleteRemove a profile and its record Requires destructive-operation confirmation.--id (string, required)
profile exportWrite one profile to a JSON file--id (string, required); --output (string; required by the handler)
profile importRegister a profile from a JSON file--input (string, required)
profile clear-cacheDelete cache directories from a profile Requires destructive-operation confirmation.--id (string, required); --type (string, repeatable, default: the browser cache directories)
profile reclaimReport recoverable disk across the fleet; --apply to sweep it--id (string, default: every profile in the store); --apply (boolean, default: report only); --bucket (string, repeatable); --min-bytes (number)
profile set-cookieStore a fresh session cookie and arm one re-materialization--id (string, required); --cookie (string); --cookie-file (string); --reason (string)
profile fingerprintMint one fingerprint from AdsPower’s cloud and print it, writing nothing--compose (boolean); --chrome-version (number); --webgl-vendor (string); --set (string, repeatable); --tab (string, repeatable); --launch-arg (string, repeatable); --disabled-font (string, repeatable); --tls-cipher (string, repeatable); --cookie-file (string); --name (string); --group (string); --remark (string); --ua (string); --ua-os (string); --cookie (string); --proxy-setting (string); --proxy-type (string); --proxy-host (string); --proxy-port (string); --proxy-user (string); --proxy-pass (string); --proxy-soft (string); --ip-checker (string); --webrtc (string); --timezone-mode (string); --timezone (string); --location-mode (string); --geoposition (string); --language-mode (string); --language (string); --display-language-mode (string); --display-language (string); --screen-resolution-mode (string); --screen-resolution (string); --fonts-mode (string); --webgl-mode (string); --webgl-renderer (string); --webgpu-mode (string); --cpu-mode (string); --ram-mode (string); --device-name-mode (string); --device-name (string); --mac-mode (string); --mac-address (string); --do-not-track (string); --port-scan (string); --port-scan-ports (string); --hardware-accel (string); --disable-tls (string); --random-fingerprint-on-startup (string); --cpu-cores (number); --ram-gb (number); --media-mic (number); --media-camera (number); --media-speaker (number); --noise-canvas (boolean); --noise-webgl-image (boolean); --noise-audio (boolean); --noise-media (boolean); --noise-client-rects (boolean); --noise-speech (boolean); --location-ask (boolean); --merge-cookie (boolean)

Run

CommandPurposeFlags
run launchLaunch a profile through the bounded job queue--id (string, required); --headless (boolean); --start-url (string, repeatable); --launch-arg (string, repeatable); --wait-seconds (number, default: 20); --local (boolean); --concurrency (number)
run stopStop a profile, adopted browsers included--id (string, required); --ignore-missing (boolean); --local (boolean)
run stop-allStop every running profile, never throwing on one failure Requires destructive-operation confirmation.--local (boolean)
run watchPoll runtime state and print each state change as NDJSON--id (string); --interval (number, default: 2000); --ticks (number, default: never)
run listShow job-queue runs--id (string); --limit (number)

Task

CommandPurposeFlags
task listSaved tasksNone beyond global flags
task getOne task and its steps, described--id (string, required)
task createSave a task from a JSON step list--name (string, required); --steps (string, default: stdin)
task deleteDelete a task Requires destructive-operation confirmation.--id (string, required)
task runRun a task against named profiles; there is deliberately no --all--task (string, required); --id (string, repeatable); --headless (boolean); --concurrency (number); --keep-open (boolean); --wait-seconds (number, default: 20); --artifacts (string, default: <app-support>/task-runs)
task runsTask-run history, or one run with its steps--run (string); --limit (number)

Group

CommandPurposeFlags
group listList groups with profile countsNone beyond global flags
group createCreate a group--name (string, required); --remark (string)
group updateRename a group or change its remark--id (string, required); --name (string); --remark (string)
group deleteDelete a group, re-homing its profiles Requires destructive-operation confirmation.--id (string, required); --merge-into (string)
group moveMove profiles into a group--id (string, repeatable); --group-id (string, required)

Folder

CommandPurposeFlags
folder listList folders with profile countsNone beyond global flags
folder createCreate a folder--name (string, required); --parent (string); --color (string)
folder updateRename, recolour or re-parent a folder (--parent '' moves to the root)--id (string, required); --name (string); --parent (string); --color (string)
folder deleteDelete a folder; the profiles in it are unfiled, not deleted Requires destructive-operation confirmation.--id (string, required)
folder assignFile profiles into folders--id (string, repeatable); --folder (string, repeatable); --mode (string, default: set)

System

CommandPurposeFlags
system doctorExplain lock, store, kernel, display and disk state in EnglishNone beyond global flags
system settingsRead or update app settings--config (string)
system backupCheckpoint the WAL and copy the store--dir (string); --output (string)
system serveRun the Local API, the job queue and the sync loop--port (number, default: 50326); --daemon (boolean); --pidfile (string); --log (string, default: <app-support>/logs/serve.log); --sync (boolean, default: on); --concurrency (number, default: 4); --agent-dir (string, default: <app-support>/agent)
system adoptCopy the old app’s store and profile directories into --to <userData dir>--to (string, required); --from (string); --inspect (boolean); --force (boolean); --limit (number)
system directory-syncReport which profiles have a directory to ship, and the current flagsNone beyond global flags
system directory-sync-setFlip the ship/wipe policy--wipe-on-stop (boolean); --ship (boolean); --id (string)

Kernel

CommandPurposeFlags
kernel listInstalled browser engines, with their root and disk costNone beyond global flags
kernel statusInstalled vs published vs what this fleet pins--for-fleet (boolean)
kernel installDownload and install a browser engine--major (number); --for-fleet (boolean)
kernel removeDelete an installed engine Requires destructive-operation confirmation.--major (number, required)

Proxy

CommandPurposeFlags
proxy listThe proxy book, credentials removedNone beyond global flags
proxy getOne saved proxy, credential removed--id (string, required)
proxy addBook a proxy--host (string, required); --port (string, required); --type (string, default: http); --user (string); --password (string); --title (string, default: host:port); --country (string); --city (string); --remark (string)
proxy updateEdit a saved proxy; an absent --password leaves it alone--id (string, required); --host (string); --port (string); --type (string); --user (string); --password (string); --title (string); --country (string); --city (string); --remark (string)
proxy deleteRemove a saved proxy Requires destructive-operation confirmation.--id (string, required)
proxy checkResolve the egress identity of a proxy--proxy (string); --saved (string); --id (string); --config (string)
proxy assignAttach a booked proxy to profiles, or detach with --proxy ''--id (string, repeatable); --proxy (string)
proxy rotate-sessionMint fresh sticky-session tokens for profiles--id (string, repeatable)

Pool

CommandPurposeFlags
pool listProxy pools with member and profile countsNone beyond global flags
pool createCreate a proxy pool--name (string, required); --rotation (string, default: round_robin); --remark (string)
pool updateRename a pool or change its rotation--id (string, required); --name (string); --rotation (string); --remark (string)
pool deleteDelete a pool; the profiles that drew from it are unassigned Requires destructive-operation confirmation.--id (string, required)
pool add-memberPut proxies in a pool, take them out, or replace the set--id (string, required); --proxy (string, required, repeatable); --mode (string, default: add)
pool assignPoint profiles at a pool, or at none with --id ''--id (string); --profile (string, required, repeatable)
pool rotateHand out the next proxy and advance the cursor; --peek takes nothing--id (string, required); --peek (boolean)
pool healthHow many members of each pool check out--id (string)

Import

CommandPurposeFlags
import detectDetect all five vendors--vendor (string, repeatable); --count (boolean); --kameleo-workspace (string)
import adspower-previewDry-run an AdsPower export directory--input (string, required); --group (string); --limit (number)
import adspowerImport an AdsPower export directory--input (string, required); --group (string); --limit (number); --overwrite (boolean, default: on)
import adspower-pullImport from the signed-in AdsPower account--api-key (string); --group (string); --limit (number); --overwrite (boolean, default: on); --require-fingerprint (boolean)
import dolphinImport from a Dolphin Anty account--token (string, required); --id (string, repeatable); --limit (number); --group (string); --dry-run (boolean); --full-fetch (boolean); --overwrite (boolean, default: on)
import gologinImport from a GoLogin account--token (string, required); --id (string, repeatable); --limit (number); --group (string); --orbita-version (string); --dry-run (boolean); --overwrite (boolean, default: on)
import multiloginImport from the Multilogin store on this machine--home (string, default: this user's home); --id (string, repeatable); --group (string); --dry-run (boolean); --overwrite (boolean, default: on)
import kameleo-detectReport whether a Kameleo workspace is importable--workspace (string)
import kameleo-previewDry-run a Kameleo workspace, copying nothing--workspace (string); --limit (number)
import kameleoImport Kameleo profiles, directories included--workspace (string); --id (string, repeatable); --limit (number); --group (string); --profiles-root (string); --overwrite (boolean, default: on)
import kameleo-verifyCheck an imported Kameleo profile has everything a launch needs--id (string, required)

Win32

CommandPurposeFlags
win32 planDry-count the MacIntel -> Win32 migration--ledger (string); --batch-size (number); --surfaces (boolean); --vendors (boolean); --probe (boolean); --list (boolean); --chrome-version (number); --webgl-vendor (string); --gpu-family (string); --no-cohort (boolean); --only (string, repeatable); --exclude (string, repeatable)
win32 migrateMigrate ONE batch to Win32 identities Requires destructive-operation confirmation.--ledger (string, required); --gpu-family (string); --batch-size (number); --target-arch (string); --chrome-version (number); --webgl-vendor (string); --speech-voices (string); --only (string, repeatable); --exclude (string, repeatable); --reseed (boolean); --clear-random-ua (boolean); --no-cohort (boolean); --dry (boolean); --force (boolean); --include-drift (boolean); --limit (number)
win32 revertRestore migrated profiles from the ledger Requires destructive-operation confirmation.--ledger (string, required); --batch (string); --id (string, repeatable); --dry (boolean); --force (boolean); --limit (number)

Profile creation field mappings

profile create and profile fingerprint --compose share these field flags. Use the value choices in Creating profiles; modes are passed using their wire values rather than translated button text. --set key=value can override a launch-record field and is repeatable.

FlagTypeLaunch-record key
--namestringname
--groupstringgroup
--remarkstringremark
--uastringua
--ua-osstringua_os
--cookiestringcookie
--proxy-settingstringproxy_setting
--proxy-typestringproxy_type
--proxy-hoststringproxy_host
--proxy-portstringproxy_port
--proxy-userstringproxy_user
--proxy-passstringproxy_pass
--proxy-softstringproxy_soft
--ip-checkerstringip_checker
--webrtcstringwebrtc
--timezone-modestringtimezone_mode
--timezonestringtimezone
--location-modestringlocation_mode
--geopositionstringgeoposition
--language-modestringlanguage_mode
--languagestringlanguage
--display-language-modestringdisplay_language_mode
--display-languagestringdisplay_language
--screen-resolution-modestringscreen_resolution_mode
--screen-resolutionstringscreen_resolution
--fonts-modestringfonts_mode
--webgl-modestringwebgl_mode
--webgl-vendorstringwebgl_vendor
--webgl-rendererstringwebgl_renderer
--webgpu-modestringwebgpu_mode
--cpu-modestringcpu_mode
--ram-modestringram_mode
--device-name-modestringdevice_name_mode
--device-namestringdevice_name
--mac-modestringmac_mode
--mac-addressstringmac_address
--do-not-trackstringdo_not_track
--port-scanstringport_scan
--port-scan-portsstringport_scan_ports
--hardware-accelstringhardware_accel
--disable-tlsstringdisable_tls
--random-fingerprint-on-startupstringrandom_fingerprint_on_startup
--chrome-versionnumberchrome_version
--cpu-coresnumbercpu_cores
--ram-gbnumberram_gb
--media-micnumbermedia_mic
--media-cameranumbermedia_camera
--media-speakernumbermedia_speaker
--noise-canvasbooleannoise_canvas
--noise-webgl-imagebooleannoise_webgl_image
--noise-audiobooleannoise_audio
--noise-mediabooleannoise_media
--noise-client-rectsbooleannoise_client_rects
--noise-speechbooleannoise_speech
--location-askbooleanlocation_ask
--merge-cookiebooleanmerge_cookie

Upgrade and backups

Use system backup --help to choose a destination and checkpoint the store. A store backup is not a complete copy of browser directories or your account-side data.

To upgrade, stop the service, unpack the new release alongside the old one, update the shim link, check --version and system doctor, then restart the service. The data root, kernels, identity and credentials are separate from the bundle. There is no automatic cloutctl upgrade command.

For account sync and revocation, also read Computers and sync. For HTTP calls served by this process, read Local API.

Recognise state refusals

Exit 3 includes PROFILE_ALREADY_RUNNING, PROFILE_RUNNING, KERNEL_UNPUBLISHED, KERNEL_UNAVAILABLE, enrolment or revocation refusals, ENTITLEMENT_DENIED, proxy availability refusals and OFFLINE_WINDOW_ELAPSED. Fix the named state before retrying.

CONFIRMATION_REQUIRED means a destructive command needs consent. CONFIRMATION_MISMATCH means the supplied count differs from the command’s measured target count; nothing was changed. Read the count and use the command’s --help before repeating it.

profile export needs both --id and --output even though the current help table does not mark the output flag required. profile fingerprint calls AdsPower’s cloud generator; profile create uses the local corpus. The fingerprint diagnostic therefore needs its vendor session and network access.

CLI profile import writes the supplied row and, when present, its adspower_record directly. An existing ID is upserted without the desktop’s separate replacement acknowledgement; verify the target store and ID first.

profile export omits the launch record. For a profile whose launch depends on that record, the exported row alone is insufficient to move its browser identity to another store. Use the desktop’s JSON or ZIP export for that transfer. CLI import accepts that credential-free embedded record; it does not add a missing one.