Reissue an invoice in EUR
POST /api/v2/billing/invoices/{id}/actions/reissue-in-currency
Switch the account to EUR and replace its open renewal invoices with EUR invoices for the same periods. The new invoices can be paid by SEPA bank transfer. This is for customers outside Sweden with SEK invoices. Check actions.canReissueInCurrency on GET /api/v2/billing/invoices/{id} first. Send dryRun: true first to see every open invoice the switch affects and any blockers. Nothing changes on a dry run. The real call goes through only when every open invoice can be reissued and no order is pending. It changes the account currency for all future invoices. When the account is not in EUR yet, it uses one of the account’s monthly currency changes (changeQuota). Each original invoice is cancelled and replaced at once. The response lists each cancelled invoice with its replacement.
Authentication: An API key with the scopes write:billing and write:account. About keys and scopes
Request
Path parameters
idstringrequiredGET /api/v2/billing/invoices (inv_…).Body
currencyCodestringrequiredEUR, the currency SEPA bank transfer uses. One of EUR.dryRunbooleanExample
curl -X POST "https://cloud.hostup.se/api/v2/billing/invoices/inv_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/reissue-in-currency" \ -H "Authorization: Bearer $HOSTUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "currencyCode": "EUR", "dryRun": true }'curl -X POST "https://cloud.hostup.se/api/v2/billing/invoices/inv_01hxa3b4c5d6e7f8g9h0j1k2m3/actions/reissue-in-currency" \ -H "Authorization: Bearer $HOSTUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "currencyCode": "EUR" }'Responses
200 With dryRun: true: the plan. Otherwise: each cancelled invoice with its EUR replacement.
{ "currencyCode": "EUR", "exchangeRate": 0.1, "allowed": true, "blockers": [], "changeQuota": { "remaining": 2, "resetAt": "2026-10-01T00:00:00.000Z" }, "invoices": [ { "id": "inv_01hxa3b4c5d6e7f8g9h0j1k2m3", "number": "202681499", "amount": 708, "currencyCode": "SEK", "dueAt": "2026-09-10T00:00:00.000Z", "expectedAmount": 70.8, "expectedCurrencyCode": "EUR", "expectedDueAt": "2026-09-17T00:00:00.000Z", "actions": { "canReissueInCurrency": { "allowed": true, "reason": null, "code": null } } } ]}{ "currencyCode": "EUR", "changedCurrency": true, "invoices": [ { "cancelledInvoice": { "id": "inv_01hxa3b4c5d6e7f8g9h0j1k2m3", "number": "202681499" }, "cancelled": true, "replacementInvoice": { "id": "inv_01hxa3b4c5d6e7f8g9h0j1k2m4", "number": "202681620", "amount": 70.8, "currencyCode": "EUR", "dueAt": "2026-09-17T00:00:00.000Z", "status": "unpaid", "paymentUrl": "/billing?invoice=202681620" }, "status": "reissued", "reason": null } ]}Response fields
currencyCodestringexchangeRatenumber or nullexpectedAmount. The replacement is priced from the product’s EUR price. Its amount can differ.allowedbooleanblockersarray of objectinvoiceIdstring or nullinvoiceNumberstring or nullcodestringaccount_country_not_eligible, invoice_not_unpaid, invoice_already_in_currency, invoice_partially_settled, invoice_peppol_delivered, invoice_order_backed, invoice_add_funds, invoice_usage_not_reissuable, invoice_domain_renewal, invoice_not_service_renewal, invoice_multiple_services, renewal_period_ended, currency_not_supported, pending_orders, rate_limited.reasonstringchangeQuotaobjectremainingintegerresetAtstringinvoicesarray of objectidstringnumberstring or nullamountnumbercurrencyCodestringdueAtstring or nullexpectedAmountnumber or nullexpectedCurrencyCodestringexpectedDueAtstring or nullactionsobjectcanReissueInCurrencyobjectallowedbooleanreasonstring or nullcodestring or nullErrors
Errors are Problem Details with a stable code. Branch on the code, not on the text.
| 400 | Invalid body. currencyCode must be EUR and dryRun a boolean. Other fields are rejected. |
| 401 | Unauthorized. Authentication is required. |
| 403 | delegated_access_forbidden: a user with delegated access cannot change the account currency. |
| 404 | Not found. The resource does not exist or is not owned by the caller; code is invoice_not_found. |
| 409 | Blocked. invoice_reissue_blocked: an open invoice cannot be reissued. detail gives the first reason. Send dryRun: true to see every blocker. pending_orders: finish or cancel the open orders first. |
| 429 | rate_limited: the account has used its currency changes for this month. Retry-After gives the wait in seconds when known. |
| 500 | Internal error. Retry later or contact support if the issue persists. |
| 502 | upstream_failed: the currency settings or the currency change failed. Nothing changed. upstream_renewal_regeneration_failed: the account currency changed but at least one invoice was not replaced. detail says for each invoice whether the original was cancelled or is still payable by card. A cancelled original has nothing to pay until Hostup issues the replacement. |