CLI for Checkers Sixty60 grocery delivery. Talks directly to the Sixty60 mobile-app API (reverse-engineered from the Android APK) — no browser, no WebDriver, just fast terminal commands.
brew install yashiels/tap/checkers60Or download a pre-built binary from the latest GitHub release (macOS arm64 and Linux x64 are provided).
npm / bun (global):
npm install -g checkers60-cli
# or
bun add -g checkers60-cliBuild from source:
git clone https://github.com/yashiels/checkers60-cli.git
cd checkers60-cli
npm install && npm run build
# binary: dist/cli.js (requires Node ≥ 20 or Bun)# 1. Set your mobile number
export CHECKERS60_MOBILE=+27821234567
# 2. Log in (two-step OTP)
checkers60 login # sends an SMS to your phone
checkers60 otp-verify <ref> <code> # e.g. checkers60 otp-verify 4f1a9c2e 1234
# 3. Search for something
checkers60 search "full cream milk"
# 4. Add it to your cart (by search term or product id)
checkers60 add "full cream milk" 2
# 5. Review your cart
checkers60 cart
checkers60 cart --mode one-day| Command | Description |
|---|---|
login / otp-trigger |
Send a login OTP to your phone (step 1 of 2). |
otp-verify <ref> <code> |
Verify the OTP and save your session (step 2 of 2). |
logout |
Clear saved tokens. |
status |
Show login status, token expiry, and cart summary. |
| Command | Description |
|---|---|
search <query> |
Search the catalog. Supports -p/--page and -l/--limit. |
| Command | Description |
|---|---|
cart |
Show all carts by delivery mode; filter with --mode sixty-min or --mode one-day. |
add <query|id> [qty] |
Add a product by search term or product id. Default qty: 1. |
remove <query|id> |
Remove a product by name or product id. |
clear |
Empty the cart. |
checkers60 cart shows every available cart, including empty carts, grouped by
sixty-min and one-day, with item counts, totals, and a grand total.
Use checkers60 cart --mode one-day --json to inspect only the one-day cart.
--deals resolves bonus-buy deals separately for each displayed cart.
Cart JSON includes carts, whose entries contain mode, serviceOptionId,
cartId, cartVersion, itemCount, total, and items (each with productId,
name, quantity, and price). Prices and totals are in cents; itemCount
counts line items. grandTotal sums the displayed carts. For compatibility,
top-level cartId, cartVersion, itemCount, total, and items describe the
sixty-min cart by default (or the first available cart if absent). With --mode,
they describe the selected cart. With --deals, each cart also includes deals
and dealsError; top-level deal fields describe the same primary cart.
checkers60 status --json includes a carts summary for every mode with
itemCount, total, and nonEmpty. Text status marks each cart as empty or
non-empty. The existing cart summary still describes the primary cart.
| Command | Description |
|---|---|
addresses |
List saved delivery addresses. |
cards |
List saved payment cards. |
orders [--all] |
Show orders. Active orders only by default; pass --all for history. |
profile |
Show your user profile. |
slots |
Show available delivery slots for the current cart. |
| Flag | Description |
|---|---|
--json |
Output structured JSON (supported on every command). |
--no-color |
Disable colored output (also respects the NO_COLOR env var). |
-q, --quiet |
Suppress non-essential output. |
-v, --verbose |
Show extra debug info. |
Exit codes: 0 success · 1 runtime failure · 2 invalid usage.
The CLI is configured through environment variables. Set them in your shell profile or pass them inline.
| Variable | Required | Description |
|---|---|---|
CHECKERS60_MOBILE |
to log in | Your mobile number, e.g. +27821234567 |
CHECKERS60_USER_ID |
for most commands | Your Sixty60 internal user id (saved automatically after otp-verify) |
CHECKERS60_SHOPRITE_UUID |
recommended | Shoprite customer UUID |
CHECKERS60_EMAIL |
recommended | Account email |
CHECKERS60_ADDRESS_ID |
optional | Default delivery address id |
CHECKERS60_STORES |
optional | JSON array of store contexts (defaults to Rondebosch, Cape Town) |
CHECKERS60_DEVICE_ID |
optional | 16-char hex device id (auto-generated otherwise) |
CHECKERS60_OTP_RELAY_URL |
optional | HTTPS endpoint for an SMS-OTP relay (for automation) |
CHECKERS60_OTP_RELAY_TOKEN |
optional | Bearer token for the OTP relay |
CHECKERS60_CREDS_PATH |
optional | Override the credentials file path (default: ~/.openclaw/credentials/checkers60.json) |
After a successful otp-verify, the Sixty60 user id and auth tokens are persisted to the credentials file and refreshed automatically on each run.
checkers60 reverse-engineers the Checkers Sixty60 Android app (za.co.shoprite.sixty60 v2.0.114). All API calls go directly to Sixty60's mobile backend — the same endpoints the app hits.
Auth flow:
otp-trigger→POST /auth/.../otpsends an SMS to your phone and returns a reference token.otp-verify→POST /auth/.../verifyexchanges the reference + SMS code for access/refresh tokens, which are saved locally.- Subsequent commands attach the
Authorization: Bearer <access_token>header. Tokens are refreshed transparently when they expire.
API surface used:
https://auth.sixty60.co.za— authenticationhttps://dc-app-backend-for-frontend.sixty60.co.za/api/v1— cart, search, slotshttps://api.shopritegroup.co.za/dsl/brands/checkers/countries/ZA— product cataloghttps://orders-api.sixty60.co.za— ordershttps://payments.sixty60.co.za— saved cards
JSON everywhere: every command accepts --json and returns newline-friendly structured data, making it easy to pipe into jq or use from AI agents and scripts.
npm install # install dependencies
npm run build # compile TypeScript (tsup → dist/)
npm run lint # type-check (tsc --noEmit)
npm test # run tests (vitest)Releases are fully automated. Go to Actions → Ship, pick patch, minor, or major — the workflow bumps version.env and package.json, compiles standalone binaries with Bun, publishes a GitHub Release, and updates the Homebrew tap automatically.
Not affiliated with Checkers, Sixty60, or the Shoprite Group. This tool talks to private, undocumented APIs reverse-engineered from the Sixty60 Android app. API behaviour may change without notice. Use at your own risk.
MIT — © 2026 Yashiel Sookdeo