Bill per token.
Settle in USDC.
Pactum meters every call your API serves, holds the charge against an on-chain balance, then settles the batch on Arc. What your customer receives at the end is not an invoice PDF — it is a transaction hash they can verify without asking you.
Arc Testnet · chain 5042002
- gpt-4o · prompt128,400 tok0.642000
- gpt-4o · completion31,900 tok0.478500
- embeddings · prompt902,000 tok0.090200
The balance exists before the first call
Your customer deposits USDC into the billing contract. That deposit is their channel balance, and it is the only thing standing between them and a rejected call. No card on file, no credit decision, no invoice you have to chase thirty days later.
- DepositUSDC → PactumBilling
- Balance readuserBalances(address)
- Withdrawableunspent, at any time
Every call is recorded once
One request per billable event. Pactum prices the tokens, checks the total against the channel balance minus everything still pending, and records it. Send the same idempotency_key twice — from a retry, a queue redelivery, a nervous client — and the second one comes back deduplicated, not double-charged.
When the balance will not cover the call, the answer is 402. Your service decides what to do with that; Pactum simply refuses to record a charge that cannot be settled.
X-API-Key: pk_live_…
{
"model": "gpt-4o",
"prompt_tokens": 1280,
"completion_tokens": 320,
"prompt_price_per_token": "0.0000050",
"completion_price_per_token": "0.0000150",
"user_address": "0x…",
"idempotency_key": "req_01H…"
}
→ 200 { "recorded": true,
"deduplicated": false,
"cost": "0.011200" }Settlement leaves a mark
Pending usage settles in batches. Many charges are folded into a single transaction through Multicall3From, which keeps each caller’s identity intact rather than collapsing them into one anonymous transfer. The batch lands, the pending rows become settled rows, and the receipt gains the one field that makes it checkable by someone who does not trust you.
Arc settles in USDC and charges gas in USDC, so the cost of sealing a batch is denominated in the same unit as the batch itself.
Specimen seal.
Real ones link to
testnet.arcscan.app.
- Network
- Arc Testnetchain ID 5042002
- Settlement asset
- USDCERC-20 view, 6 decimals — 0x3600000000000000000000000000000000000000
- Batching
- Multicall3Frommany settlements in one transaction, msg.sender preserved per call
- Explorer
- testnet.arcscan.appevery settlement resolves to a public transaction
- CCTP domain
- 26for bridging USDC in and out of Arc
- Testnet funds
- faucet.circle.comCircle faucet — no mainnet value at stake
A bill your customer can verify without asking you.