Arc mainnetchainblock

The API described here is not yet accepting production traffic. Endpoints, parameters and prices are the Phase 1 design and may still change.

DocumentationQuickstart

Getting started

Quickstart

A working request in about a minute, from whichever client you already have.

Get a key

Open the console, copy your key, and fund the prepaid balance. A few dollars goes a long way — a typical exchange on a mid-sized model costs well under a cent.

shell
export VACUUM_KEY="vac_live_..."

Your first request

curl https://api.vacuumfi.com/v1/chat/completions \  -H "Authorization: Bearer $VACUUM_KEY" \  -H "Content-Type: application/json" \  -d '{    "model": "qwen2.5-32b-instruct",    "messages": [      {"role": "user", "content": "Summarise this receipt in one line."}    ]  }'

What comes back

json
{  "id": "cmpl_8Qd2mK9xR4tPwZ1n",  "object": "chat.completion",  "created": 1789517810,  "model": "qwen2.5-32b-instruct",  "choices": [    {      "index": 0,      "message": { "role": "assistant", "content": "..." },      "finish_reason": "stop"    }  ],  "usage": { "prompt_tokens": 214, "completion_tokens": 96, "total_tokens": 310 },  "vacuum": {    "receipt": "0x9f3c1e7a2b8d40f6",    "node": "vac1q7f4mk2xw9d3hs8p",    "node_class": "Core",    "epoch": 2926,    "cost_usdc": "0.0000461"  }}

Everything outside the vacuum block is the format your client already parses, so an existing integration keeps working untouched. The extra block tells you which node served you, under which epoch, and what it cost.

Migrating an app

In most codebases this is two lines.

diff
const client = new OpenAI({-  baseURL: "https://api.openai.com/v1",-  apiKey: process.env.OPENAI_API_KEY,+  baseURL: "https://api.vacuumfi.com/v1",+  apiKey: process.env.VACUUM_KEY,});

Then change the model name to one in the catalogue. Vacuum serves open-weight models, so there is no drop-in equivalent for a proprietary one — pick by size and benchmark rather than by name.

Set a client-side timeout. Nodes are consumer machines, and a small share of requests fail over to another node mid-flight. The router handles the retry, but your own timeout has to allow for it — 60 seconds is a reasonable floor for a non-streaming call.

Read the receipt

The x-vacuum-receipt response header carries the same ID as the vacuum.receipt field. Pass it to the receipts endpoint to get the signed record, and once the epoch closes, a Merkle proof against the root published on Arc.

shell
curl https://api.vacuumfi.com/v1/receipts/0x9f3c1e7a2b8d40f6 \  -H "Authorization: Bearer $VACUUM_KEY"