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.

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.

Verify a receipt

Signed catalog

The price sheet every model is served from is signed, with the signer's address published alongside it.

Models and prices

Run the checks yourself

A page that recomputes the reserve, a receipt, and the settlement chain directly from the chain, in your own browser.

Verify

Data handling

What's stored per request, what never is, and how a key's no-logs mode changes it.

Data handling

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-id header, with the cost in x-cost-units on a response that is not streamed. A chat or text completion paid per request carries receipt.paid instead.
  • GET /v1/receipts/{id}, with the key that made the request.
  • The MCP receipt tool.

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
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:

FieldMeaning
request_idThe request's id. Also the response id.
modelThe model, without any routing suffix.
providerThe route that served it.
statusok, partial, or failed_refunded with a reason: upstream_error, upstream_timeout, empty_output, gateway_shutdown or gateway_error.
usageThe provider's token counts.
price, price_versionThe sheet version and the rates charged. A lookup names the version.
costWhat was charged, as { units, usd, usdf }.
balanceOn a response: the balance after the charge.
data_policyWhat the serving route does with content, and what was asked.
settlementstatus and next_batch_after; once settled, batch, tx_hash, explorer and rows.
logOn a lookup: status, anchored_by 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), asset and method.
  • settlement.scheme: x402 exact, or mpp evm charge, with the network.
  • On non-chat endpoints, modality, endpoint and billed, plus lookup.

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
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:

StatusMeaning
unsettledCharged in the ledger. The spent USDF is still in the gateway's custody.
pendingIn a batch that has opened.
sentThe batch's transaction is broadcast.
confirmedMined. 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.

EndpointReturns
GET /v1/log/checkpointsThe roots anchored onchain. Not served yet: it answers 404.
GET /v1/log/proof/{id}A request's leaf and its inclusion proof.
GET /v1/log/consistencyA consistency proof between two tree sizes, from and to. Not served yet: it answers 404.
GET /v1/log/frontierThe tree's current frontier. Not served yet: it answers 404.
GET /v1/log/leavesThe leaves themselves. Not served yet: it answers 404.

Check a request in the log

curl
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:

EndpointReturns
GET /v1/audit/costsEvery charge recomputed from public inputs: the usage and the archived price sheet. Not served yet: it answers 404.
GET /v1/flowsEvery USDF and USDG movement the gateway claims, with its transaction. Not served yet: it answers 404.
GET /v1/reserveThe 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.

Data handling and retention

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.

Current status

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.

protocol@usdf.fi

Foundry documentation