# Coritan Docs
# Billing
> How Coritan bills you, from your credit balance and invoices to payment methods, and where each lives on the Billing page.
Source: https://www.coritan.com/docs/billing/
In the dashboard:
- /dashboard/billing: https://www.coritan.com/dashboard/billing
Coritan bills each service on the billing cycle you chose when you ordered it: by the hour, week, month, quarter or year. You pay from your *credit balance*, with a saved card or PayPal account, or with cryptocurrency. This section explains how charges are worked out and paid, and how to change or cancel what you pay for.
## How you are billed
Orders
: An order raises one first invoice for everything in it: one billing cycle of the service, the first period of each add-on bought with it and any setup fees. Coritan takes what it can from your credit, and sets everything in the order up once the invoice is paid ([Order a service](/docs/get-started/order-a-service/)).
Renewals
: Coritan raises each renewal invoice up to 3 days before the service's renewal date, by default. It takes the invoice from your credit first and charges your default payment method for the rest.
Hourly services
: After its first invoice, an hourly service has no invoices. Coritan takes its price from your credit every hour, up to a monthly cap ([How hourly billing works](/docs/billing/hourly-billing/)).
Missed payments
: Coritan retries a failed charge on a schedule. A service whose invoice stays unpaid is suspended a day after the due date, by default, and deleted later ([Failed payments and suspended services](/docs/billing/failed-payments/)).
Your credit is held in US dollars and never expires. Invoices are in US dollars too. The currency your bank charges depends on how you pay ([Currencies and countries](/docs/billing/currencies-and-regions/)).
## The Billing page
In the sidebar of the [dashboard](https://www.coritan.com/dashboard/billing), select **Billing**. The page has four tabs.
**Overview**
: Three cards across the top: **Account credit** (your balance, and whether automatic top-up is on), **Due now** (the total of your unpaid invoices) and **You pay with** (your default payment method). Under them are the **Add credit** card, **Waiting for payment** with your unpaid invoices, and **Recent activity** with your latest payments. The balance is in US dollars, even when your account's currency is another one and the card shows that currency's symbol.
**Invoices**
: Every invoice, with its status, and the **Pay** button for the unpaid ones ([Pay an invoice](/docs/billing/invoices/)).
**Transactions**
: Every payment, refund and credit movement ([Transactions and payment attempts](/docs/billing/transactions/)).
**Payment methods**
: Your saved cards and PayPal accounts, auto-pay and automatic top-up ([Manage payment methods](/docs/billing/payment-methods/)).
## Pay and add money
- [Pay an invoice](/docs/billing/invoices/): pay what is due with credit, a saved method, a card, PayPal or another provider.
- [Add credit to your balance](/docs/billing/add-credit/): top up by card, PayPal or a checkout page.
- [Turn on automatic top-up](/docs/billing/automatic-top-up/): charge your default method when your balance runs low.
- [Pay with cryptocurrency](/docs/billing/crypto-payments/): send cryptocurrency to add credit.
- [Manage payment methods](/docs/billing/payment-methods/): save, remove and choose the default card or PayPal account.
- [Currencies and countries](/docs/billing/currencies-and-regions/): which currency you are charged in, and why.
## Change what you pay for
- [Change a service's plan](/docs/billing/change-plan/): move a service to another billing cycle of the same product.
- [Cancel a service](/docs/billing/cancel-a-service/): end a service at the end of its term or at once.
- [How hourly billing works](/docs/billing/hourly-billing/): hourly prices, the monthly cap and the $10.00 deposit that unlocks them.
## Records and problems
- [Transactions and payment attempts](/docs/billing/transactions/): what you paid, when and how.
- [Failed payments and suspended services](/docs/billing/failed-payments/): why a payment failed, and how to restore a suspended service.
## Prepaid and postpaid accounts
Your account's *billing mode* is shown as **Billing mode** on your profile ([Update your profile](/docs/account/profile/)).
`prepaid`
: The mode every new account starts in. You pay a service's first invoice before Coritan sets it up. Hourly billing and automatic top-up are for prepaid accounts only.
`postpaid`
: A service on a monthly or longer billing cycle is set up without a first payment, and you pay an invoice at the end of each billing cycle. Hourly, daily and weekly plans still need their first payment before setup. Only Coritan staff can move an account to postpaid, so [contact support](/docs/support/conversations/) to ask.
## Limits
| What | Limit |
| --- | --- |
| One top-up | $1.00 to $10,000.00 |
| Credit that unlocks hourly billing | $10.00 added in total, by default |
| Monthly cap of an hourly service | 672 hours of its hourly price, by default |
| Renewal invoices | Raised up to 3 days before the renewal date, by default |
| Suspension of an unpaid service | 1 day after the invoice's due date, by default |
## With the API
[`GET /billing/credit`](/docs/api/reference/client/billing/#op-get-api-v1-billing-credit) returns your credit balance and your last 20 credit movements, newest first:
```bash
curl https://api.coritan.com/api/v1/billing/credit \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"balance": 37.01,
"currency": "USD",
"recent_transactions": [
{
"id": 9031,
"amount": -0.0087,
"balance_after": 37.01,
"description": "Hourly charge for service #311",
"created_at": "2026-09-25T09:00:02"
},
{
"id": 9024,
"amount": 25.0,
"balance_after": 37.0187,
"description": "Credit top-up $25.00 USD",
"created_at": "2026-09-24T16:41:10"
}
]
}
```
`balance` is in US dollars. `currency` is your account's currency, which is not the currency of `balance`: an account set to euros sees `EUR` beside a dollar amount. Each entry in `recent_transactions` is one change to your balance: `amount` is positive for credit added and negative for credit spent, and `balance_after` is the balance it left. The list holds movements that the **Transactions** tab does not show, such as hourly charges and the credit from a downgrade.
The [Client API reference](/docs/api/reference/client/billing/) lists every billing operation. [Make your first API request](/docs/get-started/first-steps-with-the-api/) explains how to get `$CORITAN_TOKEN`.
## API
- `GET /api/v1/billing/credit`: Get credit (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-credit)
# Add credit to your balance
> Top up your credit balance with a card or another payment method, and see how Coritan spends that credit.
Source: https://www.coritan.com/docs/billing/add-credit/
Credit is money you pay in ahead of time. Coritan holds it in US dollars, it never expires, and Coritan spends it before it charges a payment method. Add credit to pay for hourly services, to cover renewals, or to pay an invoice without a card.
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Decide how much to add. One top-up is between $1.00 and $10,000.00.
- Have a way to pay: a saved method, a card, a PayPal account or cryptocurrency.
## Add credit
1. In the sidebar, select **Billing**. The **Add credit** card is on the **Overview** tab. The **Add credit** button on the dashboard's home page opens the same card.
2. Under **Amount**, choose `$10`, `$25`, `$50`, `$100` or `$250`. To enter another amount, choose **Other** and type it in US dollars.
3. Under **Pay with**, choose how to pay:
- A saved card or PayPal account. Coritan charges it straight away.
- **Card** (or **New card**) to enter a card.
- **PayPal** to pay with a PayPal account. PayPal's buttons appear in the card.
- **Crypto** to send cryptocurrency. [Pay with cryptocurrency](/docs/billing/crypto-payments/) walks through it.
- Any other provider, which opens its own checkout page.
4. Select the button at the bottom of the card:
- `Add $25.00` (with your amount) for a saved method or a new card.
- `Continue to` and the provider's name for a checkout page. Pay there, and the provider brings you back to **Billing**.
- For PayPal, select PayPal's button and approve the payment in the window that opens. You stay on the page.
5. For a new card, enter it in the **Pay by card** dialog and select **Pay now**. If your bank asks you to confirm a saved card, the dialog is called **Confirm with your bank**.
## Result
A message confirms the top-up, for example `$25.00 added to your balance.` Coritan emails you a receipt. The new balance shows on the **Overview** tab and in the sidebar, and the top-up appears on the **Transactions** tab ([Transactions and payment attempts](/docs/billing/transactions/)).
Once the credit you have added comes to $10.00 or more in total, [hourly billing](/docs/billing/hourly-billing/) unlocks for your account.
Your bank charges the amount in your account's currency, converted from US dollars ([Currencies and countries](/docs/billing/currencies-and-regions/#what-each-payment-is-charged-in)).
## How Coritan spends credit
New orders
: When you order a service, Coritan takes as much of the first invoice as your credit covers. If credit covers all of it, the service starts setting up at once.
Renewals
: Coritan takes each renewal invoice from your credit first, and charges your saved method only for what credit does not cover.
Hourly services
: Coritan takes each hour's charge from your credit ([How hourly billing works](/docs/billing/hourly-billing/)).
Invoices you pay yourself
: Choose **Account credit** in the **Pay** dialog ([Pay an invoice](/docs/billing/invoices/)).
To keep the balance from running out, set up [automatic top-up](/docs/billing/automatic-top-up/).
## Troubleshooting
`Enter an amount between $1.00 and $10,000.00.`
: The amount is outside what one top-up can be. Choose another amount.
**Could not add the credit**
: The payment did not start. The message under it gives the reason. Try again, or choose another way to pay.
`The bank did not approve the payment.`
: Your bank refused the payment, or the check it asked for was not completed. Nothing was added. Try again or pay another way.
`Top-up cancelled. You paid nothing.`
: You left the provider's checkout page before paying.
`Back from checkout. Your balance updates once the payment clears.`
: The provider has not confirmed the payment yet. Check your balance again later; do not pay twice.
`Your bank still needs to confirm this payment.`
: Your bank has not finished its check. Complete it in the card dialog, or wait for the bank and check your balance later.
**Could not confirm the top-up**
: You paid, but Coritan could not confirm the payment when you came back. Wait a few minutes and check your balance. If the credit does not arrive, [contact support](/docs/support/) with the date and amount.
## Related
- [Turn on automatic top-up](/docs/billing/automatic-top-up/)
- [Pay with cryptocurrency](/docs/billing/crypto-payments/)
- [How hourly billing works](/docs/billing/hourly-billing/)
- [Billing](/docs/billing/)
## With the API
Every top-up `amount` is in US dollars, from `1` to `10000`; anything else answers `422`. The payment is charged in `currency` when you send it, and otherwise in your account's currency.
### Charge a saved method
[`POST /billing/topup/manual`](/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-manual) charges a saved method (its `id` from `GET /payments/methods`) and adds the credit when the charge succeeds:
```bash
curl -X POST https://api.coritan.com/api/v1/billing/topup/manual \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount": "25.00", "payment_method_id": 812}'
```
```json
{
"message": "Top-up successful",
"new_balance": 37.01,
"status": "succeeded",
"base_amount": "25.00",
"fx_rate": "1",
"currency": "USD"
}
```
When the bank wants the cardholder to confirm, the answer has `status` `requires_action` and a `client_secret` for Stripe.js in a browser; nothing is credited until the confirmed payment reaches `confirm-payment` below. A declined charge answers `402` with the bank's reason, and a method that is not yours answers `404` with `Payment method not found`.
### Pay by card in a browser
1. Create the payment with [`POST /billing/topup/pay-intent`](/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-pay-intent). Send `amount`, and optionally `gateway_name`, `currency` and `save_method` (`true` keeps the card for later charges). The answer has `status` `requires_payment_method`, a `client_secret` for Stripe.js, `gateway_reference` (the payment's id), `charge_amount` in the charged currency's smallest unit, `base_amount` and `fx_rate`.
2. The cardholder confirms the card in the browser with Stripe.js.
3. Call [`POST /billing/topup/confirm-payment`](/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-confirm-payment) with the query parameters `gateway_name` and `payment_intent_id`. You can add `amount` to check it: the call answers `400` with `amount does not match the completed payment` when it differs from what was paid by more than two cents.
```bash
curl -X POST "https://api.coritan.com/api/v1/billing/topup/confirm-payment?gateway_name=stripe&payment_intent_id=pi_3Qexample&amount=25" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"status": "succeeded",
"gateway_name": "stripe",
"gateway_reference": "pi_3Qexample",
"client_secret": null,
"requires_action_url": null,
"new_balance": 37.01,
"credited_usd": 25.0
}
```
It answers `requires_action` while the bank still wants a check, and `402` with `Payment not completed` when the payment failed. Coritan credits each payment once, so repeating the call is safe.
### Pay with PayPal or a checkout page
[`POST /billing/topup/checkout`](/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-checkout) creates a checkout. Send `amount`, `gateway_name`, `return_url` and `cancel_url`. Both URLs must be absolute `http` or `https` URLs on a real host; placeholder hosts such as `example.com` answer `400`.
```bash
curl -X POST https://api.coritan.com/api/v1/billing/topup/checkout \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"amount": "25.00", "gateway_name": "paypal", "return_url": "https://www.coritan.com/dashboard/billing", "cancel_url": "https://www.coritan.com/dashboard/billing"}'
```
```json
{
"checkout_url": "https://www.paypal.com/checkoutnow?token=5O190127TN364715T",
"session_id": "5O190127TN364715T",
"token": null,
"gateway": "paypal",
"currency": "USD",
"charge_amount": 2500,
"base_amount": "25.00",
"fx_rate": "1"
}
```
Send the payer to `checkout_url`. For most providers, the credit arrives when the provider confirms the payment to Coritan. For PayPal, `session_id` is the PayPal order: once the payer approves it, call [`POST /billing/topup/paypal-capture`](/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-paypal-capture) with the query parameters `order_id` and `gateway_name` (and optionally `amount`). It answers like `confirm-payment`, or `402` with the reason when PayPal refuses the capture.
## API
- `POST /api/v1/billing/topup/checkout`: Hosted checkout to buy USD account credit without a saved payment method (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-checkout)
- `POST /api/v1/billing/topup/pay-intent`: Create an in-page Stripe Payment Element intent for a credit top-up (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-pay-intent)
- `POST /api/v1/billing/topup/confirm-payment`: Finalize a top-up PaymentIntent after SCA and credit the user balance (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-confirm-payment)
- `POST /api/v1/billing/topup/paypal-capture`: Capture an approved PayPal order and credit the platform user balance (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-paypal-capture)
- `POST /api/v1/billing/topup/manual`: Manually top up credit balance by charging a payment method (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-topup-manual)
# Manage payment methods
> Save a card or another payment method, choose which one is your default, and remove methods you no longer use.
Source: https://www.coritan.com/docs/billing/payment-methods/
In the dashboard:
- /dashboard/billing/methods: https://www.coritan.com/dashboard/billing/methods
A saved card or PayPal account lets Coritan charge renewals and automatic top-ups without you. You can still pay each invoice yourself without one. Manage your methods on the **Payment methods** tab of **Billing**, which also holds the auto-pay setting and [automatic top-up](/docs/billing/automatic-top-up/).
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Have the card or PayPal account to hand. The ways to save a method depend on your billing country ([Currencies and countries](/docs/billing/currencies-and-regions/#your-billing-country)).
## Save a payment method
1. In the sidebar, select **Billing**, then the **Payment methods** tab.
2. Select **Add payment method**.
3. If the dialog lists more than one **Kind of payment method**, choose one.
4. Leave **Use this for renewals and top-ups** ticked to make the method your default. Clear it to save the method without making it the default.
5. Finish for the kind you chose:
- For a card, select **Enter card details**, enter the card and select **Save card**. Your bank may ask you to confirm.
- For PayPal, select the PayPal button, sign in to PayPal in the window that opens and approve future payments. You stay on the page.
- For any other provider, select the button that starts with `Continue to`, complete the provider's page, and it brings you back to the **Payment methods** tab.
Coritan does not charge you when you save a method. Your bank may show a small authorisation that drops off.
## Change your default method
Your default method is the one marked `Default`. Coritan charges it for renewals and automatic top-ups. To change it, select **Make default** on another method.
## Remove a payment method
1. Select **Remove…** on the method.
2. Read the dialog and select **Remove payment method**.
Coritan stops charging the method. If it was your default, make another method the default before your next renewal; otherwise Coritan charges the method you saved most recently.
## Turn auto-pay on or off
The card at the top of the tab says whether auto-pay is on. Select **Turn off auto-pay** or **Turn on auto-pay** to change it. Auto-pay is on for new accounts.
> [!IMPORTANT]
> Turning auto-pay off does not stop automatic charges at the moment. Coritan still takes each renewal invoice from your credit first and then charges your saved methods. To pay every renewal yourself, remove your saved methods and keep your balance at zero.
## Result
A message confirms each change, for example `Visa ending in 4242 saved.`, `Visa ending in 4242 is now your default.` or `Payment method removed.` Each saved method shows its name, its expiry date (such as `Expires 08/2029`) or email address, and the date you added it.
Adding a method does two more things:
- Any renewal invoice still waiting for payment moves to the new method for its next try.
- Retries that stopped because your bank refused a card start again with the new method ([Failed payments and suspended services](/docs/billing/failed-payments/)).
A card you pay with in the dashboard also appears in your saved methods. It becomes the default when you have no default yet.
## Troubleshooting
**No way to pay is available right now**
: Nothing is set up to save a payment method for your country. [Contact support](/docs/support/).
**Could not start adding a payment method**
: The provider did not start the setup. The message under it gives the reason. Try again, or choose another kind of method.
`The bank did not approve the card.`
: Your bank refused the check. Nothing was saved. Try another card.
`You cancelled adding the payment method.`
: You left the provider's page before finishing. Nothing was saved.
`Back from the payment provider. If the method was approved it appears below shortly.`
: The dashboard could not tell whether the provider approved the method. Reload the tab after a minute.
**Could not confirm the payment method**
: The provider approved the method but Coritan could not save it. Add it again.
Two methods show `Default`
: Each payment provider keeps its own default, so a card and a PayPal account can both be marked `Default`. Coritan then cannot choose between them for renewals and automatic top-ups. Remove the one you do not want charged and add it again with **Use this for renewals and top-ups** cleared.
**Could not change auto-pay**
: The setting did not save. Try again.
## Related
- [Keep your credit topped up](/docs/billing/automatic-top-up/)
- [Pay an invoice](/docs/billing/invoices/)
- [Failed payments and suspended services](/docs/billing/failed-payments/)
## With the API
### List your methods
[`GET /payments/methods`](/docs/api/reference/client/payments/#op-get-api-v1-payments-methods) lists your saved methods, the default first and then the newest:
```bash
curl https://api.coritan.com/api/v1/payments/methods \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
[
{
"id": 812,
"gateway_name": "stripe",
"gateway_config_id": 3,
"currency": "USD",
"method_type": "card",
"display_label": "Visa ending in 4242",
"brand": "visa",
"last4": "4242",
"expires_month": 8,
"expires_year": 2029,
"email": null,
"is_default": true,
"is_active": true,
"created_at": "2026-09-01T10:20:00"
}
]
```
`id` is what you send as `payment_method_id` when you [pay an invoice](/docs/billing/invoices/#pay-with-a-saved-method) or [add credit](/docs/billing/add-credit/#with-the-api). `gateway_name` is the provider account that holds the method, and `currency` is the currency automatic charges to it are made in. `method_type` is `card`, `paypal` or another kind, such as `bank_debit` or `wallet`.
### Save a method
Saving a method takes two calls, with a browser step between them for the cardholder:
1. Start with [`POST /payments/methods/setup`](/docs/api/reference/client/payments/#op-post-api-v1-payments-methods-setup). Send `return_url` and `cancel_url`, where the provider sends the payer back. `gateway_name` picks the provider account; leave it out and Coritan picks one for `currency` (default `USD`) and your billing country. `country_code` overrides the billing country for that choice.
2. Finish the payer's step. For a card, the answer's `client_secret` is for Stripe.js `confirmSetup` in a browser. For PayPal, `session_id` is the setup token the payer approves. For other providers, send the payer to `redirect_url`.
3. Call [`POST /payments/methods/confirm`](/docs/api/reference/client/payments/#op-post-api-v1-payments-methods-confirm) with `gateway_name`, `session_id` (the SetupIntent id for a card, or the approved PayPal token) and `set_as_default`. Send `currency` to choose the currency automatic charges use; it defaults to `USD`.
```bash
curl -X POST https://api.coritan.com/api/v1/payments/methods/setup \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"gateway_name": "stripe", "return_url": "https://www.coritan.com/dashboard/billing/methods", "cancel_url": "https://www.coritan.com/dashboard/billing/methods"}'
```
```json
{
"redirect_url": null,
"client_secret": "seti_1Qexample_secret_example",
"session_id": "seti_1Qexample",
"requires_redirect": false,
"gateway_name": "stripe",
"currency": "USD"
}
```
The confirm call answers with the saved method, in the same shape as the list. Both calls answer `400` with the reason when the provider cannot save a method, for example `No gateway account available for EUR`.
### Change the default or remove a method
[`PUT /payments/methods/{method_id}/default`](/docs/api/reference/client/payments/#op-put-api-v1-payments-methods-method-id-default) makes a method the default and answers `{"message": "Default payment method updated"}`. It clears `is_default` only on your other methods from the same provider, as the dashboard does.
[`DELETE /payments/methods/{method_id}`](/docs/api/reference/client/payments/#op-delete-api-v1-payments-methods-method-id) removes a method from Coritan and from the provider, and answers `{"message": "Payment method removed"}`. Both answer `404` with `Payment method not found` for a method that is not yours.
### See which providers can take a payment
[`GET /payments/payment-config`](/docs/api/reference/client/payments/#op-get-api-v1-payments-payment-config) lists the provider accounts that can take a payment in a currency, as the dashboard's payment dialogs use it. It takes `currency` (default: your account's currency) and `country` (default: your billing country), and answers with `currency`, `country` and `accounts`. Each account has its `name`, `adapter` (`stripe`, `paypal` or another provider), `display_name`, the `method_types` it offers, whether it can save a method (`supports_tokenization`), charge a saved one (`supports_merchant_charge`) or run a checkout page (`supports_customer_checkout`), and the public keys a browser needs in `public_config`. The account for your country comes first, marked `preferred_for_country`.
[`GET /payments/gateways`](/docs/api/reference/client/payments/#op-get-api-v1-payments-gateways) with `currency` lists the accounts that can save a method in that currency, in the same shape. Without `currency` it lists every provider with what it supports.
### Change the auto-pay setting
Send `auto_pay_enabled` to [`PATCH /payments/preference`](/docs/api/reference/client/payments/#op-patch-api-v1-payments-preference). [`GET /payments/preference`](/docs/api/reference/client/payments/#op-get-api-v1-payments-preference) returns it with your currency and country ([Currencies and countries](/docs/billing/currencies-and-regions/#read-or-change-your-currency-and-country)). The setting has the limit described above.
```bash
curl -X PATCH https://api.coritan.com/api/v1/payments/preference \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"auto_pay_enabled": false}'
```
## API
- `GET /api/v1/payments/methods`: List payment methods (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-methods)
- `POST /api/v1/payments/methods/setup`: Setup payment method (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-methods-setup)
- `POST /api/v1/payments/methods/confirm`: Confirm payment method (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-methods-confirm)
- `PUT /api/v1/payments/methods/{method_id}/default`: Set default payment method (https://www.coritan.com/docs/api/reference/client/payments/#op-put-api-v1-payments-methods-method-id-default)
- `DELETE /api/v1/payments/methods/{method_id}`: Remove payment method (https://www.coritan.com/docs/api/reference/client/payments/#op-delete-api-v1-payments-methods-method-id)
- `GET /api/v1/payments/payment-config`: Eligible gateway accounts + non-secret public config for embedded UIs (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-payment-config)
- `GET /api/v1/payments/gateways`: List live gateway accounts, optionally filtered by pay currency (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-gateways)
- `GET /api/v1/payments/preference`: Get payment preference (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-preference)
- `PATCH /api/v1/payments/preference`: Update payment preference (https://www.coritan.com/docs/api/reference/client/payments/#op-patch-api-v1-payments-preference)
# Pay an invoice
> Find your unpaid invoices, pay one with credit, a saved method or a new one, and read an invoice's lines and status.
Source: https://www.coritan.com/docs/billing/invoices/
In the dashboard:
- /dashboard/billing/invoices: https://www.coritan.com/dashboard/billing/invoices
Coritan raises an invoice for every order, every renewal and every plan upgrade. Invoices are in US dollars. Pay one to start a new service, to keep a service running past its renewal date, or to lift a suspension.
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- To pay with credit, have credit on your balance. [Add credit to your balance](/docs/billing/add-credit/) explains how.
- To pay with a saved card or PayPal account, save it first on the **Payment methods** tab ([Manage payment methods](/docs/billing/payment-methods/)). You can also enter a new card or use PayPal while you pay.
## Find an invoice
1. In the sidebar, select **Billing**, then the **Invoices** tab.
2. Choose a filter:
- **Unpaid** lists every invoice you still owe on: unpaid and overdue ones, however old.
- **Paid** lists the invoices you have paid.
- **All** lists everything, newest first.
3. Select **View** beside an invoice to read it.
The table shows each invoice's number, **Status**, **Total**, the date it was **Issued** and the date it is **Due**. Choose how many rows a page shows at the bottom of the table, and move between pages with **Previous** and **Next**.
## Pay an invoice
1. Select **Pay** beside the invoice. The same button is on the **Overview** tab of **Billing**, in **Waiting for payment**.
The dialog opens with the **Amount due**: the invoice total less anything already paid.
2. Choose how to pay:
- **Account credit** takes the amount from your balance. It is greyed out when your balance is empty.
- A saved card or PayPal account pays with that method. Your default method is marked `Default`.
- **Card** opens a card form. It reads **New card** when you already have a saved method.
- **PayPal** shows PayPal's buttons in the dialog. Approve the payment in the PayPal window that opens; you stay on the page.
- Any other provider opens that provider's checkout page, then brings you back to the **Invoices** tab.
3. Select the button at the bottom of the dialog. It says what happens next:
- **Pay with credit** when your credit covers the whole amount.
- **Apply credit** when it covers part. The rest stays due, and you pay it the same way.
- `Pay $12.99` (with the amount due) for a saved method or a new card.
- `Continue to` and the provider's name for a checkout page.
4. If a card form opens (**Pay by card**, or **Confirm with your bank** when your bank asks for a check), complete it and select **Pay now**. You enter card details with Coritan's card processor; Coritan does not store them.
## Result
A message confirms the payment, for example `Invoice INV-20260925-48213 paid.` The invoice moves to the **Paid** filter and Coritan emails you a receipt. Paying in full also does what the invoice was for:
- A new service starts setting up.
- A renewal moves the service's next renewal date on by one billing period.
- An upgrade applies the new plan ([Change a service's plan](/docs/billing/change-plan/)).
- A service suspended over this invoice is resumed.
When a payment is accepted but not yet settled, you see `Payment submitted. The invoice updates once your bank settles it.` The invoice stays unpaid until the payment clears. Every payment also appears on the **Transactions** tab ([Transactions and payment attempts](/docs/billing/transactions/)).
## Read an invoice
Select **View** to open an invoice. It shows:
- **Issued**, **Due** and **Paid** (the date and time it was paid, or `Not yet`).
- **Notes**, when the invoice has any.
- One line per charge, with the **Item**, **Qty**, **Unit price** and **Amount**.
- The **Subtotal**, **Tax** and **Total**. When part of the invoice is paid, **Already paid** and **Left to pay** follow.
An unpaid invoice has a pay button at the bottom of the dialog, beside **Close**.
Each invoice has one of these statuses:
| Status | Meaning |
| --- | --- |
| `unpaid` | Issued and waiting for payment. |
| `overdue` | Its due date has passed and it is still unpaid. The services on it are suspended soon after; [Failed payments and suspended services](/docs/billing/failed-payments/) has the timeline. |
| `paid` | Paid in full. |
| `cancelled` | Voided. You owe nothing on it. Coritan cancels an invoice when you cancel its service, or when a newer upgrade replaces an unpaid one. |
| `refunded` | Paid, then refunded. |
| `draft` | Not issued yet. |
## Troubleshooting
**No way to pay is available right now**
: Nothing is set up to take a payment for this invoice. [Contact support](/docs/support/).
**Could not load the ways to pay**
: The dialog could not read the payment options. Select **Try again**.
**Could not take the payment**
: The payment did not start. The message under it gives the reason, for example `Payment method 812 not found or inactive` when the saved method has been removed.
**Could not start the payment**
: The card form or the provider's checkout page could not be created. The message under it gives the reason. Try again, or choose another way to pay.
`The payment was declined.`
: Your bank or PayPal refused the charge. The message may give the bank's reason instead. Pay another way, or see [Failed payments and suspended services](/docs/billing/failed-payments/).
`The bank did not approve the payment.`
: The check your bank asked for failed or was abandoned. Nothing was charged. Try again, or pay another way.
`Payment cancelled; the invoice is still due.`
: You left the provider's checkout page before paying. Nothing was charged.
`Back from checkout. The invoice updates once the payment clears.`
: You came back from a checkout page before the provider confirmed the payment. Check the invoice again later; do not pay twice.
**Could not open PayPal**
: PayPal did not load in the dialog. Select **Try again**. If the message says `PayPal is not available in this browser. Choose another way to pay.`, use a card or another method.
**Could not open the card form**
: The card form did not load. Select **Try again**.
**Could not apply your credit**
: The message gives the reason, for example `No credit balance available`.
The **Pay** button is missing
: Only unpaid and overdue invoices can be paid. The invoice is already paid, cancelled or refunded.
## Related
- [Add credit to your balance](/docs/billing/add-credit/)
- [Manage payment methods](/docs/billing/payment-methods/)
- [Failed payments and suspended services](/docs/billing/failed-payments/)
- [Currencies and countries](/docs/billing/currencies-and-regions/)
## With the API
### List your invoices
[`GET /billing/invoices`](/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices) lists your invoices, newest first. It takes:
`status_filter`
: `open` (unpaid or overdue, what the **Unpaid** filter shows), or one status: `draft`, `unpaid`, `paid`, `cancelled`, `refunded` or `overdue`. Leave it out for every invoice.
`page` and `limit`
: The page to return (from `1`) and how many invoices a page holds (default `50`, at most `200`).
`with_total`
: `true` wraps the page in an object with the total and the count per status. Without it, the answer is a bare array of invoices.
```bash
curl "https://api.coritan.com/api/v1/billing/invoices?status_filter=open&with_total=true" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"items": [
{
"id": 5011,
"invoice_number": "INV-20260925-48213",
"user_id": 4821,
"subtotal": 12.99,
"tax": 0.0,
"total": 12.99,
"amount_paid": 0.0,
"currency": "USD",
"status": "unpaid",
"due_date": "2026-09-28T00:00:00",
"paid_at": null,
"notes": null,
"items": [
{
"id": 9120,
"service_id": 311,
"description": "Service renewal - survival-smp",
"item_type": "recurring",
"quantity": 1.0,
"unit_price": 12.99,
"total": 12.99
}
],
"created_at": "2026-09-25T02:00:00"
}
],
"total": 1,
"page": 1,
"limit": 50,
"counts": {"all": 14, "open": 1, "draft": 0, "unpaid": 1, "paid": 13, "cancelled": 0, "refunded": 0, "overdue": 0}
}
```
`total` counts the invoices that match the filter. `counts` holds every status whatever the filter, with `all` and `open` added.
In each invoice:
`id` and `invoice_number`
: The number the API uses in paths, and the number printed on the invoice.
`subtotal`, `tax` and `total`
: The amounts in US dollars.
`amount_paid`
: What credit and earlier payments have covered. What is left to pay is `total` minus `amount_paid`.
`currency`
: `USD`.
`status`
: One of the statuses in the table above.
`due_date`, `paid_at` and `created_at`
: When the invoice falls due, when it was paid (or `null`) and when it was issued.
`items`
: The lines. `service_id` is the service a line bills, and `item_type` is `recurring`, `one_time`, `proration`, `addon`, `discount` or `manual`.
[`GET /billing/invoices/{invoice_id}`](/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices-invoice-id) returns one invoice in the same shape. It answers `404` with `Invoice not found`, or `403` with `Access denied` for an invoice on another account.
### Pay with credit
[`POST /billing/invoices/{invoice_id}/apply-credit`](/docs/api/reference/client/billing/#op-post-api-v1-billing-invoices-invoice-id-apply-credit) takes as much of the amount due as your balance covers:
```bash
curl -X POST https://api.coritan.com/api/v1/billing/invoices/5011/apply-credit \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"invoice_id": 5011,
"applied": "12.99",
"fully_paid": true,
"credit_balance": "12.01",
"message": "Invoice paid with credit"
}
```
When credit covers only part, `fully_paid` is `false` and `message` is `Partial credit applied`. When nothing can be applied, the answer is `400` with the reason, such as `No credit balance available`.
### Pay with a saved method
[`POST /payments/invoices/{invoice_id}/charge`](/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-charge) charges a saved method. Find its `id` with `GET /payments/methods` ([Manage payment methods](/docs/billing/payment-methods/#with-the-api)).
```bash
curl -X POST https://api.coritan.com/api/v1/payments/invoices/5011/charge \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pay-inv-5011-1" \
-d '{"payment_method_id": 812}'
```
The body takes:
`payment_method_id`
: The saved method to charge. Required.
`amount_usd`
: Pay part of the invoice: this many US dollars, at most what is left. Leave it out to pay the rest in full.
`currency`
: The currency to charge the method in. Leave it out to use your account's currency ([Currencies and countries](/docs/billing/currencies-and-regions/)).
Send an `Idempotency-Key` header so that retrying a request whose answer you did not receive does not charge twice ([Idempotency](/docs/api/idempotency/)).
The answer is the payment attempt:
```json
{
"id": 7730,
"invoice_id": 5011,
"user_id": 4821,
"user_email": "alex@example.com",
"gateway_name": "stripe",
"gateway_config_id": 3,
"payment_method_id": 812,
"amount": 1299,
"currency": "USD",
"base_amount": "12.99",
"fx_rate": "1",
"status": "succeeded",
"gateway_reference": "pi_3Qexample",
"error_message": null,
"decline_type": null,
"decline_code": null,
"is_auto_charge": false,
"charge_schedule_id": null,
"idempotency_key": "pay-inv-5011-1",
"refunded_amount": null,
"created_at": "2026-09-25T09:12:40",
"completed_at": "2026-09-25T09:12:42",
"gateway_response": {"id": "pi_3Qexample", "status": "succeeded"},
"client_secret": null
}
```
`amount` is in the charged currency's smallest unit (cents here). `base_amount` is the US dollar amount it pays and `fx_rate` the exchange rate used, both as decimal strings. `gateway_reference` is the provider's id for the payment, and `gateway_response` holds the provider's own answer. `status` is one of:
`succeeded`
: Paid.
`processing`
: Accepted but not settled. The invoice updates when it settles.
`requires_action`
: The bank wants the cardholder to confirm. `client_secret` lets a browser page finish it with Stripe.js; then call `confirm-payment` as below. A script alone cannot complete this step.
`failed`
: Declined. `error_message` gives the reason, and `decline_type` says whether retrying can work (`soft`) or not (`hard`).
`POST /payments/invoices/{invoice_id}/pay` is the older path for the same charge, with the same body and answer.
### Pay with a new card, PayPal or a checkout page
These flows need a browser for the cardholder's part; the API creates and finishes each payment.
1. List what can take this invoice with [`GET /payments/invoices/{invoice_id}/gateways`](/docs/api/reference/client/payments/#op-get-api-v1-payments-invoices-invoice-id-gateways). Each entry has a `name` to send as `gateway_name`, and `adapter` says what it is (`stripe` for cards, `paypal`, or another provider).
2. For a card, create a payment with [`POST /payments/invoices/{invoice_id}/pay-intent`](/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-pay-intent). The answer's `client_secret` is for Stripe.js in the browser. Asking again for the same invoice and amount returns the same payment. After the card is confirmed, call [`POST /payments/invoices/{invoice_id}/confirm-payment`](/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-confirm-payment) with the query parameters `gateway_name` and `payment_intent_id`. It answers `succeeded`, `pending` or `requires_action`, or `402` with `Payment not completed`.
3. For PayPal or another provider, call [`POST /payments/invoices/{invoice_id}/checkout`](/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-checkout) with `gateway_name`, `return_url` and `cancel_url`. Both must be absolute `http` or `https` URLs on a real host: the API answers `400` for a placeholder host such as `example.com` or `localhost`. Send the payer to `checkout_url`. For PayPal, `session_id` is the PayPal order; once the payer approves it, call [`POST /payments/invoices/{invoice_id}/paypal-capture`](/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-paypal-capture) with the query parameters `order_id` and `gateway_name`.
```bash
curl -X POST https://api.coritan.com/api/v1/payments/invoices/5011/checkout \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"gateway_name": "paypal", "return_url": "https://www.coritan.com/dashboard/billing/invoices", "cancel_url": "https://www.coritan.com/dashboard/billing/invoices"}'
```
A checkout that is still open for the invoice is returned again instead of a new one, with `reused` set to `true`. The checkout answers `400` when the invoice is already paid or cancelled.
## API
- `GET /api/v1/billing/invoices`: Newest first, ties by id so a page boundary never repeats or skips a row (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices)
- `GET /api/v1/billing/invoices/{invoice_id}`: Get invoice (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices-invoice-id)
- `POST /api/v1/billing/invoices/{invoice_id}/apply-credit`: Apply account credit to an unpaid invoice (unlocks provision / plan change when paid) (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-invoices-invoice-id-apply-credit)
- `GET /api/v1/payments/invoices/{invoice_id}/gateways`: List invoice gateways (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-invoices-invoice-id-gateways)
- `POST /api/v1/payments/invoices/{invoice_id}/charge`: Canonical saved-method charge for an invoice (alias of /pay) (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-charge)
- `POST /api/v1/payments/invoices/{invoice_id}/pay`: Charge a saved payment method for an invoice (legacy path; prefer /charge) (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-pay)
- `POST /api/v1/payments/invoices/{invoice_id}/checkout`: Create invoice checkout (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-checkout)
- `POST /api/v1/payments/invoices/{invoice_id}/pay-intent`: Create an in-page Stripe Payment Element intent for an invoice (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-pay-intent)
- `POST /api/v1/payments/invoices/{invoice_id}/confirm-payment`: Finalize a platform invoice charge after customer completes SCA (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-confirm-payment)
- `POST /api/v1/payments/invoices/{invoice_id}/paypal-capture`: Capture an approved PayPal order for a platform invoice (https://www.coritan.com/docs/api/reference/client/payments/#op-post-api-v1-payments-invoices-invoice-id-paypal-capture)
# Transactions and payment attempts
> The transaction types on your account, the payment attempts behind them, and disputes, with every field the API returns.
Source: https://www.coritan.com/docs/billing/transactions/
In the dashboard:
- /dashboard/billing/transactions: https://www.coritan.com/dashboard/billing/transactions
A *transaction* is a record of money moving on your account: a payment, a refund, or credit added or used. The **Transactions** tab lists them newest first. Behind each card or PayPal payment is a *payment attempt*, one try at charging the method, and a *dispute* is a payment you asked your bank to reverse. The API lists all three.
## The Transactions tab
In the sidebar of the [dashboard](https://www.coritan.com/dashboard/billing/transactions), select **Billing**, then the **Transactions** tab.
**What**
: The transaction's description, such as `Payment for invoice INV-20260925-48213`. **See invoice** opens the invoice it belongs to.
**Type**
: `Payment`, `Refund`, `Credit added` or `Credit used`.
**Paid with**
: How the money moved: `Card`, `PayPal`, `Crypto` or `Account credit`. A payment from your credit balance shows `credit_balance`.
**Amount**
: In US dollars. Credit added has a `+` in front, and credit used a `−`.
**When**
: The date and time of the transaction.
Choose **All**, **Payments**, **Refunds** or **Credit** to show one kind. **Credit** shows credit added and credit used together, and each choice shows how many transactions it holds. Under the list, **Show** sets how many rows a page holds (10, 25, 50 or 100), and **Previous** and **Next** move between pages.
## Transaction types
| Type | Shown as | Recorded when | Description |
| --- | --- | --- | --- |
| `payment` | `Payment` | You pay an invoice with a card, PayPal or a checkout page, or Coritan charges your saved method for it. | `Payment for invoice INV-20260925-48213` |
| `credit_deduct` | `Credit used` | Coritan pays an invoice from your credit balance, in full or in part. | `Credit applied to invoice INV-20260925-48213`, or `Credit applied to first payment INV-20260925-48213` for a new order or a plan change |
| `credit_add` | `Credit added` | You add credit: with a saved method, a card, PayPal, a checkout page, automatic top-up or cryptocurrency. | `Manual top-up $25.00`, `Credit top-up $25.00 USD`, `Auto top-up $25.00` or `40.2 USDC deposit on Ethereum` |
| `refund` | `Refund` | Coritan returns a payment to the card or account it came from. | `Refund for invoice INV-20260925-48213` |
Two movements of your credit balance are not transactions, so the tab does not list them: the charges for [hourly services](/docs/billing/hourly-billing/), and the credit from a [plan change](/docs/billing/change-plan/) to a cheaper plan. `GET /billing/credit` lists them ([Billing](/docs/billing/#with-the-api)).
## Payment attempts
Each time Coritan tries to charge a card or PayPal account, it records a payment attempt with its outcome. A declined renewal charge, for example, is a `failed` attempt with the bank's reason, and the successful retry that follows is a second attempt. The dashboard does not show attempts. The API returns your last 50.
`status`
: `pending` (started), `processing` (accepted and settling, which some payment types take days to do), `requires_action` (waiting for you to confirm with your bank), `succeeded`, `failed` or `cancelled`.
`amount` and `currency`
: What was charged, in the smallest unit of the charged currency: `2500` in `USD` is $25.00.
`base_amount` and `fx_rate`
: The amount in US dollars, and the rate used to convert it into `currency`.
`error_message`, `decline_type` and `decline_code`
: Why a charge failed. `decline_type` is `soft` for a decline worth retrying, such as insufficient funds, and `hard` for one that needs a new payment method, such as an expired card. [Failed payments and suspended services](/docs/billing/failed-payments/) explains what each means for your renewals.
`invoice_id` and `payment_method_id`
: The invoice the attempt paid, and the saved method it charged. Both are `null` when they do not apply, such as a top-up with a new card.
`is_auto_charge` and `charge_schedule_id`
: Whether Coritan made the charge itself, such as a renewal retry, and the retry schedule it belongs to.
`gateway_name` and `gateway_reference`
: The payment provider account that handled the charge, and the provider's own ID for it.
`refunded_amount`
: How much of the charge was refunded, in the same unit as `amount`.
`idempotency_key`
: The `Idempotency-Key` sent with the payment, if any ([Idempotent requests](/docs/api/idempotency/)).
`created_at` and `completed_at`
: When the attempt started and when it finished.
Each attempt also carries `user_id`, `user_email`, `gateway_config_id`, `gateway_response` (the provider's answer) and `client_secret` (used to confirm a card payment in the browser).
## Disputes
A dispute, or *chargeback*, is a payment you asked your bank or PayPal to reverse. The dashboard does not show disputes. The API lists the ones on your payments and invoices.
> [!CAUTION]
> When you dispute a payment to Coritan, Coritan deletes every service on your account and closes the account, by default. Winning the dispute later does not bring deleted services back. If a charge looks wrong, [contact support](/docs/support/conversations/) before you go to your bank.
`status` and `reason`
: The payment provider's own words for the state of the dispute, such as `needs_response`, and for its cause.
`amount` and `currency`
: The amount disputed, in the smallest unit of `currency`.
`evidence_due_at`
: The date by which Coritan must answer the provider.
`payment_attempt_id`, `invoice_id` and `gateway_reference`
: The payment attempt and invoice the dispute is about, and the provider's ID for the disputed payment.
`gateway_name` and `gateway_dispute_id`
: The provider that holds the dispute, and its ID for it.
`created_at` and `updated_at`
: When Coritan recorded the dispute and last updated it.
## With the API
### List transactions
[`GET /billing/transactions`](/docs/api/reference/client/billing/#op-get-api-v1-billing-transactions) lists your transactions, newest first. It takes `page` (from 1), `limit` (default 50, at most 200) and `type_filter`: `payment`, `refund`, `credit_add`, `credit_deduct`, or `credit` for both credit types. Add `with_total=true` to get the page with its counts:
```bash
curl "https://api.coritan.com/api/v1/billing/transactions?type_filter=payment&limit=25&with_total=true" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"items": [
{
"id": 7310,
"user_id": 1482,
"invoice_id": 5120,
"amount": 13.47,
"currency": "USD",
"transaction_type": "payment",
"gateway": "stripe",
"gateway_reference": "pi_3Qexample",
"description": "Payment for invoice INV-20260925-48213",
"created_at": "2026-09-25T10:12:44"
}
],
"total": 1,
"page": 1,
"limit": 25,
"counts": {"all": 7, "credit": 6, "payment": 1, "refund": 0, "credit_add": 4, "credit_deduct": 2}
}
```
`total` is how many transactions match `type_filter`, and `counts` holds the number of each type whatever the filter. Without `with_total`, the answer is the list of transactions alone. `amount` is in US dollars and is negative for a refund. `gateway` is `credit_balance` for credit used, and `null` or a provider name otherwise. A `type_filter` outside the list answers `422`.
### List payment attempts
[`GET /payments/attempts`](/docs/api/reference/client/payments/#op-get-api-v1-payments-attempts) returns your last 50 payment attempts, newest first. It takes no parameters.
```bash
curl https://api.coritan.com/api/v1/payments/attempts \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
Each item has the fields under [Payment attempts](#payment-attempts).
### List disputes
[`GET /payments/disputes`](/docs/api/reference/client/payments/#op-get-api-v1-payments-disputes) lists your disputes, newest first. It takes `limit` (default 50, at most 100) and `offset`:
```bash
curl "https://api.coritan.com/api/v1/payments/disputes?limit=20" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"disputes": [],
"limit": 20,
"offset": 0
}
```
Each item in `disputes` has the fields under [Disputes](#disputes) and its `id`.
## API
- `GET /api/v1/billing/transactions`: As listinvoices: newest first, ties by id, withtotal for a TransactionPage (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-transactions)
- `GET /api/v1/payments/attempts`: List payment attempts (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-attempts)
- `GET /api/v1/payments/disputes`: List disputes tied to the caller's payment attempts / invoices only (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-disputes)
# Turn on automatic top-up
> Let Coritan charge your default payment method when your credit balance falls below a threshold you choose.
Source: https://www.coritan.com/docs/billing/automatic-top-up/
Hourly services draw on your credit as they run, and Coritan suspends them when the credit runs out. Automatic top-up adds credit for you: when your balance falls below a threshold, Coritan charges your default payment method a fixed amount. New accounts start with it off.
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Save a payment method that Coritan can charge without you, such as a card or a PayPal account ([Manage payment methods](/docs/billing/payment-methods/)). Coritan charges your default method, or the method you saved most recently when none is the default.
- Your account pays in advance. Automatic top-up does not run on an account that Coritan bills afterwards.
## Turn it on
1. In the sidebar, select **Billing**, then the **Payment methods** tab.
2. Turn on the **Keep credit topped up** switch at the top of its card.
3. In **When my balance drops below**, enter the balance that starts a top-up, in US dollars.
4. In **Add**, enter how much to add each time, in US dollars. It must be at least $1.
5. Select **Save changes**.
To turn it off, turn off the switch and select **Save changes**.
## Result
A message confirms the setting, for example `Auto top-up turned on: $50.00 whenever the balance drops below $25.00.` The **Overview** tab of **Billing** shows the same rule under your balance.
Coritan checks balances every 15 minutes by default. When yours is below the threshold, it charges the amount to your default method, adds it to your balance and emails you a receipt. It tops up at most once an hour, so one top-up that leaves you under the threshold is not followed by another straight away. The top-up appears on the **Transactions** tab as `Auto top-up $50.00`.
When an hourly service is about to be suspended for lack of credit, Coritan tries a top-up first ([How hourly billing works](/docs/billing/hourly-billing/)).
The charge is made in the currency your payment method was saved in ([Currencies and countries](/docs/billing/currencies-and-regions/#what-each-payment-is-charged-in)).
## Troubleshooting
`Enter $0 or more.`
: The threshold is negative or not a number.
`Enter at least $1.`
: The amount to add is below $1 or not a number.
**Could not save auto top-up**
: The setting did not save. The message under it gives the reason. Try again.
**Could not load your auto top-up settings**
: The card did not load. Select **Try again**.
A top-up did not happen
: Coritan emails you when an automatic top-up fails, once until the next one succeeds. The usual causes are a declined card and no saved method. Check the email, update your method on the **Payment methods** tab, or [add credit](/docs/billing/add-credit/) yourself.
## Related
- [Add credit to your balance](/docs/billing/add-credit/)
- [How hourly billing works](/docs/billing/hourly-billing/)
- [Manage payment methods](/docs/billing/payment-methods/)
## With the API
Read the setting with [`GET /billing/topup/config`](/docs/api/reference/client/billing/#op-get-api-v1-billing-topup-config):
```bash
curl https://api.coritan.com/api/v1/billing/topup/config \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"auto_topup_enabled": true,
"auto_topup_threshold": "25.0000",
"auto_topup_amount": "50.0000",
"credit_balance": "37.0100",
"total_deposited": "125.0000",
"hourly_billing_unlocked": true
}
```
The amounts are US dollars, as decimal strings. `total_deposited` is all the credit you have added, and `hourly_billing_unlocked` says whether you can order hourly services.
Change it with [`PUT /billing/topup/config`](/docs/api/reference/client/billing/#op-put-api-v1-billing-topup-config). `enabled` is required; `threshold` (`0` or more) and `amount` (`1` or more) are optional and keep their values when you leave them out.
```bash
curl -X PUT https://api.coritan.com/api/v1/billing/topup/config \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"enabled": true, "threshold": "25", "amount": "50"}'
```
```json
{"message": "Auto top-up configuration updated"}
```
A value out of range answers `422`.
## API
- `GET /api/v1/billing/topup/config`: Get topup config (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-topup-config)
- `PUT /api/v1/billing/topup/config`: Update topup config (https://www.coritan.com/docs/api/reference/client/billing/#op-put-api-v1-billing-topup-config)
# Pay with cryptocurrency
> Add credit by sending cryptocurrency to your own deposit address, and follow each deposit until it is credited.
Source: https://www.coritan.com/docs/billing/crypto-payments/
You pay in cryptocurrency by adding it to your credit balance. Coritan gives you a deposit address of your own, tells you exactly how much to send for the credit you want, and credits your balance in US dollars once the transfer has enough confirmations. That credit then pays for orders, renewals and hourly charges like any other credit ([How Coritan spends credit](/docs/billing/add-credit/#how-coritan-spends-credit)).
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Have a wallet or exchange account that can send the coin on the network you choose. For XRP, it must be able to send a destination tag.
- Decide how much credit you want. In the dashboard, one deposit is between $1.00 and $10,000.00.
- Make sure Coritan has issued you an address for the network. The dashboard shows an address only once Coritan has issued it, and it does not issue the first one. If you have never had an address for the network, issue it with the API ([Get your deposit address](#get-your-deposit-address)). One address serves six networks ([Networks and addresses](#networks-and-addresses)).
## Send a deposit
1. In the sidebar, select **Billing**. The **Add credit** card is on the **Overview** tab.
2. Under **Amount**, choose the credit you want, or choose **Other** and type an amount in US dollars.
3. Under **Pay with**, choose **Crypto**.
4. Under **Coin**, choose the coin and the network you will send it on, for example `USDC on Base`. The minimum for that coin shows under the list, for example `Minimum $0.50 for USDC.`
5. Select **Show where to send**. The card shows `Send USDC on Base`, the amount under **Send exactly**, your address, a QR code and a countdown such as `Send within 29:48`.
6. From your wallet, send exactly that amount to that address before the countdown ends. Use **Copy amount** and **Copy address**, or scan the QR code, which carries the amount as well. For XRP, also send the destination tag shown under **Include the destination tag** (**Copy destination tag**).
7. Select **I have sent it**. While the page is open, the card looks for your transfer every 15 seconds. Once the transfer appears, it shows its progress, for example `Seen on the network: 3 of 15 confirmations.`
You can close the page after step 7. Coritan also watches your address in the background and credits the deposit without the page open. To stop the card looking, select **Stop checking**.
## Result
When the transfer has all its confirmations, the card shows `Deposit credited to your balance.` and your balance goes up. The deposit appears on the **Transactions** tab as a credit with a description such as `25.05 USDC deposit on Base`, and `Crypto` under **Paid with** ([Transactions and payment attempts](/docs/billing/transactions/)).
While a deposit is confirming, the **Overview** tab lists it under a notice such as `1 crypto deposit on the way`, with its confirmations so far.
The credit does not pay an open invoice by itself. Coritan takes it the next time it tries to collect a renewal, or you can pay the invoice with **Account credit** at once ([Pay an invoice](/docs/billing/invoices/)). To have a deposit pay a particular invoice as soon as it arrives, quote it for that invoice with the API ([Get the amount to send](#get-the-amount-to-send)).
## How much you are credited
The amount under **Send exactly** is worked out from three parts, and the line under the address lists them:
The coin's rate
: The market price less a spread, both shown in the quote. By default USDT and USDC have no spread and count as $1.00 each while they trade within 2 cents of $1.00. ETH and SOL have a 1.5% spread by default, and other coins 2%.
The network fee
: What it costs to move your deposit on that network. It differs a lot from one network to another and changes with the network's own fees. Each quote shows it, so for a small amount, compare a few coins and choose one with a low fee.
A margin for price changes
: For coins other than USDT and USDC, the amount includes an extra 2%, so a drop in price while you send does not leave you short.
Coritan credits what arrives: its value at the rate, less the network fee. Nothing is kept back from the margin, so the credit shown in the quote (`Credits about $25.00`) is often a little more than the amount you asked for. If you send less than the quote, you receive less credit; if you send more, you receive more.
The countdown is how long Coritan holds the rate: 30 minutes. A transfer that first appears on the network before the countdown ends is credited at the quoted rate, however long its confirmations take. If the price has gone up by then, you get the higher rate. If it has gone down by more than about 2%, the credit is less than quoted, because Coritan raises the new rate by no more than 2%. A transfer that appears after the countdown ends is credited at the rate at that time.
A transfer below the coin's minimum is still credited, less the network fee. A transfer worth less than its own network fee credits nothing.
## Networks and addresses
Your addresses are permanent: each one stays yours and receives any number of deposits. One address serves every network of the same kind.
| Network | Your address | Confirmations by default |
| --- | --- | --- |
| Ethereum, BNB Smart Chain, Base, Polygon, Arbitrum One, OP Mainnet | One address for all six networks | Ethereum 6, BNB Smart Chain 7, Polygon 10, the others 15 |
| Solana | An address of its own | 1 |
| Tron | An address of its own | 10 |
| Dogecoin | An address of its own | 10 |
| XRP Ledger | Coritan's shared address, with a destination tag that is yours | 1 |
The **Coin** list shows which coins and networks Coritan accepts at the moment, such as `USDT on Tron` or `ETH on Arbitrum One`. Bitcoin is not accepted.
> [!WARNING]
> Send only a coin and network from the **Coin** list. Coritan credits a listed coin on any network your address serves, but it cannot recover a coin or network that is not in the list. On the XRP Ledger, a transfer without your destination tag cannot be matched to your account.
## Troubleshooting
**Crypto** is not under **Pay with**
: Coritan is not taking crypto deposits at the moment. Add credit another way ([Add credit to your balance](/docs/billing/add-credit/)).
**Crypto deposits are not available right now**
: No coin can be credited at the moment. Pay by card or PayPal, or try again later.
**Could not load the coins you can send**
: The list did not load. Select **Try again**.
The address shows `—` and there is no countdown
: Coritan has not issued you an address for that network yet. Issue it with the API ([Get your deposit address](#get-your-deposit-address)), then select **Show where to send** again. Do not send anything until the address shows.
`Choose an amount first.`
: The amount is missing or outside $1.00 to $10,000.00. Choose another amount.
`Could not work out how much to send`
: Coritan could not quote the coin, often because it has no current price for it. The message under it gives the reason. Try again in a few minutes, or choose another coin.
`The network fee would use up this deposit. Choose another coin or a larger amount.`
: The amount is too small for that network's fee. Choose a network with a lower fee, or a larger amount.
**We no longer hold this rate**
: The countdown ended before you sent. Do not send the old amount: select **Get a new amount** and send the new one. If you already sent the old amount after the countdown ended, Coritan credits it at the current rate.
A deposit is on hold
: The **Overview** tab shows a notice such as `1 crypto deposit on hold`, with the reason beside each deposit. When the reason is a price Coritan cannot read, it credits the deposit on its own once the price is available again. For any other reason, or if nothing changes, select **Open a ticket**.
A deposit has all its confirmations but is not credited
: Wait a few minutes and check again. If it is still not credited, [contact support](/docs/support/) with the transaction hash.
You sent XRP without the destination tag, or a coin that is not in the list
: Coritan cannot credit it automatically. [Contact support](/docs/support/) with the transaction hash.
## Related
- [Add credit to your balance](/docs/billing/add-credit/)
- [Pay an invoice](/docs/billing/invoices/)
- [Transactions and payment attempts](/docs/billing/transactions/)
- [Turn on automatic top-up](/docs/billing/automatic-top-up/)
## With the API
Paying through the API takes the same steps as the dashboard: choose a coin, make sure you have an address, get a quote, send, then follow the deposit. Every amount is in US dollars.
### List the coins you can send
[`GET /billing/crypto/assets`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-assets) lists every coin Coritan can credit right now, one entry per coin and network:
```bash
curl https://api.coritan.com/api/v1/billing/crypto/assets \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"assets": [
{
"network": "base",
"network_name": "Base",
"asset": "USDC",
"display_name": "USD Coin (BASE)",
"chain_family": "evm",
"decimals": 6,
"is_stablecoin": true,
"contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"confirmations": 15,
"min_deposit_usd": "0.5000",
"spread_percent": "0",
"market_rate_usd": "1.000000000000000000",
"applied_rate_usd": "1.000000000000000000",
"notes": null
}
]
}
```
`network` and `asset` are the values the other calls take. `applied_rate_usd` is the market rate less the spread, and `chain_family` tells you which address a coin uses.
### Compare the ways to pay an amount
[`GET /billing/crypto/plan`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-plan) quotes an amount on every coin at once, cheapest network fee first. `recommended` is the cheapest option that can pay the amount, and an option whose network fee would use up the deposit has `viable` `false`. Add `invoice_id` to plan for an invoice's unpaid balance instead: you still send `amount`, and Coritan uses the invoice's outstanding balance when it has one.
```bash
curl "https://api.coritan.com/api/v1/billing/crypto/plan?amount=25" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"usd_target": "25.00",
"options": [
{
"network": "base",
"network_name": "Base",
"asset": "USDC",
"send_amount": "25.05",
"send_amount_raw": "25050000",
"decimals": 6,
"you_receive_usd": "25.0007",
"network_fee_usd": "0.0493",
"fee_share": "0.0020",
"market_rate_usd": "1.000000000000000000",
"spread_percent": "0",
"headroom_percent": "0",
"confirmations": 15,
"viable": true,
"good_value": true,
"note": "Credited at 1:1, less approximately $0.05 in network fees."
},
{
"network": "ethereum",
"network_name": "Ethereum",
"asset": "ETH",
"send_amount": "0.010456",
"send_amount_raw": "10456000000000000",
"decimals": 18,
"you_receive_usd": "25.5015",
"network_fee_usd": "0.2463",
"fee_share": "0.0099",
"market_rate_usd": "2500.000000000000000000",
"spread_percent": "1.5000",
"headroom_percent": "2.0",
"confirmations": 6,
"viable": true,
"good_value": true,
"note": "Network fees of approximately $0.25 apply."
}
],
"recommended": {"network": "base", "asset": "USDC"},
"note": "Send the exact amount shown. You are credited what arrives less the network fee, and the amount already allows for the price moving while the transfer confirms, so you will not end up short of the total."
}
```
`good_value` is `false` when the network fee is more than 5% of the amount. A plan holds no rate; get a quote before you send.
### Get your deposit address
[`GET /billing/crypto/address`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-address) returns your permanent address for a network, and issues it the first time you ask. Asking again, or asking for another network of the same kind, returns the same address.
```bash
curl "https://api.coritan.com/api/v1/billing/crypto/address?network=base" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"account_id": 4127,
"chain_family": "evm",
"chain_family_name": "EVM",
"address": "0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
"destination_tag": null,
"x_address": null,
"requires_destination_tag": false,
"networks": ["ethereum", "bsc", "base", "polygon", "arbitrum", "optimism"],
"accepted": [
{
"network": "base",
"network_name": "Base",
"asset": "USDC",
"min_deposit_usd": "0.5000",
"confirmations": 15,
"contract_address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
}
],
"explorer_url": "https://basescan.org/address/0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
"payment_uri": "ethereum:0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5@8453",
"qr_svg": "",
"is_permanent": true
}
```
`networks` lists every network the address receives on, and `accepted` every coin Coritan accepts at it. For the XRP Ledger, `requires_destination_tag` is `true`, `destination_tag` is your tag, and `x_address` holds the address and the tag in one string, so a wallet that accepts it cannot leave the tag off.
### Get the amount to send
[`GET /billing/crypto/quote`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-quote) takes `network`, `asset` and `amount` (more than `0`, at most `100000`), and optionally `invoice_id`. The quote holds its rate for 30 minutes (`rate_lock_seconds`) until `rate_locked_until`. With `invoice_id`, Coritan puts your balance towards that invoice as soon as the deposit is credited; pass the invoice's unpaid balance as `amount`.
```bash
curl "https://api.coritan.com/api/v1/billing/crypto/quote?network=base&asset=USDC&amount=25" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"network": "base",
"asset": "USDC",
"decimals": 6,
"usd_target": "25.0000",
"market_rate_usd": "1.000000000000000000",
"spread_percent": "0",
"applied_rate_usd": "1.000000000000000000",
"send_amount": "25.05",
"send_amount_raw": "25050000",
"network_fee_amount": "0.05",
"network_fee_usd": "0.0493",
"headroom_percent": "0",
"credited_estimate_usd": "25.0007",
"covers_fee": true,
"minimum_usd": "0.5000",
"confirmations": 15,
"below_minimum": false,
"address": "0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5",
"destination_tag": null,
"payment_uri": "ethereum:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913@8453/transfer?address=0x4f2cexample9e8d7c6b5a4f3e2d1c0b9a8f7e6d5&uint256=25050000",
"qr_svg": "",
"intent_id": 918,
"rate_locked_until": "2026-09-25T14:30:00.412233+00:00",
"rate_lock_seconds": 1800,
"invoice_id": null
}
```
Send `send_amount` (in whole coins; `send_amount_raw` is the same figure in the coin's smallest unit). `payment_uri` and `qr_svg` carry the amount, so a wallet that opens or scans them fills it in. `covers_fee` is `false` when the network fee would use up the deposit.
A quote carries `address`, `rate_locked_until` and the fields after them only when you already have an address for that network. Without one, it has none of them and holds no rate: get your address first. A new quote for the same invoice, or for a top-up, replaces the one before it, so send the amount from the latest quote.
### Follow a deposit
[`POST /billing/crypto/check`](/docs/api/reference/client/billing/#op-post-api-v1-billing-crypto-check) asks Coritan to look for your transfer now, and answers with your deposits. Send `network` to look only at that network's address. Coritan reads the network for an address at most once every 20 seconds; in between, the call answers from what it already knows, with `chain_checked` `false` and `next_check_in_seconds` until the next read. The call answers `429` after 12 calls in a minute.
```bash
curl -X POST https://api.coritan.com/api/v1/billing/crypto/check \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"network": "base"}'
```
The answer has `chain_checked`, `next_check_in_seconds`, `found` (new transfers this read found), and `deposits` and `summary` as [`GET /billing/crypto/deposits`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits) returns them. That call lists your deposits newest first (`limit`, default `50`, at most `200`), and `summary.confirming` holds up to five deposits that are not credited yet:
```json
{
"deposits": [
{
"id": 7731,
"network": "base",
"network_name": "Base",
"asset": "USDC",
"amount": "25.05",
"amount_raw": "25050000",
"decimals": 6,
"tx_hash": "0xexampletransactionhash",
"explorer_url": "https://basescan.org/tx/0xexampletransactionhash",
"status": "detected",
"confirmations": 9,
"required_confirmations": 15,
"confirmation_percent": 60,
"credited_usd": null,
"market_rate_usd": null,
"spread_percent": null,
"hold_reason": null,
"first_seen_at": "2026-09-25T14:09:12",
"credited_at": null
}
],
"summary": {
"total": 1,
"pending": 1,
"held": 0,
"confirming": [
{
"id": 7731,
"network": "base",
"network_name": "Base",
"asset": "USDC",
"amount": "25.05",
"status": "detected",
"confirmations": 9,
"required_confirmations": 15,
"confirmation_percent": 60,
"hold_reason": null,
"tx_hash": "0xexampletransactionhash",
"explorer_url": "https://basescan.org/tx/0xexampletransactionhash"
}
]
}
}
```
[`GET /billing/crypto/deposits/{deposit_id}`](/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits-deposit-id) returns one deposit in the same shape. A deposit's `status` is one of these:
`detected`
: Seen on the network and waiting for confirmations.
`held`
: Confirmed, but not credited yet. `hold_reason` says why, for example `asset is not enabled for automatic credit`, or a price Coritan cannot read, such as `price for ETH is 12 minutes old`.
`credited`
: Added to your balance. `credited_usd` is the amount, and `0.0000` for a transfer worth less than its network fee.
| Status | `detail` | When |
| --- | --- | --- |
| `404` | `Invoice not found` | The `invoice_id` is not one of your invoices. |
| `404` | `Deposit not found` | The deposit is not one of yours. |
| `409` | `USDC on base is not accepted` | Coritan does not accept that coin on that network. |
| `409` | For example `price for ETH is 12 minutes old` | Coritan has no current price for the coin, so it cannot quote it. |
| `409` | `unknown network dogechain` or `deposit addresses for this network are temporarily unavailable` | Coritan cannot give you an address for that network. |
| `422` | A validation error | A parameter is missing, or `amount` is `0` or less or above `100000`. |
| `429` | `rate_limited`, with `retry_after_seconds` | More than 12 checks in a minute. Wait for the time in the `Retry-After` header. |
## API
- `GET /api/v1/billing/crypto/assets`: Assets we can accept right now (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-assets)
- `GET /api/v1/billing/crypto/plan`: Every way to pay this amount in crypto, cheapest first (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-plan)
- `GET /api/v1/billing/crypto/quote`: How much to send for a target USD credit, itemised (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-quote)
- `GET /api/v1/billing/crypto/address`: This user's permanent deposit address for the network's chain family (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-address)
- `POST /api/v1/billing/crypto/check`: Look for this customer's payment now, and say where it stands (https://www.coritan.com/docs/api/reference/client/billing/#op-post-api-v1-billing-crypto-check)
- `GET /api/v1/billing/crypto/deposits`: Deposit history, including transfers still confirming (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits)
- `GET /api/v1/billing/crypto/deposits/{deposit_id}`: One deposit, for polling while it confirms (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-crypto-deposits-deposit-id)
# How hourly billing works
> How hourly services are charged against your credit, who can order them, and how the monthly cap limits what you pay.
Source: https://www.coritan.com/docs/billing/hourly-billing/
An *hourly* service has a price per hour instead of a monthly or yearly price. Coritan takes that price from your credit balance each hour the service runs, and stops charging for the month once you reach the *monthly cap*. There is no renewal invoice. Container Apps servers and Cloud Compute instances can be billed hourly, when their plan has an hourly price.
## Unlocking hourly billing
You can order an hourly plan once you have added at least $10.00 of credit in total, by default. Credit you add by card, PayPal, checkout page, automatic top-up or cryptocurrency all counts. Once unlocked, hourly billing stays unlocked when your balance falls again.
Until then, an hourly order is refused with `You must deposit at least $10 before using hourly billing services`. [Add credit to your balance](/docs/billing/add-credit/) to unlock it.
## What you pay
Ordering an hourly service raises a first invoice for one hour's price, plus any setup fee and the first period of each add-on ordered with it. After that, Coritan checks every hourly service once an hour:
- A Container Apps server is charged for the hour when it is running at the check. A stopped server costs nothing.
- A Cloud Compute instance is charged for every hour it exists, stopped or running, until you cancel it. Only a suspended instance costs nothing.
Each charge takes one hour's price from your credit. Hourly charges are not invoiced and do not appear on the **Transactions** tab. The service's **Billing** tab shows what it has cost this month as **Used this month**, and the API lists each charge as `Hourly charge for service #311`, with your service's number.
## The monthly cap
Each hourly service has a monthly cap: 672 hours of its hourly price by default, set when you order it. For example, a plan at `$0.0200/hr` caps at $13.44 a month. Once a service's charges for the month reach the cap, Coritan stops charging it until the 1st of the next month, when every hourly service starts again from zero. The service keeps running.
**Used this month** shows the cap beside what you have used, for example `$4.12 of $13.44 cap`.
## When your credit runs out
When your credit cannot cover the next hour, Coritan first tries an [automatic top-up](/docs/billing/automatic-top-up/), if you turned it on. If that fails or is off, Coritan suspends the service with the reason `Insufficient credit balance`.
> [!IMPORTANT]
> Adding credit does not resume a service that ran out. [Contact support](/docs/support/) after you add credit and ask for the service to be resumed. Turn on automatic top-up to avoid the suspension.
## Stopping the charges
Cancel the service on its **Billing** tab. An hourly service ends at once and its charges stop from the next hour ([Cancel a service](/docs/billing/cancel-a-service/)). Stopping a Cloud Compute instance does not stop its charges.
## Related
- [Add credit to your balance](/docs/billing/add-credit/)
- [Turn on automatic top-up](/docs/billing/automatic-top-up/)
- [Transactions and payment attempts](/docs/billing/transactions/)
## With the API
[`GET /billing/hourly-eligibility`](/docs/api/reference/client/billing/#op-get-api-v1-billing-hourly-eligibility) says whether you can order an hourly plan:
```bash
curl https://api.coritan.com/api/v1/billing/hourly-eligibility \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
{
"eligible": false,
"total_deposited": 5.0,
"minimum_required": 10.0,
"remaining": 5.0
}
```
`total_deposited` is all the credit you have added, `minimum_required` the amount that unlocks hourly billing and `remaining` what is still needed, all in US dollars.
A service's hourly figures are in `GET /services/{service_ref}`: `amount` is the hourly price, `monthly_cap` the cap, `hourly_usage_this_month` what it has cost this month and `hourly_cap_reached` whether it has hit the cap. The hourly charges themselves are in `recent_transactions` from [`GET /billing/credit`](/docs/api/reference/client/billing/#op-get-api-v1-billing-credit), which returns your last 20 credit movements ([Billing overview](/docs/billing/#with-the-api)).
## API
- `GET /api/v1/billing/hourly-eligibility`: Check hourly eligibility (https://www.coritan.com/docs/api/reference/client/billing/#op-get-api-v1-billing-hourly-eligibility)
# Change a service's plan
> Move a service to another plan of the same product, such as another billing cycle, and see what the switch costs before you apply it.
Source: https://www.coritan.com/docs/billing/change-plan/
A service's *plan* is its price and how often you pay it. Each product in the catalogue has one plan for each billing cycle it sells, such as `RX-2 (Monthly)` and `RX-2 (Annually)`, so changing plan moves a service to another billing cycle of the same product. The size, and everything that comes with it, stays the same. Coritan prices the switch for the whole days left in your current billing cycle.
To move to another size, order the new size and cancel the old service once you have moved across. [Change an instance's plan or cancel it](/docs/cloud-compute/billing/#get-a-different-size) shows how for a Cloud Compute instance.
## Before you begin
- The service must be `active`. A suspended service changes plan only after you pay its open invoice ([Failed payments and suspended services](/docs/billing/failed-payments/)).
- A switch can raise an invoice. Coritan pays it from your credit first, so [add credit](/docs/billing/add-credit/) or keep a [payment method](/docs/billing/payment-methods/) ready.
- Read the warning under [How the switch is billed](#how-the-switch-is-billed) before you move to a longer billing cycle or away from hourly billing.
## Change the plan
1. Open the service: in the sidebar, select **Services** and then the service, or open it from its product's page. Select the **Billing** tab.
2. On the **Current plan** card, select **Change plan…**.
3. In **New plan**, choose the plan you want. Each plan in the list shows its price.
4. Select **Preview**. The preview says whether the switch is an `Upgrade` or a `Downgrade`, how many days are left in this cycle, and what the switch costs today ([What the preview shows](#what-the-preview-shows)).
5. Select **Apply change**. On a Cloud Compute instance, the dashboard first checks that the host can take the new plan.
## What the preview shows
**Credit for unused time**
: The value of the whole days left on your current plan: its price divided by the days in the current billing cycle, times the days left. The day in progress counts as used.
**Charge for the new plan**
: The new plan's price for the same days, divided over the days in the new plan's billing cycle.
**Due now**
: The charge less the credit. It is below zero when the new plan costs less per day.
**Credit you receive**
: Shown for a downgrade. The part of the difference that reaches your credit balance. By default, Coritan keeps back one day, so the preview shows the number of creditable days beside it.
## How the switch is billed
Coritan bills a switch by comparing the two plans' prices for one billing cycle.
The new plan has a higher price
: Coritan raises an invoice, due at once, and pays as much of it as your credit covers. The new plan applies when the invoice is paid. The invoice is for **Due now** when that is above zero. When **Due now** is zero or less, the invoice is for the new plan's full price, with a line such as `Plan upgrade (first 30 days)`. That happens when you move to a longer billing cycle, which costs less per day, and when less than one day of the cycle is left. The preview shows such a switch as a `Downgrade`.
The new plan has the same or a lower price
: The new plan applies at once. When **Due now** is below zero, the difference goes into your credit balance, less one day by default (**Credit you receive**). When **Due now** is above zero, which happens when you move to a shorter billing cycle, Coritan raises an invoice for it that you pay yourself.
Your renewal date stays the same. From that date, each renewal invoice is for the new plan's price, and the service renews on the new plan's billing cycle.
> [!WARNING]
> Moving to a longer billing cycle, or from hourly billing to a monthly or longer plan, charges the new plan's full price now and leaves the renewal date where it was. The renewal invoice that follows, on the old date, is for the full new price as well. For an hourly service, whose renewal date has already passed, it follows within a day. [Contact support](/docs/support/conversations/) before you make such a switch.
A service you move to hourly billing is charged from your credit by the hour from then on ([How hourly billing works](/docs/billing/hourly-billing/)). It has no monthly cap: Coritan sets a cap only on a service ordered on an hourly plan.
## Result
A message confirms the change: `Plan changed.` when the new plan applies at once, or `Pay the upgrade invoice to apply the plan change` when an invoice waits for payment. [Pay the invoice](/docs/billing/invoices/) on the **Invoices** tab under **Billing**, and the new plan applies as soon as it is paid.
Once the new plan applies, the **Current plan** card shows it and the **Activity** table lists the change.
> [!IMPORTANT]
> An invoice from a plan change counts as any other unpaid invoice. If you leave it unpaid, the service is suspended one day after the invoice date by default, and later deleted ([Failed payments and suspended services](/docs/billing/failed-payments/)). Pay it, or ask [support](/docs/support/conversations/) to cancel it.
## Troubleshooting
`No other plan to switch to`
: The product has no other plan on sale, so **Change plan…** does not appear. To move to another size, order it as a new service.
`Service is not active`
: The service is suspended, still being set up, or has ended. Pay its open invoice to lift a suspension, then try again.
**Could not preview the change**
: The preview failed. The message under it gives the reason, such as `Pricing tier not found` when the plan is no longer on sale. Choose another plan.
**Could not change the plan**
: The change failed. The message under it gives the reason. `Already on this plan` means the service is on that plan now. On a Cloud Compute instance, `The host cannot apply this plan:` followed by a reason means the host refused the size, and `Could not check that the host can take the new plan. Try again in a moment.` means the check did not get an answer.
The preview shows a credit, but applying raises an invoice
: The new plan has a higher price for one billing cycle, so Coritan bills it as described under [How the switch is billed](#how-the-switch-is-billed).
You paid the invoice, but the plan did not change
: The service was suspended when the payment arrived, so the plan stayed as it was. [Contact support](/docs/support/conversations/) with the invoice number.
## Related
- [Cancel a service](/docs/billing/cancel-a-service/)
- [Pay an invoice](/docs/billing/invoices/)
- [How hourly billing works](/docs/billing/hourly-billing/)
- [Change an instance's plan or cancel it](/docs/cloud-compute/billing/)
## With the API
`service_ref` is the service ID, or the UUID of the instance, server or floating IP behind it. The plans a service can move to are the other entries in its product's `pricing` list: read `product_id` from [`GET /services/{service_ref}`](/docs/api/reference/client/services/#op-get-api-v1-services-service-ref), then read the product with [`GET /products/{product_id}`](/docs/api/reference/client/catalog/#op-get-api-v1-products-product-id). Each entry's `id` is a `new_pricing_id`.
### Preview a switch
[`GET /services/{service_ref}/upgrade-preview`](/docs/api/reference/client/services/#op-get-api-v1-services-service-ref-upgrade-preview) takes the plan as the query parameter `new_pricing_id`:
```bash
curl "https://api.coritan.com/api/v1/services/311/upgrade-preview?new_pricing_id=42" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
This service is on a $4.99 monthly plan with 15 of 30 days left, and plan `42` is the same size at $13.47 a quarter:
```json
{
"credit_amount": 2.49,
"charge_amount": 2.2,
"net_amount": -0.29,
"credit_estimate": 0.27,
"creditable_days": 14,
"days_remaining": 15,
"days_in_cycle": 30,
"change_type": "downgrade"
}
```
`credit_amount`, `charge_amount` and `net_amount` are **Credit for unused time**, **Charge for the new plan** and **Due now**. `credit_estimate` is the credit a downgrade pays out over `creditable_days`. `change_type` follows the sign of `net_amount`, so it can say `downgrade` for a switch that is billed as an upgrade, as it does here.
### Apply a switch
[`POST /services/{service_ref}/change-plan`](/docs/api/reference/client/services/#op-post-api-v1-services-service-ref-change-plan) takes `new_pricing_id` in the body:
```bash
curl -X POST https://api.coritan.com/api/v1/services/311/change-plan \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"new_pricing_id": 42}'
```
The quarterly plan has the higher price, so Coritan raised an invoice for its full price, $13.47, and the account's credit did not cover it:
```json
{
"change_type": "upgrade",
"net_amount": -0.29,
"credit_amount": 2.49,
"charge_amount": 2.2,
"credit_issued": 0.0,
"days_remaining": 15,
"invoice_id": 5120,
"status": "payment_required",
"message": "Pay the upgrade invoice to apply the plan change"
}
```
`status` is `applied` when the new plan applies now, and `payment_required` when it waits for the invoice in `invoice_id`. Read the amount owed from [`GET /billing/invoices/{invoice_id}`](/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices-invoice-id) and pay it as [Pay an invoice](/docs/billing/invoices/#with-the-api) describes. `credit_issued` is the credit a downgrade added to your balance, in US dollars.
While a plan-change invoice is open, asking again for the same plan returns that invoice. Asking for another plan with a higher price cancels it and raises a new one.
| Status | `detail` | Cause |
| --- | --- | --- |
| `400` | `Service is not active` | The service is not `active`. |
| `400` | `Already on this plan` | `new_pricing_id` is the current plan. |
| `400` | `New pricing must belong to the same product` | The plan belongs to another product. |
| `400` | `Plan changes must stay within the same hardware tier` | The plan belongs to a product on another hardware tier. |
| `404` | `Pricing tier not found` | No plan has that ID. |
| `404` | `Target product not found` | The plan's product no longer exists. |
## API
- `GET /api/v1/services/{service_ref}/upgrade-preview`: Preview plan change (https://www.coritan.com/docs/api/reference/client/services/#op-get-api-v1-services-service-ref-upgrade-preview)
- `POST /api/v1/services/{service_ref}/change-plan`: Change plan (https://www.coritan.com/docs/api/reference/client/services/#op-post-api-v1-services-service-ref-change-plan)
# Cancel a service
> Cancel a service at the end of its term or straight away, and learn what happens to its data and its unpaid invoices.
Source: https://www.coritan.com/docs/billing/cancel-a-service/
Cancelling ends a service and stops its billing. You choose when it ends: at the end of the current term, so it keeps running until the time you have paid for runs out, or immediately. Coritan does not refund unused time.
> [!CAUTION]
> When a service ends, Coritan deletes it and the data on it. You cannot restart a service once it has ended. Copy out anything you need before you cancel.
## Before you begin
- Sign in to the [dashboard](https://www.coritan.com/dashboard).
- Copy your data off the service. For a Container Apps server, you can also keep a snapshot, as the steps below show.
- Check what else uses the service, such as DNS records or proxies that point at its address. They stay on your account and stop working when the service ends.
## Cancel a service
1. Open the service's **Billing** tab. In the sidebar, select **Services** and then the service. For a Container Apps server, select **Plan and billing** on the server's **Settings** tab. A snapshot storage service opens the **Snapshots** page instead, which has no billing tab: go to `https://www.coritan.com/dashboard/services//billing`, with the number from the **Services** list.
2. On the **Cancel service** card, select **Cancel service…**. The **Cancel this service?** dialog opens and says what the product deletes when the service ends.
3. Under **When**, choose:
- **At the end of the current term** to keep the service running until the date the dialog shows. This is the default.
- **Immediately** to end it now.
An hourly service has no choice. It ends at once.
4. For a Container Apps server, leave **Take a snapshot first** ticked to keep a snapshot of the server, or clear it to keep nothing. The box also appears for a Cloud Compute instance, where it keeps nothing.
5. Type `cancel` and select **Cancel service**.
## Result
A message confirms the cancellation, and Coritan emails you about it. The **Activity** table on the **Billing** tab lists the request.
**At the end of the current term**
: The message reads `Scheduled for end-of-term termination; service remains active until then`. The **Billing** tab shows **Cancellation scheduled** with the end date, and the **Services** list shows the service as **Ending**. The service keeps working until that date, Coritan raises no more renewal invoices for it, and deletes it once the date has passed.
**Immediately**
: The message reads `Immediate termination queued`. The service's status becomes `pending_termination` while Coritan removes it, and then `terminated`. A service that was never set up, such as an order you never paid for, ends at once with `Service cancelled before provisioning`.
Either way, Coritan cancels every unpaid invoice for the service, so you do not owe them. That includes an invoice you have partly paid, and Coritan does not return the part you paid.
When you keep a snapshot, Coritan takes it at the moment you cancel, so after an end-of-term cancellation it holds the server as it was that day. It is named `Saved before cancellation` with the date, and you find it under **Snapshots** ([Take a server snapshot](/docs/managed-containers/snapshots/)).
## What ends with the service
The dialog names what each product deletes:
| Service | When it ends |
| --- | --- |
| Container Apps server | The server and its files are deleted. A snapshot you chose to keep stays under **Snapshots**. |
| Cloud Compute instance | The instance is stopped, and its disk, with every snapshot on it, is deleted ([Change an instance's plan or cancel it](/docs/cloud-compute/billing/#cancel-the-instance)). |
| Floating IP | The address goes back to the pool, and anything pointing at it stops resolving. |
| Mail Hosting and SMTP Relay | Mailboxes, aliases and stored mail are deleted. |
| Object Storage | Buckets and access keys stop working. Coritan keeps the objects for the number of days the dialog shows, and then deletes them. |
| Game proxy | The join address stops resolving. Your own server is not touched. |
## Orders you have not paid for
You do not need to cancel an order you decided against. A Container Apps server or floating IP order that is still unpaid and not set up after 48 hours, by default, is cancelled on its own, along with its invoice. Any other unpaid order stays on your account until you cancel it with **Immediately**.
## Troubleshooting
The **Cancel service** card is missing
: A cancellation is already scheduled, or the service has ended. The **Cancellation scheduled** alert shows the end date.
`Service already scheduled for end-of-term termination`
: You cancelled the service before, at the end of its term. To end it sooner, [contact support](/docs/support/conversations/).
`Service already cancelled/terminated`
: The service has ended or is being removed.
**Could not cancel the service**
: The cancellation failed. The message beside it gives the reason. Try again, or [contact support](/docs/support/conversations/).
You want to keep a service that is scheduled to end
: [Contact support](/docs/support/conversations/) before the end date. You cannot undo a cancellation yourself.
There is no `Saved before cancellation` snapshot
: Coritan skips the snapshot when the server has a recent snapshot already, and when it cannot take one. Look under **Snapshots** for the most recent snapshot of the server.
## Related
- [Change a service's plan](/docs/billing/change-plan/)
- [Pay an invoice](/docs/billing/invoices/)
- [How hourly billing works](/docs/billing/hourly-billing/)
- [Manage your services](/docs/get-started/services/)
## With the API
[`POST /services/{service_ref}/cancel`](/docs/api/reference/client/services/#op-post-api-v1-services-service-ref-cancel) cancels a service. `service_ref` is the service ID, or the UUID of the instance, server or floating IP behind it. Every field of the body is optional:
`immediate`
: `true` ends the service now. `false`, the default, ends it at the end of its term. Send `true` for an hourly service, as the dashboard does.
`keep_snapshot`
: `true`, the default, snapshots a Container Apps server before anything else happens. It has no effect on other products.
`reason`
: Your reason, recorded on the service's history.
```bash
curl -X POST https://api.coritan.com/api/v1/services/311/cancel \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"immediate": false, "keep_snapshot": true, "reason": "Moved to a larger server"}'
```
```json
{
"message": "Scheduled for end-of-term termination; service remains active until then",
"immediate": false,
"status": "active",
"termination_date": "2026-10-10T00:00:00",
"snapshot_taken": true
}
```
`status` is the service's status after the request: `active` until an end-of-term date, `pending_termination` while an immediate cancellation runs, or `terminated` for a service that was never set up. `termination_date` is when the service ends, in UTC. `snapshot_taken` says whether Coritan took the snapshot.
| Status | `detail` | Cause |
| --- | --- | --- |
| `400` | `Service already cancelled/terminated` | The service has ended or is being removed. |
| `400` | `Service already scheduled for end-of-term termination` | The service is already set to end at the end of its term. |
| `403` | `Access denied` | The service belongs to another account. |
| `404` | `Service not found` | No service has that reference. |
## API
- `POST /api/v1/services/{service_ref}/cancel`: Cancel service (https://www.coritan.com/docs/api/reference/client/services/#op-post-api-v1-services-service-ref-cancel)
# Failed payments and suspended services
> Why a payment fails, how Coritan retries it, when a service is suspended, and how to get the service running again.
Source: https://www.coritan.com/docs/billing/failed-payments/
When Coritan cannot collect an invoice, it retries the charge, then suspends the services on the invoice, and in the end deletes them. Paying the invoice in full at any point before the deletion stops this and brings the services back. [Hourly services](/docs/billing/hourly-billing/#when-your-credit-runs-out) have no renewal invoice and follow their own rule.
With the default settings, the steps fall on these days. Coritan runs each check once a day, so a step can come up to a day later than the table says.
| When | What Coritan does | The email's subject |
| --- | --- | --- |
| Up to 3 days before the due date | Raises the renewal invoice, takes what it can from your credit, and charges your default payment method for the rest. | `Your Coritan invoice INV-20260925-48213 is ready` |
| After a charge fails | Tries the charge again on its own. | `Payment failed for invoice INV-20260925-48213` |
| 1 day after the due date | Suspends the services on the invoice. | `Your services have been suspended` |
| 4 days after the due date | Reminds you. | `Urgent: update your payment method for INV-20260925-48213` |
| 3 days after the suspension | Sets a date to delete each service, at least 3 days ahead, and takes a snapshot of each Container Apps server. | `Action needed: we will delete your server on`, then the date |
| 6 days after the due date | Sends a last reminder. | `Final notice for invoice INV-20260925-48213`, then the days left |
| On the deletion date | Deletes the services and cancels their unpaid invoices. | `Your server has been deleted` |
The reminders start only after a charge has failed. When Coritan has nothing to charge, the invoice email and the emails about the deletion are the only ones you get ([No payment was attempted](#no-payment-was-attempted)).
## A payment was declined
Cause
: Your bank or PayPal refused the charge. The `Payment failed` email gives the reason after `Error:`, such as `Insufficient funds` or `Card has expired`.
Fix
: Pay the invoice now with credit or another method ([Pay an invoice](/docs/billing/invoices/)). You can also save a method that works on the **Payment methods** tab of **Billing** ([Manage payment methods](/docs/billing/payment-methods/)), and Coritan charges it at the invoice's next try.
Coritan retries a decline that can succeed later, such as `Insufficient funds` or `Card declined`: 4 hours after the first try, then at gaps that grow from a day. After a decline that cannot succeed, such as `Card has expired`, `Card reported lost` or `Bank will not honor`, it stops and starts again only when you add a payment method. The API lists every try with its reason ([Payment attempts](/docs/billing/transactions/#payment-attempts)).
When the reason is `Payment submitted, awaiting settlement`, nothing was declined. Some payment types take days to settle, and the invoice is paid once the payment clears. Do not pay it again.
## Your bank asks you to confirm a payment
Cause
: Your bank wants the cardholder to approve the charge, for example with a code, and a charge Coritan makes on its own cannot do that. The `Payment failed` email gives a reason that starts with `Customer authentication required`.
Fix
: Pay the invoice yourself: in the sidebar, select **Billing**, then the **Invoices** tab, and select **Pay** beside the invoice. When the card form reads **Confirm with your bank**, complete your bank's check ([Pay an invoice](/docs/billing/invoices/)).
## No payment was attempted
Cause
: Your account has no saved payment method and not enough credit, so Coritan has nothing to charge. The reminders about failed charges never start, so the next email after the invoice is the one that gives the deletion date.
Fix
: Pay the invoice before its due date ([Pay an invoice](/docs/billing/invoices/)). To have Coritan pay renewals for you, save a payment method on the **Payment methods** tab; Coritan charges it at the invoice's next try. When a card and a PayPal account both show `Default`, Coritan cannot choose between them, and [Manage payment methods](/docs/billing/payment-methods/#troubleshooting) explains the fix.
## A service is suspended
Cause
: An invoice for the service was still unpaid 1 day after its due date, by default. The **Suspended** box on the service's page gives the reason, such as `Unpaid invoice INV-20260925-48213`, and the server's or instance's own page shows **This server is suspended** or **This instance is suspended**. The **Suspended** filter of **Services** lists every suspended service.
Fix
: Select **Open invoices** in the **Suspended** box, or **Open Billing** in the server's or instance's alert, and pay each unpaid invoice for the service. Coritan lifts the suspension once an invoice is paid in full. A part payment, such as credit that covers only some of it, does not lift it.
A suspended service stops working: a server or instance is shut down and cannot be started, and a floating IP is detached. Coritan keeps the data until the deletion date.
A service suspended with the reason `Insufficient credit balance` is an hourly service whose credit ran out, and adding credit does not resume it. [Contact support](/docs/support/conversations/) after you add credit, as [How hourly billing works](/docs/billing/hourly-billing/#when-your-credit-runs-out) explains. For any other reason, [contact support](/docs/support/conversations/).
## The service is still suspended after you paid
The payment has not cleared
: The message after paying read `Payment submitted. The invoice updates once your bank settles it.` Coritan lifts the suspension when the payment clears. Do not pay again.
Another invoice for the service is unpaid
: Select **Billing**, then **Invoices** and **Unpaid**, and pay the rest. Any invoice for the service that is still unpaid a day after its due date suspends it again at the next daily check.
A Container Apps server is stopped
: A server comes back stopped. Open it and select **Start**. A Cloud Compute instance starts again on its own.
A floating IP is detached
: The suspension detached it. [Attach it again](/docs/floating-ips/attach-and-detach/).
None of these
: [Contact support](/docs/support/conversations/) with the invoice number.
When you pay after the reminders have started, the receipt's subject is `Payment received and services restored`.
## An email says the service will be deleted
Cause
: The service has been suspended for 3 days, by default, and its invoice is still unpaid. Coritan has set the deletion date that the email gives, at least 3 days ahead. The service's page shows **Cancellation scheduled** with that date, and **Services** marks it **Ending**. For a Container Apps server, Coritan also takes a snapshot whose name starts with `Saved before removal for non-payment`, marked **By the platform** on the **Snapshots** page.
Fix
: Pay the invoice before the date ([Pay an invoice](/docs/billing/invoices/)). Paying cancels the deletion and lifts the suspension. The **Cancellation scheduled** box asks you to contact support, but paying is enough. If a payment is still settling on the deletion date, Coritan waits a day before it deletes the service.
Once the suspension lifts, Coritan deletes its own snapshot of the server unless you locked it ([Lock, download and delete snapshots](/docs/snapshots/manage-snapshots/)).
> [!CAUTION]
> Coritan cannot bring back a deleted service. Everything on it is lost, apart from the snapshot of a Container Apps server.
## A service was deleted for non-payment
Cause
: The deletion date passed and the invoice was still unpaid. Coritan deleted the service, cancelled its unpaid invoices so that you owe nothing on them, and sent the email `Your server has been deleted`.
Fix
: Order the service again ([Order a service](/docs/get-started/order-a-service/)). For a Container Apps server, [start the new server from the snapshot](/docs/snapshots/new-server-from-a-snapshot/). The snapshot stays on your account after the deletion, and the email gives the date it expires when it has one ([How snapshot storage works](/docs/snapshots/storage-allowance/)).
## Related
- [Pay an invoice](/docs/billing/invoices/)
- [Manage payment methods](/docs/billing/payment-methods/)
- [Add credit to your balance](/docs/billing/add-credit/)
- [Turn on automatic top-up](/docs/billing/automatic-top-up/)
- [Transactions and payment attempts](/docs/billing/transactions/)
- [Manage your services](/docs/get-started/services/)
## With the API
List what you owe with [`GET /billing/invoices`](/docs/api/reference/client/billing/#op-get-api-v1-billing-invoices) and `status_filter=open`:
```bash
curl "https://api.coritan.com/api/v1/billing/invoices?status_filter=open" \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
Read a service's state with [`GET /services/{service_ref}`](/docs/api/reference/client/services/#op-get-api-v1-services-service-ref):
```bash
curl https://api.coritan.com/api/v1/services/311 \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
The answer, cut down to the fields that matter here:
```json
{
"id": 311,
"hostname": "survival-smp",
"status": "suspended",
"suspension_reason": "Unpaid invoice INV-20260925-48213",
"termination_date": "2026-10-04T03:05:00"
}
```
`status` is `suspended` while the service is suspended, `suspension_reason` says why, and `termination_date` is the deletion date once Coritan has set one.
[`GET /payments/attempts`](/docs/api/reference/client/payments/#op-get-api-v1-payments-attempts) lists your last 50 payment attempts. A declined charge has `status` `failed`, the reason in `error_message`, and `decline_type` `soft` when a retry can succeed or `hard` when it cannot ([Payment attempts](/docs/billing/transactions/#payment-attempts)). To pay, charge a saved method or use your credit, as [Pay an invoice](/docs/billing/invoices/#with-the-api) shows.
# Currencies and countries
> The currencies you can pay in, how your account's currency is chosen, and what your billing country changes.
Source: https://www.coritan.com/docs/billing/currencies-and-regions/
Coritan prices every service in US dollars, and your invoices and your credit balance are in US dollars too. You can pay in another currency: Coritan converts the US dollar amount at its current exchange rate when you pay. Your billing country decides which payment provider takes your payments.
## Your account's currency
Your account's currency is the currency Coritan charges your card or PayPal account in. It is set like this:
- When you create your account, Coritan looks up the country you are connecting from. If Coritan takes payments in that country's currency, it becomes your account's currency. Otherwise your account uses US dollars.
- If the lookup fails, your account starts in US dollars. The first time you open **Billing** or **Settings** from a country Coritan can place, it switches to that country's currency once, if Coritan takes payments in it.
- Once you choose a currency yourself, Coritan never changes it.
To choose one, change **Currency** under **Billing details** on the **Profile** tab of **Settings** ([Update your profile](/docs/account/profile/#change-your-currency-or-country)). The list shows every currency you can pay in, for example `EUR (Euro)`. Your credit balance stays in US dollars whatever you choose.
## What each payment is charged in
The dashboard shows every amount in US dollars. What your bank or PayPal charges depends on how you pay:
| Payment | Charged in |
| --- | --- |
| An invoice paid with a saved card or PayPal account | Your account's currency |
| An invoice paid with a new card, PayPal or a checkout page in the **Pay** dialog | US dollars |
| Credit you add with **Add credit** | Your account's currency |
| Automatic renewal charges and automatic top-ups | The currency the payment method was saved in. Methods saved on the **Payment methods** tab are saved in US dollars. |
| An invoice paid with account credit | Nothing is charged. Credit is already in US dollars. |
Your statement shows the converted amount, and your bank may add its own fee for a payment in a foreign currency.
## Exchange rates
Each rate is the market rate for that currency, plus any margin Coritan adds for it. Coritan updates the rates every hour by default. A payment is converted when you make it, so the same invoice can cost a slightly different amount in your currency on another day.
A currency Coritan has just added appears in the list once it has a rate.
## Your billing country
Your billing country is the country Coritan treats you as paying from. It decides which of Coritan's payment provider accounts takes a new payment, so it can change the ways to pay that you see. Charges to a card or PayPal account you have already saved do not depend on your country.
Coritan decides your billing country in this order:
1. A country you chose under **Billing details**, or that Coritan support set for you. A lookup never replaces it, so it stays put when you travel.
2. The country you are connecting from, when Coritan can tell. A country that came from a lookup follows you.
3. The country Coritan last detected for you.
4. The United States, when nothing else is known.
Your country does not change what you pay: the **Tax** line on every Coritan invoice is `$0.00`.
## With the API
### List the currencies you can pay in
[`GET /payments/currencies`](/docs/api/reference/client/payments/#op-get-api-v1-payments-currencies) returns every currency you can be charged in, with its rate:
```bash
curl https://api.coritan.com/api/v1/payments/currencies \
-H "Authorization: Bearer $CORITAN_TOKEN"
```
```json
[
{
"base_currency": "USD",
"quote_currency": "USD",
"rate": "1",
"market_rate": "1",
"upcharge_percent": "0",
"is_enabled": true,
"decimal_places": 2,
"name": "US Dollar",
"source": "base",
"fetched_at": null
},
{
"base_currency": "USD",
"quote_currency": "EUR",
"rate": "0.85411765",
"market_rate": "0.85411765",
"upcharge_percent": "0.0000",
"is_enabled": true,
"decimal_places": 2,
"name": "Euro",
"source": "frankfurter",
"fetched_at": "2026-09-25T09:15:02",
"updated_at": "2026-09-25T09:15:02"
}
]
```
`quote_currency` and `name`
: The currency's three-letter code and its name.
`rate`
: How many units of the currency Coritan charges for one US dollar. It is `market_rate` with `upcharge_percent` added on top. Rates are decimal strings.
`decimal_places`
: How many decimal places the currency has. A payment's `amount` is in the smallest unit, so `1299` is 12.99 in a currency with two places and 1,299 in one with none.
`source` and `fetched_at`
: Where the market rate came from, and when.
### List the countries
[`GET /payments/countries`](/docs/api/reference/client/payments/#op-get-api-v1-payments-countries) returns the countries you can choose, your billing country and the country Coritan detects for this request. The example is shortened to two countries:
```json
{
"selected": "GB",
"detected": "GB",
"regions": {"NA": "North America", "LATAM": "Latin America & Caribbean", "UK": "United Kingdom", "EU": "European Union & EEA", "EUROPE": "Rest of Europe", "APAC": "Asia-Pacific", "MEA": "Middle East & Africa"},
"countries": [
{"code": "IE", "name": "Ireland", "currency": "EUR", "region": "EU"},
{"code": "GB", "name": "United Kingdom", "currency": "GBP", "region": "UK"}
]
}
```
`countries` is sorted by name. Each country's `currency` is its own currency, which Coritan may not take payments in; the currency Coritan suggests falls back to US dollars then. `detected` is `null` when Coritan cannot place the request.
### Suggest a currency without signing in
[`GET /payments/geo-currency`](/docs/api/reference/client/payments/#op-get-api-v1-payments-geo-currency) needs no token. It answers with the country Coritan places the request in and the currency it would suggest:
```bash
curl https://api.coritan.com/api/v1/payments/geo-currency
```
```json
{
"country_code": "GB",
"suggested_currency": "GBP",
"base_currency": "USD",
"client_ip": "203.0.113.24"
}
```
`client_ip` is the address Coritan saw the request come from.
### Read or change your currency and country
[`GET /payments/preference`](/docs/api/reference/client/payments/#op-get-api-v1-payments-preference) returns your currency and country:
```json
{
"preferred_payment_currency": "GBP",
"base_currency": "USD",
"credit_currency": "USD",
"auto_pay_enabled": true,
"country_code": "GB",
"currency_source": "geo",
"country_source": "geo",
"billing_country": "GB",
"suggested_currency": "GBP"
}
```
`preferred_payment_currency`
: Your account's currency.
`country_code` and `billing_country`
: The country saved on your account (or `null`), and the billing country Coritan uses.
`currency_source` and `country_source`
: How each was set: `default`, `geo` (from your location), `user` (you chose it) or `admin` (Coritan support set it).
`suggested_currency`
: The currency Coritan would pick for your billing country.
Reading your preference fills in your country and currency from your location in the same way as opening **Billing**. It never replaces a choice you made.
Change them with [`PATCH /payments/preference`](/docs/api/reference/client/payments/#op-patch-api-v1-payments-preference). Send `currency`, `country_code` or both. Either counts as your own choice, so a later lookup leaves it alone:
```bash
curl -X PATCH https://api.coritan.com/api/v1/payments/preference \
-H "Authorization: Bearer $CORITAN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"currency": "EUR", "country_code": "IE"}'
```
```json
{
"preferred_payment_currency": "EUR",
"base_currency": "USD",
"auto_pay_enabled": true,
"country_code": "IE",
"country_source": "user",
"currency_source": "user",
"message": "Payment preference updated"
}
```
It answers `400` with `Currency TRY is not enabled` for a currency Coritan does not take, and `400` with `Unknown country` for a code it does not know. The same endpoint turns auto-pay on and off ([Manage payment methods](/docs/billing/payment-methods/#with-the-api)).
## API
- `GET /api/v1/payments/currencies`: Payment currencies a customer can actually be charged in (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-currencies)
- `GET /api/v1/payments/countries`: Countries a customer can bill from, with the one we think they are in (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-countries)
- `GET /api/v1/payments/geo-currency`: Unauthenticated country → suggested pay currency (clamped to enabled) (https://www.coritan.com/docs/api/reference/client/payments/#op-get-api-v1-payments-geo-currency)