These are real commands with real responses. You can run them now. The dashboard UI is still being finished, so everything here is the CLI.
Install
~/.config/solana/id.json by default, or pass --keypair. Your key never leaves your machine.
No keypair? Use a compute API key instead. Everything below can also be done over plain HTTP
with an
x402c_… key, which is how an agent manages processors without holding a wallet. See
Managing with an API key at the end of this page.1. Scaffold
processor.json (the manifest) and processor.js (your code).
2. Write the function
processor.js
TypeScript and npm packages
If you want imports, types, or a package from npm, add--bundle:
npm install for you: a postinstall script is arbitrary code, and executing it on infrastructure
that holds platform credentials is not something scanning makes safe. Your bundle crosses the boundary;
your node_modules never does.
Because the target is an isolate, a dependency reaching for fs, child_process or raw sockets fails
here, on your terminal, naming the file that imported it, rather than inside a run a buyer already
paid for.
3. Declare what it needs
processor.json
4. Deploy
singularity processors rotate.
5. Run it
202 with a poll_url and a run token; send Prefer: respond-async to get that immediately.
6. See what happened
Your own console output
Whatever your code printed is captured per run, which is how you actually debug one:console.log / warn / error / info / debug call is captured, capped, stripped of terminal
escape sequences, and deleted with the run after 30 days. Anything you printed is here, including
anything a caller sent you, if you printed it.
It is best-effort observability, not an audit trail: it records what your code asked console to print,
so code that writes output another way is not captured.
singularity processors logs --follow tails new runs as they happen.
7. Go live
By default buyers pay you in USDC on Solana, at the wallet you deployed with. To also accept USDC on
Base or USDG on Robinhood Chain, add a
payout block, see
which chains buyers can pay on. One
price_usd covers every chain.Calling a published processor
Without payment, you get the price:X-Payment header. Any x402 client does this automatically. The money goes
straight to the publisher.
accepts carries one entry per chain that publisher accepts, so a processor with a payout block
returns several. Pick the one whose network you can sign for, solana, base, or robinhood. And
pay that entry. maxAmountRequired is the same integer on all of them, because every asset is a
6-decimal stablecoin.
Calling your own, from your own product
Use the invoke token. No payment, because you are paying for the compute yourself:Common rejections
Managing with an API key
An agent with no Solana keypair can still deploy and manage processors. Mint a key in the dashboard with theprocessors:write scope (or processors:read for read-only) and send it as
X-API-Key:
PATCH, DELETE, /secrets, /rotate-token, /pause, /listing,
/webhook, /runs, /earnings and /kv.
Two routes never accept a key, and neither is a publisher action:
Running is separate.
POST …/run does not treat a key as an ownership claim. It is the one
route with both a money path and an anonymous buyer lane. Use the invoke token from deploy.
Deploying needs a Solana-backed key. owner_wallet becomes the x402 payTo and the
runtime-billing account, so a key minted on an EVM wallet gets 400 solana_wallet_required when
creating a processor. It can still manage processors its wallet already owns.