Account tokens live in a pool. Inference spends only what you allocate to a key.
In /account you can name and rename keys, allocate tokens from the pool to a key, and return them. Top-ups always credit the pool — then you split them across keys as you like.
Pool
- New account: 100 million tokens as a gift at signup — they go to the pool, not to the first key.
- New account key: 0 until you allocate.
- Top up (account): crypto via NOWPayments. Tokens land in the pool after confirmation.
Move tokens
From /account or with a session cookie:
| Action | Endpoint |
|---|---|
| List keys | GET /v1/account/keys |
| Create a key | POST /v1/account/keys (starts at 0) |
| Allocate pool → key | POST /v1/account/allocate { "key_id", "amount" } |
| Return key → pool | POST /v1/account/return { "key_id", "amount" } |
| Revoke a key | DELETE /v1/account/keys/{id} (remainder returns to pool) |
| Usage | GET /v1/account/usage?days=30 |
| Ledger | GET /v1/account/ledger |
| Packages | GET /v1/billing/packages |
| Checkout | POST /v1/billing/checkout { "package_id" } |
curl -X POST https://inference.dahl.global/v1/account/allocate \
-b cookies.txt \
-H "Content-Type: application/json" \
-d '{"key_id":123,"amount":10000000}'Top up
In the account UI, Top up opens crypto checkout (USDT, BTC, and others via NOWPayments). Packages are priced around $0.10 per 1M tokens. Paid tokens are credited to the pool after payment is confirmed — not the key.
Balance on a key
With any API key, GET /tokens/current returns remaining tokens on that key (not the pool).
curl https://inference.dahl.global/tokens/current \
-H "Authorization: Bearer $DAHL_API_KEY"Successful inference deducts input + output from the upstream usage field when present. Chat and the account page refresh the same balances.