Tokens & keys

100 million tokens as a gift at signup. Allocate them from the pool to a key before making requests

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:

ActionEndpoint
List keysGET /v1/account/keys
Create a keyPOST /v1/account/keys (starts at 0)
Allocate pool → keyPOST /v1/account/allocate { "key_id", "amount" }
Return key → poolPOST /v1/account/return { "key_id", "amount" }
Revoke a keyDELETE /v1/account/keys/{id} (remainder returns to pool)
UsageGET /v1/account/usage?days=30
LedgerGET /v1/account/ledger
PackagesGET /v1/billing/packages
CheckoutPOST /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.