# Buy credits

> Add prepaid credits with a card through Stripe Checkout from the console, the CLI or the API, and add the $20 Indra plan.

Source: https://nodus-platform-site.pages.dev/docs/guides/billing/buy-credits/
Build revision: 211ad9f836655b1c3a2668c4693e442471f28614

Nodus is prepaid. You buy credits, and paid work draws on them through a funded hold placed before it starts. You pay on a Stripe-hosted page, so Nodus never sees your card number. Every purchase is a `TopUp` object that you can list and follow until the credit is on your balance.

## Buy from the console

Open **Usage & billing**, choose **Add credits**, and pick $10, $20, $50, $100 or a custom amount. The console sends you to Stripe Checkout and brings you back to the billing page, which shows the top-up until it is paid.

## Buy from the CLI

Terminal window

```bash
nodus billing top-up 20
```

The CLI opens the payment page in your browser, waits until the payment is credited and prints your new balance.

|Flag|Does|
|-|-|
|`--save-card`|Saves the card for [auto-recharge](https://nodus-platform-site.pages.dev/docs/guides/billing/auto-recharge/)|
|`--no-open`|Prints the payment link instead of opening a browser, for a remote shell|
|`--no-wait`|Returns as soon as the payment link exists|

## Buy through the API

A top-up is an ordinary resource. Create it, then open its `status.checkoutURL`, which appears within about a second:

```yaml
apiVersion: nodus.dev/v1
kind: TopUp
metadata:
  name: october-credits
spec:
  amountUSD: "50.00"
  savePaymentMethod: false   # true also saves the card for auto-recharge
```

Terminal window

```bash
nodus apply -f topup.yaml
nodus get topup october-credits -o yaml
```

The REST path is `/apis/nodus.dev/v1/topups`. By default Checkout returns to the console billing page; set `spec.successURL` and `spec.cancelURL` to return somewhere else on the console, or to an `http://127.0.0.1` address for a local tool. A top-up cannot be edited or deleted; an unpaid one expires by itself.

## Limits

|Limit|Value|
|-|-|
|Amount of one top-up|$5.00 to $1,000.00, in whole cents|
|Top-ups per org per day|$5,000 in total, per UTC day|
|Payment page|Payable for 1 hour after it is created|

An amount outside the range is refused with `422 Invalid` before anything is charged.

## Follow a top-up

Terminal window

```bash
nodus get topups -o wide
```

|Phase|Reason|Meaning|
|-|-|-|
|`Queued`||Nodus is creating the payment page|
|`Running`||The payment page is open and waiting for you|
|`Running`|`PaymentPending`|You paid with a method that confirms later, such as a bank debit|
|`Succeeded`||Paid and credited; `status.creditedUSD` is on your balance and `status.receiptURL` links the receipt|
|`Failed`|`Expired`|Nobody paid within the hour; nothing was charged|
|`Failed`|`PaymentFailed`|The payment did not complete; nothing was credited|

A declined card does not fail the top-up: the payment page stays open so you can try another card. When a payment fails after you submit it, such as a bank debit that does not clear, Nodus emails your billing email.

## When the credit arrives

Nodus credits each payment once, as soon as Stripe confirms it, which usually takes a few seconds. If a confirmation from Stripe is delayed or lost, Nodus asks Stripe about the payment itself within the hour and again in a nightly check, so a paid top-up is always credited, and never twice.

If your org owes arrears, the top-up pays them first and the rest goes to your balance. Work that stopped because money ran out resumes by itself; see [When money runs out](https://nodus-platform-site.pages.dev/docs/guides/billing/when-money-runs-out/).

Stripe emails a receipt for every paid top-up to your billing email. See [Receipts and invoices](https://nodus-platform-site.pages.dev/docs/guides/billing/receipts/).

## The Indra plan

The Indra plan costs $20 a month. Each paid month adds a $20 credit that only Indra (`nodus/indra`) requests can spend, at list price. Indra requests use that credit before your other credits, and everything else draws on your regular balance. Unused plan credit expires when the month it belongs to ends; it does not carry over.

Start the plan by opening an Indra plan checkout session (type `ComposerSubscription`) and paying on the page it returns:

Terminal window

```bash
curl -X POST "https://api.nodus-compute.ai/apis/nodus.dev/v1/billingaccounts/default/sessions" \
  -H "Authorization: Bearer $NODUS_TOKEN" -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type": "ComposerSubscription"}'
```

The response is `{url, expirationTime}`. An org can have one Indra plan; a second request while the plan is active is refused with `409 Conflict`.

* **Renewal.** Stripe charges the card each month and emails the invoice. A new month’s credit is added only once its invoice is paid; while a renewal payment is failing, Stripe retries it and Indra requests draw on your regular credits.
* **Cancel.** Open the billing portal with `nodus billing portal` and cancel the plan there. It ends at the end of the paid month: that month’s credit stays usable until then, and nothing further is charged or added.
