Inference you pay for by the token.

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.

Every payment is verified and settled on Arc by the Arclight facilitator, the open x402 facilitator Arcloak runs on.

$curl https://api.arcloak.net/v1/chat/completions

  • llama3.2:3b
  • qwen2.5:7b
  • llama3.1:8b
  • qwen2.5:32b
  • gemini-2.5-flash-image
  • OpenAI-compatible
  • x402 upto
  • USDC on Arc
  • eip155:5042
  • SSE streaming
  • no API keys
90%of every settlement goes to the node operator
$2hard ceiling per request, in USDC
4open text models across three price tiers, plus one image model
0signups, API keys, or prompt logs

One request, four hops, one on-chain receipt.

Your client hits a 402, signs a spending ceiling, and the orchestrator streams the answer from a GPU node. When the stream ends, only the delivered tokens are settled.

Your wallet signs a ceiling, x402 upto carries it, the orchestrator dispatches the request to a GPU node, tokens stream back over SSE, and only the delivered tokens settle in USDC on Arc.request → tokens stream back over SSEsettlement: only delivered tokens, USDC on ArcYour walletsigns a ceilingx402 upto402 → PAYMENT-SIGNATUREOrchestratordispatch · bill · settleGPU nodeollama · 90% share

Pricing

What does an answer of 512 tokens cost?

64 tokens4,096 tokens

Output tokens, assuming a short prompt of 32 tokens. Input is billed at half the output rate; every request settles the exact tokens delivered, rounded up to 0.000001 USDC.

  • smallllama3.2:3b · qwen2.5:7b
    0.000054USDC · 0.10 / M out
  • midllama3.1:8b
    0.000159USDC · 0.30 / M out
  • largeqwen2.5:32b
    0.000528USDC · 1.00 / M out
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
gemini-2.5-flash-imageimage0.5040.00about $0.05 per image

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.

Two tiers

Live

Crowdsourced inference

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. Arcloak also runs one always-on node that forwards to OpenRouter, so a prompt served by it reaches OpenRouter and the inference provider OpenRouter routes it to. The no-logs claim covers the systems Arcloak itself runs. The one image model, gemini-2.5-flash-image, is served by that node, so image prompts reach OpenRouter and Google.

Live

Private inference

Live on one attested node: your prompt is encrypted to a key that exists only inside a hardware-attested enclave, and the model runs in a GPU enclave. Arcloak and the node operator see ciphertext only. Base rate times three. Text models only; there is no private image model.

Earn with your GPU

Run ollama, run the node, get paid per answer.

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
# 1. pull a catalog model
ollama pull llama3.2:3b
# 2. install and start the node
pnpm install
pnpm --filter @arcloak/node start
✓ ready

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].