# Credits

How the price of a separation is calculated, and how credits are bought.

## Price

A separation costs the file's length in minutes times the rate of the requested stems, rounded up to a whole credit, and at least 10 credits. Rates are in credits per minute of audio.

Stems from the same model share its cost: drums alone cost as much as drums, bass, guitar, piano and other together. The rate is the sum of the models a request needs, so adding a stem costs only the models it adds. Rates for the web app's presets:

| Request                 | Per minute | 3:30 song |
| ----------------------- | ---------- | --------- |
| Vocals and instrumental | 10         | 35        |
| Six stems               | 10         | 35        |
| Lead and backing        | 25         | 88        |
| Drum kit                | 15         | 53        |
| Everything              | 30         | 105       |

Example: a 3:30 song as six stems costs 210 s × 10 credits per minute ÷ 60 s = 35 credits.

Rates for single stems:

| Stem                         | Per minute | 3:30 song |
| ---------------------------- | ---------- | --------- |
| `vocals`                     | 10         | 35        |
| `vocals.lead`                | 25         | 88        |
| `vocals.backing`             | 25         | 88        |
| `instrumental`               | 10         | 35        |
| `instrumental.drums`         | 10         | 35        |
| `instrumental.drums.kick`    | 15         | 53        |
| `instrumental.drums.snare`   | 15         | 53        |
| `instrumental.drums.toms`    | 15         | 53        |
| `instrumental.drums.hihat`   | 15         | 53        |
| `instrumental.drums.cymbals` | 15         | 53        |
| `instrumental.bass`          | 10         | 35        |
| `instrumental.guitar`        | 10         | 35        |
| `instrumental.piano`         | 10         | 35        |
| `instrumental.other`         | 10         | 35        |

A separation's `charge` shows its price once it has started. No other costs apply.

## Buying credits

Credits are bought in packs on [Credits](https://disband.io/app/credits) and don't expire:

| Pack | Credits | 3:30 songs as vocals and instrumental |
| ---- | ------- | ------------------------------------- |
| $5   | 2,500   | 71                                    |
| $10  | 7,000   | 200                                   |
| $25  | 20,000  | 571                                   |
| $50  | 48,000  | 1,371                                 |
| $100 | 110,000 | 3,142                                 |

Accounts also get 300 free credits per day for the web app. Requests with an API key use bought credits only.

## Failures

* A separation that fails on our side refunds all credits.
* A file that can't be decoded on the GPU keeps the minimum of 10 credits.
* A request rejected before the separation starts costs nothing.
* Deleting a `queued` separation refunds all credits.
* Deleting a `separating` separation stops it and keeps its charge.

A failed separation's `charge` shows the credits it kept.

## Balance

`GET /usage` Get usage

Response

```json
{
  "balance": {
    "free": 0,
    "bought": 6930
  },
  "limits": {
    "daily": 0,
    "seconds": 3600,
    "bytes": 2000000000,
    "jobs": 3
  }
}
```

Returns the remaining credits in `balance.bought` and `balance.free`, and the limits that apply to the caller. With an API key, `free` and `limits.daily` are 0.

`GET /usage/history` Get usage history

| Parameter | In    | Type | Description                                               |
| --------- | ----- | ---- | --------------------------------------------------------- |
| `source`  | query |      | `web` or an API key's id, for that source's spending only |

Response

```json
{
  "since": "2026-10-14",
  "days": [
    {
      "day": "2026-11-12",
      "separations": 3,
      "spent": {
        "free": 0,
        "bought": 175
      }
    }
  ],
  "additions": [
    {
      "kind": "purchase",
      "created_at": "2026-11-10T09:12:44.000Z",
      "credits": 7000
    }
  ]
}
```

Returns the credits spent per day over the last 30 days, and the credits added.

A separation the balance doesn't cover returns `402` [`out-of-credits`](https://disband.io/docs/errors#out-of-credits) and charges nothing.
