## GET /api/v2/billing/invoices

**List invoices**

Return invoices for the account. Use `status=unpaid` when building pay-now flows and follow `nextCursor` for additional pages. Invoice amounts live under `totals`; payment availability lives under server-owned `paymentMethods` gates. Do not infer payability, bulk-payment eligibility, or consolidated-renewal status from line-item counts.

### Related Endpoints

- `GET /api/v2/billing/invoices/{id}`: Get invoice details
- `GET /api/v2/billing/invoices/{id}/pdf`: Get invoice PDF
- `GET /api/v2/billing/invoices/{id}/email-info`: Get invoice email info

### Headers

- `Accept`: application/json
- `Authorization`: Bearer YOUR_API_KEY
- Required API scope: `read:billing`

### Parameters

- `limit` (query, integer) [min: 1, max: 100]: Maximum invoices to return in this page.
- `cursor` (query, string): Opaque cursor from `nextCursor` for the next page.
- `status` (query, string): Filter invoices by normalized status. Use `unpaid` for pay-now flows or `overdue` for invoices past their due date.
  Allowed values: draft, unpaid, overdue, paid, partially_paid, cancelled, refunded

### Request Example

```bash
curl -X GET "https://cloud.hostup.se/api/v2/billing/invoices" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
```

### Response Schema

- `data` (array<object>, optional)
- `data[].id` (string, required) Example: `inv_01hxa3b4c5d6e7f8g9h0j1k2m3`
- `data[].orderId` (string, optional): Public order ID when the invoice is attached to an order. Domain renewal invoices with an uncancelled order must cancel this order first. Example: `ord_01hxa3b4c5d6e7f8g9h0j1k2m3`
- `data[].number` (string, required): Customer-facing invoice number. Example: `202600001`
- `data[].status` (string, required) Example: `unpaid`
  Allowed values: draft, unpaid, partially_paid, paid, cancelled, refunded
- `data[].dates` (object, required)
- `data[].dates.issuedAt` (string, optional) Example: `2026-04-27T12:00:00.000Z`
- `data[].dates.dueAt` (string, optional) Example: `2026-05-11T23:59:59.000Z`
- `data[].dates.paidAt` (string, optional) Example: `2026-04-27T12:10:00.000Z`
- `data[].totals` (object, required)
- `data[].totals.currencyCode` (string, required) Example: `SEK`
- `data[].totals.subtotal` (number, required) Example: `127.2`
- `data[].totals.taxAmount` (number, required) Example: `31.8`
- `data[].totals.taxRateDecimal` (number, optional) Example: `0.25`
- `data[].totals.creditApplied` (number, required) Example: `0`
- `data[].totals.total` (number, required) Example: `159`
- `data[].totals.amountPaid` (number, required) Example: `0`
- `data[].totals.outstanding` (number, required) Example: `159`
- `data[].lineItemCount` (integer, optional) Example: `1`
- `data[].lineItems` (array<object>, optional)
- `data[].payments` (array<object>, optional)
- `data[].payments[].method` (string,null, required): Canonical payment method enum. Display labels and upstream gateway names never appear here; use `methodLabel` for text. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay, paypal, invoice, other, 
- `data[].payments[].methodLabel` (string,null, required): Human-readable payment method label for display. Example: `Card`
- `data[].payments[].amount` (number, required) Example: `98.75`
- `data[].payments[].currencyCode` (string, required): ISO-4217 currency for `amount`. Example: `SEK`
- `data[].note` (string, optional) Example: `Thank you for your order.`
- `data[].actions` (object, required)
- `data[].actions.canPay` (object, required)
- `data[].actions.canPay.allowed` (boolean, required) Example: `true`
- `data[].actions.canPay.reason` (string,null, required) Example: `null`
- `data[].actions.canPay.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].actions.canGeneratePaymentLink` (object, required)
- `data[].actions.canGeneratePaymentLink.allowed` (boolean, required) Example: `true`
- `data[].actions.canGeneratePaymentLink.reason` (string,null, required) Example: `null`
- `data[].actions.canGeneratePaymentLink.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].actions.canBulkPay` (object, required)
- `data[].actions.canBulkPay.allowed` (boolean, required) Example: `true`
- `data[].actions.canBulkPay.reason` (string,null, required) Example: `null`
- `data[].actions.canBulkPay.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].actions.canCancel` (object, required)
- `data[].actions.canCancel.allowed` (boolean, required) Example: `true`
- `data[].actions.canCancel.reason` (string,null, required) Example: `null`
- `data[].actions.canCancel.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].actions.canEmail` (object, required)
- `data[].actions.canEmail.allowed` (boolean, required) Example: `true`
- `data[].actions.canEmail.reason` (string,null, required) Example: `null`
- `data[].actions.canEmail.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].actions.canDownload` (object, required)
- `data[].actions.canDownload.allowed` (boolean, required) Example: `true`
- `data[].actions.canDownload.reason` (string,null, required) Example: `null`
- `data[].actions.canDownload.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `data[].paymentMethods` (object, required): Per-method payment availability. Keys include `card`, `accountCredit`, `swish`, `bankgiro`, `sepa`, and `alipay`. Check these server-owned gates before starting a payment flow.
- `data[].paymentMethods.card` (object, required)
- `data[].paymentMethods.card.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.card.label` (string, required) Example: `Card`
- `data[].paymentMethods.card.available` (boolean, required) Example: `true`
- `data[].paymentMethods.card.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.card.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.card.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.card.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.card.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.card.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.card.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.card.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.card.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.card.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.card.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.card.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.card.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.card.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.card.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.card.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.card.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.card.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.accountCredit` (object, required)
- `data[].paymentMethods.accountCredit.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.accountCredit.label` (string, required) Example: `Card`
- `data[].paymentMethods.accountCredit.available` (boolean, required) Example: `true`
- `data[].paymentMethods.accountCredit.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.accountCredit.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.accountCredit.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.accountCredit.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.accountCredit.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.accountCredit.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.accountCredit.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.accountCredit.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.accountCredit.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.accountCredit.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.accountCredit.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.accountCredit.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.accountCredit.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.accountCredit.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.accountCredit.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.accountCredit.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.accountCredit.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.accountCredit.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.swish` (object, required)
- `data[].paymentMethods.swish.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.swish.label` (string, required) Example: `Card`
- `data[].paymentMethods.swish.available` (boolean, required) Example: `true`
- `data[].paymentMethods.swish.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.swish.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.swish.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.swish.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.swish.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.swish.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.swish.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.swish.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.swish.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.swish.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.swish.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.swish.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.swish.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.swish.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.swish.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.swish.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.swish.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.swish.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.bankgiro` (object, required)
- `data[].paymentMethods.bankgiro.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.bankgiro.label` (string, required) Example: `Card`
- `data[].paymentMethods.bankgiro.available` (boolean, required) Example: `true`
- `data[].paymentMethods.bankgiro.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.bankgiro.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.bankgiro.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.bankgiro.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.bankgiro.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.bankgiro.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.bankgiro.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.bankgiro.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.bankgiro.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.bankgiro.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.bankgiro.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.bankgiro.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.bankgiro.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.bankgiro.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.bankgiro.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.bankgiro.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.bankgiro.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.bankgiro.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.sepa` (object, required)
- `data[].paymentMethods.sepa.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.sepa.label` (string, required) Example: `Card`
- `data[].paymentMethods.sepa.available` (boolean, required) Example: `true`
- `data[].paymentMethods.sepa.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.sepa.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.sepa.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.sepa.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.sepa.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.sepa.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.sepa.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.sepa.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.sepa.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.sepa.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.sepa.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.sepa.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.sepa.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.sepa.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.sepa.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.sepa.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.sepa.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.sepa.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.alipay` (object, required)
- `data[].paymentMethods.alipay.method` (string, required): Canonical v2 payment method. Card-backed hosted checkout and wallet flows are represented as `card`; provider names are not public v2 method values. Example: `card`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `data[].paymentMethods.alipay.label` (string, required) Example: `Card`
- `data[].paymentMethods.alipay.available` (boolean, required) Example: `true`
- `data[].paymentMethods.alipay.reason` (string,null, required): Human-readable blocker when `available` is false. Example: `null`
- `data[].paymentMethods.alipay.checkoutMode` (string,null, required): Hosted checkout mode used by the existing payment session endpoint, or null for methods handled without hosted checkout. Example: `payment`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `data[].paymentMethods.alipay.requirements` (object, required): Machine-readable requirements for the payment method. Examples: card minimum amount, Swish/Bankgiro Swedish account requirement, SEPA bank transfer EUR requirement, account-credit balance limit.
- `data[].paymentMethods.alipay.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.alipay.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `data[].paymentMethods.alipay.requirements.accountCountryCode` (string, optional) Example: `SE`
- `data[].paymentMethods.alipay.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `data[].paymentMethods.alipay.requirements.availableBalance` (object, optional)
- `data[].paymentMethods.alipay.requirements.availableBalance.amount` (number, required) Example: `100`
- `data[].paymentMethods.alipay.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.alipay.requirements.minimumAmount` (object, optional)
- `data[].paymentMethods.alipay.requirements.minimumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.alipay.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.alipay.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentMethods.alipay.requirements.maximumAmount` (object, optional)
- `data[].paymentMethods.alipay.requirements.maximumAmount.amount` (number, required) Example: `3`
- `data[].paymentMethods.alipay.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `data[].paymentMethods.alipay.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `data[].paymentLinkGeneratorUrl` (string,null, required) Example: `/api/v2/billing/invoices/inv_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/generate-payment-link`
- `data[].isBulkPaymentChild` (boolean, required) Example: `false`
- `data[].bulkPaymentParentId` (string,null, required) Example: `null`
- `data[].coversInvoiceIds` (array<string>, optional) Example: `["inv_01hxa3b4c5d6e7f8g9h0j1k2m3"]`
- `data[].renewalInvoicing` (object, optional): Present only when the invoice detail route can evaluate the same renewal invoicing preference logic used by invoice emails.
- `data[].renewalInvoicing.preference` (string, required) Example: `consolidated`
  Allowed values: consolidated, separate
- `data[].renewalInvoicing.generatedByAutomation` (boolean, required): True when the invoice was generated by the renewal automation path that also shows the invoice-email preference note. Example: `true`
- `data[].renewalInvoicing.isConsolidated` (boolean, required): True only when this is an automated renewal invoice and the account preference was consolidated at generation time. Do not infer this from line-item count. Example: `true`
- `data[].renewalInvoicing.label` (string, required) Example: `Consolidated renewal invoice`
- `data[].renewalInvoicing.settingsUrl` (string, required) Example: `/account`
- `hasMore` (boolean, optional) Example: `false`
- `nextCursor` (string,null, optional) Example: `null`

### Responses

#### 200 - Cursor-paginated list.
```json
{
  "data": [
    {
      "id": "inv_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "number": "202600001",
      "status": "paid",
      "dates": {
        "issuedAt": "2026-04-27T12:00:00.000Z",
        "dueAt": "2026-05-11T23:59:59.000Z",
        "paidAt": "2026-04-27T12:34:56.000Z"
      },
      "totals": {
        "currencyCode": "SEK",
        "subtotal": 199,
        "taxAmount": 49.75,
        "taxRateDecimal": 0.25,
        "creditApplied": 0,
        "total": 248.75,
        "amountPaid": 248.75,
        "outstanding": 0
      },
      "actions": {
        "canPay": {
          "allowed": false,
          "reason": "Invoice is already paid."
        },
        "canGeneratePaymentLink": {
          "allowed": false,
          "reason": "Invoice is already paid."
        },
        "canBulkPay": {
          "allowed": false,
          "reason": "Invoice is already paid."
        },
        "canCancel": {
          "allowed": false,
          "reason": "Only unpaid invoices can be cancelled."
        },
        "canEmail": {
          "allowed": true,
          "reason": null
        },
        "canDownload": {
          "allowed": true,
          "reason": null
        }
      },
      "paymentMethods": {
        "card": {
          "method": "card",
          "label": "Card",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": "payment",
          "requirements": {
            "minimumAmount": {
              "amount": 3,
              "currencyCode": "SEK",
              "comparison": "greater_than"
            }
          }
        },
        "accountCredit": {
          "method": "accountCredit",
          "label": "Account credit",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": null,
          "requirements": {
            "invoiceCurrencyCode": "SEK",
            "accountCurrencyCode": "SEK",
            "availableBalance": {
              "amount": 0,
              "currencyCode": "SEK"
            },
            "maximumAmount": {
              "amount": 0,
              "currencyCode": "SEK",
              "comparison": "less_than_or_equal"
            }
          }
        },
        "swish": {
          "method": "swish",
          "label": "Swish",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": null,
          "requirements": {
            "invoiceCurrencyCode": "SEK",
            "accountCountryCode": "SE"
          }
        },
        "bankgiro": {
          "method": "bankgiro",
          "label": "Bankgiro",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": null,
          "requirements": {
            "invoiceCurrencyCode": "SEK",
            "accountCountryCode": "SE"
          }
        },
        "sepa": {
          "method": "sepa",
          "label": "SEPA bank transfer",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": "sepa_bank_transfer_payment",
          "requirements": {
            "invoiceCurrencyCode": "EUR"
          }
        },
        "alipay": {
          "method": "alipay",
          "label": "Alipay",
          "available": false,
          "reason": "Invoice is already paid.",
          "checkoutMode": "alipay_payment",
          "requirements": {
            "invoiceCurrencyCodes": [
              "EUR",
              "USD"
            ]
          }
        }
      },
      "paymentLinkGeneratorUrl": null,
      "isBulkPaymentChild": false,
      "bulkPaymentParentId": null
    }
  ],
  "hasMore": false,
  "nextCursor": null
}
```

#### 400 - Invalid request. The response body is an RFC 7807 Problem Details document.
```json
{
  "type": "https://developer.hostup.se/errors/invalid_request",
  "title": "Invalid request",
  "status": 400,
  "detail": "The request body failed validation.",
  "code": "invalid_request",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z",
  "errors": [
    {
      "pointer": "/items/0/domainName",
      "detail": "`domainName` is required.",
      "code": "invalid_request"
    }
  ]
}
```

#### 401 - Unauthorized. Authentication is required.
```json
{
  "type": "https://developer.hostup.se/errors/unauthorized",
  "title": "Unauthorized",
  "status": 401,
  "detail": "Authentication is required.",
  "code": "unauthorized",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 403 - Forbidden. The caller lacks a required scope or does not own the resource.
```json
{
  "type": "https://developer.hostup.se/errors/forbidden",
  "title": "Forbidden",
  "status": 403,
  "detail": "The caller lacks a required scope or does not own the resource.",
  "code": "forbidden",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 404 - Not found. The resource does not exist or is not owned by the caller.
```json
{
  "type": "https://developer.hostup.se/errors/not_found",
  "title": "Not found",
  "status": 404,
  "detail": "The requested resource could not be found.",
  "code": "not_found",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 429 - Rate limited. Retry after the limit resets. 429 responses include `Retry-After` seconds plus `X-RateLimit-*` headers.
```json
{
  "type": "https://developer.hostup.se/errors/rate_limit_exceeded",
  "title": "Too many requests",
  "status": 429,
  "detail": "Too many requests. Retry after the limit resets.",
  "code": "rate_limit_exceeded",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```

#### 500 - Internal error. Retry later or contact support if the issue persists.
```json
{
  "type": "https://developer.hostup.se/errors/internal_error",
  "title": "Internal server error",
  "status": 500,
  "detail": "An unexpected error occurred. Retry later or contact support if the issue persists.",
  "code": "internal_error",
  "instance": "/api/v2/resource",
  "requestId": "req_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "timestamp": "2026-04-27T12:34:56.000Z"
}
```
