Guides

Accounts & billing

The account API is at https://tessera.storage/api/v1. It is a different surface from the storage API at index.tessera.storage. Storage requests are signed (see Authentication). Account requests use an agent API key.

Accounts are prepaid USD. Usage is metered: storage per 40 MiB block per day, a small upload fee per block, and downloads per block. There is no plan to choose. tessera signup creates the account.

Technical validation

Every new account starts at $0.00 with one upload of up to 40 MiB and one download. Tessera covers the hosts for that single validation. The balance stays $0.00. After that upload and download, top up to continue.

Agent accounts

curl -X POST https://tessera.storage/api/v1/agents \
  -H 'content-type: application/json' \
  -d '{"name":"build-box","contact_email":"[email protected]"}'
{ "account_id": "…", "api_key": "tsk_…_…" }

Keys are tsk_<prefix>_<secret>, returned once, stored only as an HMAC digest. Send one as an Authorization bearer header (tsk_…) on every account request.

EndpointPurpose
POST /agentsCreate an account and its first key. Needs X-Altcha.
GET /auth/altcha-challengeA single-use proof-of-work challenge.
GET /agents/meAccount summary for the bearer key.
POST /agents/me/keysMint another key. Shown once.
DELETE /agents/me/keys/{id}Revoke one key.

Signup is capped at 3 new accounts per source IP per 24 hours (IPv6: per /64) and 20 per /24 (IPv6: per /48). Over the cap: 429 signup_limit. Existing accounts signing in are not counted.

Browser signup is not available on the site. The magic-link endpoints exist; they are not a public path today.

Account summary

GET /account returns the summary for a bearer caller:

{
  "billing_id": "…",
  "kind": "agent",
  "status": "active",
  "balance_usd": "12.50",
  "open_slabs": 42,
  "egress_used_bytes": 21000000000,
  "days_left": 23,
  "topup_open": true,
  "topup_rails": { "nowpayments": true, "x402": true },
  "warnings": []
}
FieldMeaning
statuspending, active, past_due, suspended, or terminated.
balance_usdPrepaid balance in USD, as a string.
open_slabsSlabs currently open.
egress_used_bytesDownload bytes. On a technical-validation download this is the actual size; after top-up it is billed blocks × 40 MiB.
days_leftAfter top-up: an estimate from balance and burn, not a promise. null at $0.00.
topup_open / topup_railsWhether top-up is open, and which rail. Check the rail you intend to use.
warningsRecent threshold warnings, newest first. Agents poll this; there is no mailbox.

The response may also carry plan, period_end, and included_storage_bytes. Ignore them. The live model is metered prepaid balance, not a plan.

Rates

Live rates: GET /api/v1/billing/rates or tessera rates.

Storage is metered on logical volume, in 40 MiB blocks. Network redundancy is Tessera's cost, already in the rate. Uploads are metered by what you write; downloads by what you read.

Top-ups

Three rails. Check topup_rails first. A closed rail returns 503 topup_closed.

  • x402 (USDC on Base). Minimum $0.01. tessera topup 0.50 --wallet.
  • Deposit address. Any enabled coin. USDC on Base is the default. Processor minimums apply (about $0.38 for USDC on Base; other coins higher).
  • Hosted invoice. "mode": "invoice" lets the payer choose the coin.

Tessera's floor is $0.01 on every rail. Live minimums: GET /billing/topup/minimums or tessera topup --minimums. Under the processor minimum: 409 below_asset_minimum.

POST /billing/topup with {"amount_usd": 25} returns a payment intent: pay_address, pay_amount, pay_currency. Send the exact amount. The address quote expires in about 20 minutes. Partial and overpayments are credited.

x402: a 402 carries the challenge. Sign an EIP-3009 TransferWithAuthorization and retry with PAYMENT-SIGNATURE. Settled payments return 200 and the new balance_usd. A refused authorization returns a fresh 402; a retry with a new authorization is not double-charged.

Suspension and deletion

If the balance cannot cover usage, the account moves to past_due and keeps serving through a grace window, rather than stopping immediately. Stored data stays retrievable during that window.

Warnings fire at the threshold days-left values and at zero, on the warnings array.

Unpaid past grace, the account is suspended. Funding stops. Contracts already funded are not renewed. When those contracts end, the storage credential is revoked, objects are removed, and slabs are queued for pruning. Deletion is not reversible. Export first. Billing records are retained as required.

Recovery phrase

tessera signup prints a recovery phrase and an API key once. Keep both. On a new machine, tessera login "<12 words>" restores the same account. Tessera cannot recover a lost phrase.

Deleting your account

POST /account/delete with {"confirm_account_id":"<your id>"}. The CLI asks you to type the account ID; agents pass --yes.

Deletion revokes every key and session, deletes stored files, and stops billing. It cannot be undone. No balance is refunded; the response reports balance_forfeited_usd. A closed account cannot sign in or be restored from its phrase.