Pay per request
You can call the API with no account and no key: pay for each request in bitcoin over Lightning. This uses x402, an open standard for paying for HTTP requests.
Beta.
Paying per request is off on this API right now; use an API key.
How it works
- Send the request with no
Authorizationheader. - The answer is
402 Payment Required. Its body says the price, and itsPAYMENT-REQUIREDheader holds a Lightning invoice for exactly that request. - Pay the invoice with any Lightning wallet. The wallet gives you a proof of payment (the preimage).
- Send the same request again, byte for byte, with the proof in a
PAYMENT-SIGNATUREheader. You get the answer, with aPAYMENT-RESPONSEheader saying the payment was accepted.
curl -i https://api.openagents.com/v1/responses \
-H "Content-Type: application/json" \
-d '{"model": "google/gemini-3.8-flash", "input": "Say hello.", "max_output_tokens": 200}'
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6Mi...
{"error": {"type": "payment_required", "message": "This request costs up to 3 sats ($0.0021). ..."},
"price_sats": 3, "price_usd": "0.0021", "x402Version": 2}
The PAYMENT-REQUIRED header is base64 JSON. Its accepts[0] is the
payment terms; accepts[0].extra.invoice is the invoice. To send the
proof, base64-encode
{"x402Version": 2, "accepted": <accepts[0]>, "payload": {"preimage": "<hex>"}}
as the PAYMENT-SIGNATURE header.
With the Payment scheme (MPP)
When the API takes it, the same 402 also carries a
WWW-Authenticate: Payment challenge (method lightning, intent
charge) for the same invoice. Clients that speak the Payment
scheme, such as lnget and mppx, pay it and send the same request again
with Authorization: Payment <credential>: the challenge echoed back and
payload.preimage, as base64url JSON. The answer carries a
Payment-Receipt header.
One invoice pays once. After it pays one request, the same preimage is refused whichever header carries it.
From the command line
The openagents command pays from your OpenAgents wallet and does all
four steps:
openagents inference google/gemini-3.8-flash "Say hello." --pay x402 --max-msat 10000
--max-msat is the most you will pay, in millisatoshis (10000 is 10
sats). It refuses an invoice above it.
What you pay
- The most the request could cost. We price the request before it
runs: the model's price from the rate card, plus our
margin, for the most input your request can hold and the most output it
allows. Set
max_output_tokensto lower the price. - Whole sats, rounded up, at the bitcoin price the rate card shows.
- No refund of the unused part. The answer's actual cost is in its
x-openagents-cost-usdheader, but the payment covers the request as quoted. To pay only what each answer costs, use a key with credit instead. - No answer, no charge. If every provider fails before answering, or
no provider can take the request, send the same request with the same
PAYMENT-SIGNATUREagain: the payment still counts. - One payment, one answer. A proof is used once, and only for the request it was issued for. A different body needs a new invoice.
What needs a key
A paid request covers one model turn and keeps nothing. Stored responses
(store, previous_response_id), hosted tools such as web search, and
the WebSocket need an API key.
The API's description
Every route is described in OpenAPI 3.1 at
https://api.openagents.com/v1/openapi.json.