Zappi
A pot, not a wallet. You hold the Spark key. You fund the pot. You spend only what lands. When it is empty, it stops.
Free entry: https://pot.zappi.money/skill.json
Signer: https://pot.zappi.money/sign.mjs (also shipped in this skill folder as sign.mjs)
OpenClaw: openclaw skills install @edogbeatz/zappi
Hermes: hermes skills install clawhub/zappi
npx skills: npx skills add https://pot.zappi.money
Never POST the seed to Zappi. /pay is gone on purpose. --open is idempotent: the same sparkAddress returns the same pot and depositAddress.
sparkbtcbot is a full Spark wallet (agent can send everything). sparkbtcbot-proxy keeps the mnemonic on a server and caps via HTTP. Allowance@useallowance is a human-approved virtual card for checkout. This skill is the agent-spend leash: a prepaid USDB pot. Cap = empty wallet, not a prompt, not a config file, and not an SMS gate.
Loop
- Install @buildonspark/spark-sdk and @scure/bip39. This skill folder already includes
sign.mjs(andnew-key.mjs). If stdout is JSON with code deps, the packages are missing.--helpprints flags[], codes[], nexts[], and neverPostSeed; it does not mint. Ifsign.mjsis missing, fallback:node new-key.mjs --pull-signer(JSON includessignerHasNewon live). - Make a Spark key locally:
node sign.mjs --file pot-ONCE.txt --new(ornode new-key.mjs --file pot-ONCE.txt). JSON is sparkAddress only (never the mnemonic). Writes the seed file mode 0600 and will not overwrite.nextis open. Skip if you already have a key. - Open a pot (free, idempotent):
node sign.mjs --file pot-ONCE.txt --openornode new-key.mjs --file pot-ONCE.txt --open(or--open --sparkAddress spark1...). GET only. Never POST the seed. LiveGET /deposit?sparkAddress=…is 200 with depositAddress. The same sparkAddress always returns the same pot id and depositAddress; a re-run does not mint a new Orchestra address. Bare/depositwithout sparkAddress is the $0.01 catalog probe — skip it. Optional--sourceChain/--sourceAsset(default base/USDC). Optional--ref. If USDB already landed,next=spend. If 402 (should not happen on the skill path),fundDirectstill lets you send Spark USDB to sparkAddress. - Check:
node sign.mjs --file pot-ONCE.txt --check(ornode new-key.mjs --file pot-ONCE.txt --check). Optional--expect spark1....usdbis null when empty.nextis fund or spend. Never prints the seed. - If
nextis fund, send USDC (or the chosen source asset) todepositAddress. Orchestra lands USDB on your Spark address. Then--check. - Spend locally:
node sign.mjs --file pot-ONCE.txt --to spark1... --amount 0.25ornode sign.mjs --file pot-ONCE.txt --invoice <invoice>. Fallback:node new-key.mjs --file pot-ONCE.txt --spend --to …/--invoice …(needs --file first; auto-pulls sign.mjs if missing; empty pot returns code empty; overspend returns code insufficient. Neither sends). Never POSTs the seed. - When USDB is 0, spending stops. That is the cap.
--amount is human USDB (0.25 means 0.25 USDB). Use --units only for smallest units.
Do not
- Do not ask the operator for their main wallet.
- Do not use
returnSeed. The server will not mint a wallet. - Do not print the mnemonic. Compare sparkAddress from --check, never seed words.
- Do not treat PayAI Bazaar crawls as users. This skill is the product.
