## GET /api/v2/billing/payment-methods

**List billing payment methods**

Return saved card payment methods, card auto-charge settings, billing notification contacts, and account-level invoice payment rules. For a specific invoice, prefer that invoice's `paymentMethods` block because it includes invoice status, outstanding amount, currency, card minimum, account-credit balance, Swish/Bankgiro country rules, and EUR SEPA eligibility.

### Related Endpoints

- `GET /api/v2/billing/payment-methods/contacts`: List invoice CC recipients
- `POST /api/v2/billing/payment-methods/contacts`: Add invoice CC recipient
- `DELETE /api/v2/billing/payment-methods/contacts`: Remove invoice CC recipient

### Headers

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

### Request Example

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

### Response Schema

- `methods` (array<object>, optional): Saved card payment methods. For invoice-specific availability, read `invoicePaymentMethodRules` here or `paymentMethods` on a concrete invoice.
- `methods[].id` (string, required): Public saved-card ID. Use this as `savedCardId` for card-only invoice payment actions. Example: `card_01hxa3b4c5d6e7f8g9h0j1k2m3`
- `methods[].brand` (string, required) Example: `visa`
- `methods[].last4` (string,null, required) Example: `4242`
- `methods[].expMonth` (number,null, required) Example: `12`
- `methods[].expYear` (number,null, required) Example: `2028`
- `methods[].cardholderName` (string,null, required) Example: `null`
- `methods[].isPrimary` (boolean, required) Example: `true`
- `methods[].addedAt` (string,null, required) Example: `2026-04-27T12:00:00.000Z`
- `hasPrimaryMethod` (boolean, optional) Example: `true`
- `billing` (object, optional)
- `billing.cardAutoCharge` (object, required)
- `billing.cardAutoCharge.enabled` (boolean, required): Effective enabled state. False when configured is true but no saved card is available. Example: `true`
- `billing.cardAutoCharge.method` (string, required) Example: `card`
  Allowed values: card
- `billing.cardAutoCharge.status` (string, required): `active` means automatic saved-card charging is ready. `needs_payment_method` means the preference is on but no saved card exists. `disabled` means the preference is off. Example: `active`
  Allowed values: active, needs_payment_method, disabled
- `billing.cardAutoCharge.configured` (boolean, required): Saved preference. If true but no saved card exists, `enabled` is false and `status` is `needs_payment_method`. Example: `true`
- `billing.cardAutoCharge.hasPaymentMethod` (boolean, required): True when the account has a saved card that can be used for auto-charge. Example: `true`
- `billing.cardAutoCharge.label` (string, required) Example: `Card auto-charge`
- `billing.cardAutoCharge.description` (string, required) Example: `Automatically charge the saved card when invoices are due.`
- `billing.cardAutoCharge.reason` (string,null, required) Example: `null`
- `billing.cardAutoCharge.actions` (object, required)
- `billing.cardAutoCharge.actions.canToggle` (object, required)
- `billing.cardAutoCharge.actions.canToggle.allowed` (boolean, required) Example: `true`
- `billing.cardAutoCharge.actions.canToggle.reason` (string,null, required) Example: `null`
- `billing.cardAutoCharge.actions.canToggle.code` (string,null, optional): Machine-readable reason code when an action is blocked. Example: `pending_order`
- `billingContacts` (array<object>, optional)
- `billingContacts[].id` (string, required): Billing notification contact ID. Get it from `GET /api/v2/billing/payment-methods/contacts` before deleting. Example: `42`
- `billingContacts[].email` (string, required) Example: `invoices@example.com`
- `billingContacts[].description` (string,null, required) Example: `Accounts payable`
- `invoicePaymentMethodRules` (object, optional)
- `invoicePaymentMethodRules.card` (object, required)
- `invoicePaymentMethodRules.card.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.card.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.card.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.card.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.card.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.card.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.card.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.card.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.card.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.card.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.card.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.card.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.card.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.card.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.card.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.card.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.card.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.card.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.card.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.card.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.accountCredit` (object, required)
- `invoicePaymentMethodRules.accountCredit.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.accountCredit.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.accountCredit.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.accountCredit.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.accountCredit.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.accountCredit.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.accountCredit.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.accountCredit.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.accountCredit.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.accountCredit.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.accountCredit.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.accountCredit.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.accountCredit.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.accountCredit.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.accountCredit.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.accountCredit.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.accountCredit.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.accountCredit.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.accountCredit.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.accountCredit.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.swish` (object, required)
- `invoicePaymentMethodRules.swish.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.swish.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.swish.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.swish.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.swish.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.swish.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.swish.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.swish.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.swish.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.swish.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.swish.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.swish.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.swish.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.swish.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.swish.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.swish.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.swish.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.swish.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.swish.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.swish.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.bankgiro` (object, required)
- `invoicePaymentMethodRules.bankgiro.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.bankgiro.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.bankgiro.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.bankgiro.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.bankgiro.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.bankgiro.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.bankgiro.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.bankgiro.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.bankgiro.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.bankgiro.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.bankgiro.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.bankgiro.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.bankgiro.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.bankgiro.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.bankgiro.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.bankgiro.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.bankgiro.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.bankgiro.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.bankgiro.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.bankgiro.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.sepa` (object, required)
- `invoicePaymentMethodRules.sepa.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.sepa.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.sepa.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.sepa.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.sepa.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.sepa.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.sepa.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.sepa.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.sepa.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.sepa.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.sepa.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.sepa.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.sepa.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.sepa.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.sepa.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.sepa.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.sepa.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.sepa.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.sepa.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.sepa.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.alipay` (object, required)
- `invoicePaymentMethodRules.alipay.method` (string, required) Example: `bankgiro`
  Allowed values: card, accountCredit, swish, bankgiro, sepa, alipay
- `invoicePaymentMethodRules.alipay.label` (string, required) Example: `Bankgiro`
- `invoicePaymentMethodRules.alipay.availableForAccount` (boolean, required): Account-level availability only. Check a concrete invoice's `paymentMethods` for final status, amount, and currency gates. Example: `true`
- `invoicePaymentMethodRules.alipay.reason` (string,null, required) Example: `null`
- `invoicePaymentMethodRules.alipay.checkoutMode` (string,null, required) Example: `null`
  Allowed values: payment, sepa_bank_transfer_payment, alipay_payment, 
- `invoicePaymentMethodRules.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.
- `invoicePaymentMethodRules.alipay.requirements.invoiceCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.alipay.requirements.invoiceCurrencyCodes` (array<string>, optional) Example: `["EUR","USD"]`
- `invoicePaymentMethodRules.alipay.requirements.accountCountryCode` (string, optional) Example: `SE`
- `invoicePaymentMethodRules.alipay.requirements.accountCurrencyCode` (string, optional) Example: `SEK`
- `invoicePaymentMethodRules.alipay.requirements.availableBalance` (object, optional)
- `invoicePaymentMethodRules.alipay.requirements.availableBalance.amount` (number, required) Example: `100`
- `invoicePaymentMethodRules.alipay.requirements.availableBalance.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.alipay.requirements.minimumAmount` (object, optional)
- `invoicePaymentMethodRules.alipay.requirements.minimumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.alipay.requirements.minimumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.alipay.requirements.minimumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal
- `invoicePaymentMethodRules.alipay.requirements.maximumAmount` (object, optional)
- `invoicePaymentMethodRules.alipay.requirements.maximumAmount.amount` (number, required) Example: `3`
- `invoicePaymentMethodRules.alipay.requirements.maximumAmount.currencyCode` (string, required) Example: `SEK`
- `invoicePaymentMethodRules.alipay.requirements.maximumAmount.comparison` (string, required) Example: `greater_than`
  Allowed values: greater_than, less_than_or_equal

### Responses

#### 200 - Payment methods and account-level payment rules.
```json
{
  "methods": [
    {
      "id": "card_01hxa3b4c5d6e7f8g9h0j1k2m3",
      "brand": "visa",
      "last4": "5566",
      "expMonth": 4,
      "expYear": 2027,
      "cardholderName": "Example Customer",
      "isPrimary": true,
      "addedAt": "2026-04-27T12:34:56.000Z"
    }
  ],
  "hasPrimaryMethod": true,
  "billing": {
    "cardAutoCharge": {
      "enabled": true,
      "method": "card",
      "status": "active",
      "configured": true,
      "hasPaymentMethod": true,
      "label": "Card auto-charge",
      "description": "Automatically charge the saved card when invoices are due.",
      "reason": null,
      "actions": {
        "canToggle": {
          "allowed": true,
          "reason": null
        }
      }
    }
  },
  "billingContacts": [
    {
      "id": "111",
      "email": "invoices@example.com",
      "description": null
    }
  ],
  "invoicePaymentMethodRules": {
    "card": {
      "method": "card",
      "label": "Card",
      "availableForAccount": true,
      "reason": null,
      "checkoutMode": "payment",
      "requirements": {}
    },
    "accountCredit": {
      "method": "accountCredit",
      "label": "Account credit",
      "availableForAccount": false,
      "reason": "No account credit is available.",
      "checkoutMode": null,
      "requirements": {
        "invoiceCurrencyCode": "SEK",
        "accountCurrencyCode": "SEK",
        "availableBalance": {
          "amount": 0,
          "currencyCode": "SEK"
        }
      }
    },
    "swish": {
      "method": "swish",
      "label": "Swish",
      "availableForAccount": false,
      "reason": "Swish requires a Swedish billing account and a SEK invoice.",
      "checkoutMode": null,
      "requirements": {
        "invoiceCurrencyCode": "SEK",
        "accountCountryCode": "SE"
      }
    },
    "bankgiro": {
      "method": "bankgiro",
      "label": "Bankgiro",
      "availableForAccount": false,
      "reason": "Bankgiro is only available for Swedish billing accounts with SEK invoices.",
      "checkoutMode": null,
      "requirements": {
        "invoiceCurrencyCode": "SEK",
        "accountCountryCode": "SE"
      }
    },
    "sepa": {
      "method": "sepa",
      "label": "SEPA bank transfer",
      "availableForAccount": true,
      "reason": null,
      "checkoutMode": "sepa_bank_transfer_payment",
      "requirements": {
        "invoiceCurrencyCode": "EUR"
      }
    },
    "alipay": {
      "method": "alipay",
      "label": "Alipay",
      "availableForAccount": true,
      "reason": null,
      "checkoutMode": "alipay_payment",
      "requirements": {
        "invoiceCurrencyCodes": [
          "EUR",
          "USD"
        ]
      }
    }
  }
}
```

#### 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"
}
```
