Skip to main content
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

Auth is a Solana wallet signature. The CLI uses ~/.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

You get two files: 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:
The bundling happens on your machine, with esbuild, and we ship the result. We deliberately never run 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
Keep limits tight. The ceiling we hold before each run is derived from timeout_ms, so a 5-second processor reserves a fraction of what a 600-second one does. Declaring honestly is directly cheaper.

4. Deploy

The invoke token is shown once. It is your server-side credential, the one you put behind your own product if you resell. Rotate it with singularity processors rotate.

5. Run it

Runs typically complete in under 200ms plus your own work. Anything slower than the sync window returns 202 with a poll_url and a run token; send Prefer: respond-async to get that immediately.

6. See what happened

Your failure rate is public. It appears on your listing, because buyers pay for runs that fail after starting. Platform faults are ours and are excluded, so a bad day on our side never counts against you.

Your own console output

Whatever your code printed is captured per run, which is how you actually debug one:
Every 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

Now it is in the catalogue, callable by anyone, and exposed as an MCP tool.
Your Solana payout wallet must be able to receive USDC. If it has never held any, publishing is refused with instructions, send any amount of USDC to it once, then publish again. This is a Solana rule: you cannot transfer a token to an account that does not exist yet. It does not apply to Base or Robinhood.
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:
Pay it and retry with an 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 the processors:write scope (or processors:read for read-only) and send it as X-API-Key:
The same key then works on PATCH, DELETE, /secrets, /rotate-token, /pause, /listing, /webhook, /runs, /earnings and /kv.
processors:write is full control of that wallet’s processors, delete and secrets included, the same as a Cloudflare API token. If you want a credential that cannot change anything, mint processors:read.Three things to know before you rely on it:
  • Compute API keys do not expire. A leaked key works until you revoke it.
  • There is no audit log of what a key did.
  • Delete is permanent. Unlike redeploying a Worker under the same name, the code is wiped and the slug is burned forever. A leaked key can destroy a name you can never reclaim.
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.