Arcloak

Open-model inference, paid per token in USDC on Arc

No signup, no keys, no logs. Send an OpenAI-style request, sign one x402 upto authorization with your wallet, and pay only for the tokens you get.

Checking the network…

Two tiers

Crowdsourced inference

Live

Open models served by anyone with a GPU and ollama. No signup, no keys, no logs, pay per token. Node operators see prompts in plaintext, so do not send secrets.

Private inference

Coming soon

The same API on hardware-attested GPU enclaves: the operator cannot read your prompts. Priced at the base rate times a private-tier multiplier.

Pricing

Prices in USDC per million tokens
ModelTierInputOutput
llama3.2:3bsmall0.050.10
qwen2.5:7bsmall0.050.10
llama3.1:8bmid0.150.30
qwen2.5:32blarge0.501.00

Each request authorises at most 2 USDC and settles only the tokens delivered, rounded up to the nearest 0.000001 USDC. Nodes receive 90% of every settled amount.

Earn with your GPU

Run ollama and the Arcloak node. Every answer your node streams credits the node address in USDC on Arc, and you withdraw from the dashboard.

Run a node

Try it from code

curl: an unpaid request answers 402 with the payment terms
curl -i https://api.arcloak.net/v1/chat/completions \
  -H 'content-type: application/json' \
  -d '{"model":"llama3.2:3b","messages":[{"role":"user","content":"Say hello from Arc."}],"max_tokens":64,"stream":true}'
TypeScript (Node 24): pay and stream with @x402/fetch
import { wrapFetchWithPayment, x402Client } from '@x402/fetch'
import { UptoEvmScheme } from '@x402/evm/upto/client'
import { privateKeyToAccount } from 'viem/accounts'

const signer = privateKeyToAccount(process.env.PAYER_PRIVATE_KEY as `0x${string}`)
const client = new x402Client()
  .register('eip155:5042', new UptoEvmScheme(signer))
  .setSpendControls({ allowedAssets: [{ network: 'eip155:5042', asset: '0x3600000000000000000000000000000000000000', maxAmountPerPayment: '2000000' }] })
const paidFetch = wrapFetchWithPayment(fetch, client)

const res = await paidFetch('https://api.arcloak.net/v1/chat/completions', {
  method: 'POST',
  headers: { 'content-type': 'application/json' },
  body: JSON.stringify({"model":"llama3.2:3b","messages":[{"role":"user","content":"Say hello from Arc."}],"max_tokens":64,"stream":true}),
})
// res.body is text/event-stream: answer chunks, a usage chunk, then
// {"object":"x402.payment","transaction":"0x…","amount":"…","network":"eip155:5042"} and [DONE].