Account and trust
Security and verification.
What you can check yourself, independent of anything we say.
On this page
No custom code
USDF is backed 1:1 by Global Dollar (USDG), issued by Paxos, and that USDG sits in the USDF token contract itself. Inspect the verified contract and its bytecode yourself.
Redemption
Redemption is permissionless and 1:1: USDF supply reduction releases the same amount of USDG. The token contract cannot pause it, charge a fee for it, or cap it.
USDG itself
Global Dollar (USDG), issued by Paxos, retains pause and freeze powers over its own token.
Reserve and custody
Where the backing sits, read from the chain. Every USDF, in a wallet or in a Foundry balance, is backed by USDG held in the USDF token contract. USDF that funds a Foundry balance is held in the gateway's custody wallets until it is spent or withdrawn. Supply, reserve and every settlement are on Transparency.
Daily reserve attestation
A signed snapshot every day, plus the read-only ReserveView contract anyone can call directly.
Usage log
Every request, key-paid or x402, is a leaf in an append-only log. A request's receipt links to its own proof.
Signed catalog
The price sheet every model is served from is signed, with the signer's address published alongside it.
Run the checks yourself
A page that recomputes the reserve, a receipt, and the settlement chain directly from the chain, in your own browser.
Data handling
What's stored per request, what never is, and how a key's no-logs mode changes it.
Every request returns a receipt: what was billed, at which price, and where it settles.
The same receipt appears in five places:
- The JSON body, as
receipt. - A stream's last comment line,
: receipt {…}. - The
x-request-idheader, with the cost inx-cost-unitson a response that is not streamed. A chat or text completion paid per request carriesreceipt.paidinstead. GET /v1/receipts/{id}, with the key that made the request.- The MCP
receipttool.
The receipt on a response
"receipt": {
"request_id": "<request_id>",
"model": "<model>",
"provider": "<provider>",
"status": "ok",
"usage": { "prompt_tokens": …, "completion_tokens": …, "cached_tokens": … },
"price": { "version": "<price sheet>", "input": …, "output": … },
"cost": { "units": "<units>", "usd": "<usd>", "usdf": "<usdf>" },
"balance": { "units": "<units>", "usd": "<usd>", "usdf": "<usdf>" },
"data_policy": { … },
"settlement": {
"status": "unsettled",
"next_batch_after": "<time>",
"lookup": "https://api.usdf.fi/v1/receipts/<request_id>"
}
}Looked up later, the receipt adds when it was made and its log status:
Look up a receipt
curl https://api.usdf.fi/v1/receipts/<request_id> \ -H "Authorization: Bearer $USDF_API_KEY"
Response
{
"request_id": "<request_id>",
"model": "<model>",
"provider": "<provider>",
"status": "ok",
"created_at": "<time>",
"usage": { "prompt_tokens": …, "completion_tokens": …, "cached_tokens": … },
"price_version": "<price sheet>",
"cost": { "units": "<units>", "usd": "<usd>", "usdf": "<usdf>" },
"settlement": { "status": "unsettled", "next_batch_after": "<time>" },
"log": {
"status": "published",
"anchored_by": null,
"proof": "https://api.usdf.fi/v1/log/proof/<request_id>"
}
}Every field:
| Field | Meaning |
|---|---|
request_ | The request's id. Also the response id. |
model | The model, without any routing suffix. |
provider | The route that served it. |
status | ok, partial, or failed_ with a reason: upstream_, upstream_, empty_, gateway_ or gateway_. |
usage | The provider's token counts. |
price, price_ | The sheet version and the rates charged. A lookup names the version. |
cost | What was charged, as { units, usd, usdf }. |
balance | On a response: the balance after the charge. |
data_ | What the serving route does with content, and what was asked. |
settlement | status and next_; once settled, batch, tx_, explorer and rows. |
log | On a lookup: status, anchored_ and the proof URL. |
A partial receipt was cut short and is billed for what was produced. A failed_refunded one costs zero.
Pay-per-request receipts
A request paid per request carries the payment too:
paid: what the request was charged, what it used at the quoted price;usage_cost: the metered cost of its usage;refund: the rest of the payment, sent back in the asset paid.payment:tx,explorer,payer,amount(the quote, paid up front),assetandmethod.settlement.scheme:x402 exact, ormpp evm charge, with thenetwork.- On non-chat endpoints,
modality,endpointandbilled, pluslookup.
The receipt of any request, keyed or paid per request, is public with no key. It publishes nothing the log does not.
Read a public receipt
curl https://api.usdf.fi/x402/v1/receipts/<request_id>
A USDG payment, or a refund, has settlement none: its own payment transaction is the onchain record. A USDF payment undergoes supply reduction in a later settlement batch with the rest of the spend.
Private-tier receipts
A private-tier request is tied to the provider's own signed receipt. Its data_policy.attestation starts pending, then turns verified or failed.
GET /v1/privacy/receipts/{id}, with the same key, returns the provider's archived receipt byte for byte, with its hash. See Private inference.
GET /v1/receipts lists the latest receipts, newest first, with limit, before, model and status.
A key lists its own requests. A session lists the account's. Naming another key gets 403 key_scope.
List and read receipts
curl "https://api.usdf.fi/v1/receipts?limit=20" \ -H "Authorization: Bearer $USDF_API_KEY" curl https://api.usdf.fi/v1/receipts/<request_id> \ -H "Authorization: Bearer $USDF_API_KEY"
Response, trimmed
{
"data": [
{
"request_id": "<request_id>",
"created_at": "<time>",
"model": "<model>",
"cost": { … },
"status": "ok",
"settlement": { "status": "unsettled", … },
"receipt": "https://api.usdf.fi/v1/receipts/<request_id>"
}
],
"page": { "next_before": "<before>" }
}Spend settles onchain in batches. A receipt's settlement.status moves through these states:
| Status | Meaning |
|---|---|
unsettled | Charged in the ledger. The spent USDF is still in the gateway's custody. |
pending | In a batch that has opened. |
sent | The batch's transaction is broadcast. |
confirmed | Mined. USDF supply reduction completed and the same USDG paid out. |
A batch runs hourly, or sooner once 50 USDF unsettled has built up. Its transaction applies supply reduction to the batch's spent USDF, releases the same USDG to the revenue wallet, and carries the batch digest and a log checkpoint in its calldata.
A settled receipt, settlement only
"settlement": {
"batch": "<batch>",
"status": "confirmed",
"tx_hash": "<transaction hash>",
"explorer": "…",
"rows": "https://api.usdf.fi/v1/settlements/<batch>"
}GET /v1/settlements lists batches. GET /v1/settlements/{batch} lists every row in one, with recomputed_digest and digest_matches, so anyone can check that the digest onchain commits to exactly those requests. Every settlement is on Transparency. For now both leave out each batch's amounts and rows; the transaction and the digest stay.
Every request, keyed or paid per request, is a leaf in an RFC 6962 Merkle log. Its roots are anchored onchain by the settlement transactions.
| Endpoint | Returns |
|---|---|
GET / | The roots anchored onchain. Not served yet: it answers 404. |
GET / | A request's leaf and its inclusion proof. |
GET / | A consistency proof between two tree sizes, from and to. Not served yet: it answers 404. |
GET / | The tree's current frontier. Not served yet: it answers 404. |
GET / | The leaves themselves. Not served yet: it answers 404. |
Check a request in the log
curl https://api.usdf.fi/v1/log/proof/<request_id>
The log publishes figures, never content. See Privacy and data handling.
Three more public reads let anyone check the money:
| Endpoint | Returns |
|---|---|
GET / | Every charge recomputed from public inputs: the usage and the archived price sheet. Not served yet: it answers 404. |
GET / | Every USDF and USDG movement the gateway claims, with its transaction. Not served yet: it answers 404. |
GET / | The backing ratio and the contract addresses, read from the chain. The supply, reserve and custody figures are left out for now. |
Verify runs these checks in your browser against the chain, and Transparency shows the reserve live.
API keys
A key is shown once and stored only as its hash. The gateway cannot show you a key you already created again, and cannot recover one that is lost.
No-logs mode
Foundry keeps no prompt or output by default: every key is in no-logs mode until you turn its request logs on. For a key in no-logs mode, and every Private-tier key, prompt text, completion text and tool arguments are never written anywhere: not the database, not a log line, not an error path. A key with request logs on (retain) keeps its requests in the account's request logs for 30 days. Token counts, cost, model and status are always recorded, because that is what makes a charge checkable against the usage log.
Full detail
What's stored, what's never stored, and how long each is kept.
Attested hardware only
Private requests run in attested Intel TDX enclaves at the same price, with end-to-end encryption, signed receipts and an onchain build registry. Before a route serves, Foundry verifies its TDX quote, its build and its keys itself. On attested instances Foundry also checks the GPUs' confidential computing evidence; behind an attested gateway, the provider attests its GPUs. A model with a zero-retention route uses it by default. A request can ask to run only on attested hardware, with the model suffix :private or a Private-tier key. It is served only by an attested-hardware provider, and refused rather than quietly served elsewhere when none can take it.
Third-party audit
The USDF token is stock OpenZeppelin code with an exact Sourcify match, so you can inspect it yourself. The gateway and this deployment have not had a third-party audit.
- Global Dollar (USDG), issued by Paxos, retains pause and freeze powers over its own token.
- Account balances are custodial: USDF that funds an API balance is held in the gateway's wallets until it is spent or withdrawn.
- The token contract is a stock OpenZeppelin wrapper you can verify yourself. The gateway and this deployment have not had a third-party audit.
- Holder earnings depend on network revenue.
Report first
Found a problem in the token contract, the gateway, or this site? Report it before writing about it publicly. Test against your own funds and your own account only.