Upgrading
Step-by-step instructions for moving an integration from one API revision to the next.
Upgrading is a code change on your side followed by one header change. Nothing you receive changes
until you send the new Api-Revision value. The two steps are independent. Write the code, deploy
it, and set the header when you are ready.
Each section below is one hop between revisions. Start at the revision you send today and work
forward. If you send no Api-Revision header, you are on the oldest supported revision. You move off it on
the day that revision retires. Set the header as soon as you know which revision you want. Every
response tells you which one produced it:
Api-Revision: 2026-08-21.aukSee Versioning for the revision list, the support window, and how the header is resolved.
Moving to 2026-09-01.bullfinch
Nearly all of this hop is one change: every monetary amount is an integer in minor currency units. The major-unit field beside it is gone. The rest is a binding period that carries a unit, and one endpoint that returned nothing new.
Every field named here is already served on 2026-08-21.auk, so you can make all of these changes
and verify them before you touch the header.
Read every amount from its minor-unit field
A minor unit is the smallest unit of the currency — cents for
USD, öre forSEK— so$136.07is13607. Thecurrencyfield sits on the same object and tells you which currency to divide by.// 2026-08-21.auk { "subtotal": 125.99, "taxAmount": 10.08, "total": 136.07, "currency": "USD" } // 2026-09-01.bullfinch { "subtotalMinor": 12599, "taxAmountMinor": 1008, "totalMinor": 13607, "currency": "USD" }Change the type in your own model while you are there. An integer count of minor units is exact. A decimal amount that you parse into a binary float is not, and that is the reason for the change. Do not store the new value in a float.
The change inventory below has the complete list. Amounts appear in three places:
- Order pricing:
subtotal,taxAmountandtotal, on the summary and again underrecurringCostsandinitialInvoice. - Line item pricing:
totalDiscounts,recurringAmountandinitialInvoiceAmount. - Each discount and each tax breakdown entry:
amount.
Each of these has a
*Minortwin with the same meaning.- Order pricing:
Catalog prices and ILD balances
Three amounts outside order pricing move the same way:
Price.netPricebecomesnetPriceMinor.Price.currencyOptionsbecomescurrencyOptionsMinor.UsageVoiceIldPackage.balancebecomesbalanceMinor.
currencyOptionsMinorkeeps the shape it had — a map from ISO currency code to the price in that currency — with integer values:// 2026-08-21.auk { "netPrice": 29.99, "currencyOptions": { "SEK": 329.0, "EUR": 27.5 } } // 2026-09-01.bullfinch { "netPriceMinor": 2999, "currencyOptionsMinor": { "SEK": 32900, "EUR": 2750 } }Read the binding period from bindingContract.duration
Price.boundMonthsis replaced byPrice.bindingContract.duration, which carries the unit alongside the count:// 2026-08-21.auk { "boundMonths": 12 } // 2026-09-01.bullfinch { "bindingContract": { "duration": { "unit": "MONTHS", "value": 12 } } }bindingContractis absent when the price has no binding period, exactly asboundMonthswas, so the check for “is this price bound” moves rather than changing shape.Read
unit. Do not assume it.MONTHSis its only value today. A client that readsvaluealone will report a term in the wrong unit on the day another unit is added. That is why this field replaced a bare month count.Stop calling POST /orders/{orderId}/calculate-price
The platform calculates an order’s price again each time the order changes, and the call that made the change returns the result.
POST /orders,PUT /orders/{orderId}, and the add-on and line-item endpoints all carry the newpricingin their own response. A second call reads back a value you already have.When you need the current pricing without changing anything, read it off the order:
curl "{BASE_URL}/orders/{orderId}" \ --header 'X-Api-Key: YOUR_API_KEY' \ --header 'Api-Revision: 2026-09-01.bullfinch'On
2026-09-01.bullfinchthe removed endpoint responds404with the error codeendpoint_removed. On2026-08-21.aukit keeps working until that revision is retired.Send the new revision and verify
Send
Api-Revision: 2026-09-01.bullfinchon a single non-production call and compare the response against what you store. When it matches, set the header everywhere.curl "{BASE_URL}/orders/{orderId}" \ --header 'X-Api-Key: YOUR_API_KEY' \ --header 'Api-Revision: 2026-09-01.bullfinch'If you generate a client, generate it from the revision’s own OpenAPI document. The reference on this site always documents the current revision, so it stops matching you the moment a newer one ships.
Change inventory
Every field and operation each revision changed. The steps above cover the same ground, in the order you do the work. Use this list to check your own integration.
From 2026-08-21.auk to 2026-09-01.bullfinch
2026-08-21.auk is served until 2026-12-01.
Removed the deprecated order pricing amounts in major currency units. Read the integer *Minor field instead: subtotalMinor, taxAmountMinor, totalMinor, totalDiscountsMinor, recurringAmountMinor, initialInvoiceAmountMinor, amountMinor.
OrderLineItemPricing.initialInvoiceAmountOrderLineItemPricing.recurringAmountOrderLineItemPricing.subtotalOrderLineItemPricing.taxAmountOrderLineItemPricing.totalOrderLineItemPricing.totalDiscountsOrderListItem.pricing.totalOrderPricingDiscount.amountOrderPricingSummary.initialInvoice.subtotalOrderPricingSummary.initialInvoice.taxAmountOrderPricingSummary.initialInvoice.totalOrderPricingSummary.recurringCosts.subtotalOrderPricingSummary.recurringCosts.taxAmountOrderPricingSummary.recurringCosts.totalOrderPricingSummary.subtotalOrderPricingSummary.taxAmountOrderPricingSummary.totalTaxBreakdownItem.amount
Removed netPrice, currencyOptions and balance, the deprecated amounts in major currency units. Read netPriceMinor, currencyOptionsMinor and balanceMinor instead.
Price.currencyOptionsPrice.netPriceUsageVoiceIldPackage.balance
Removed Price.boundMonths. Read bindingContract.duration instead, which carries the unit alongside the count.
Price.boundMonths
Removed POST /orders/{orderId}/calculate-price. The order endpoints return the current price as pricing, and the platform calculates it again each time the order changes. The removed call only read back what GET /orders/{orderId} returns.
POST /orders/{orderId}/calculate-price
This affects the following operations. An integration calling none of them can move to 2026-09-01.bullfinch without changing anything.
GET /customers/{customerId}/product-catalogGET /invoices/{invoiceId}POST /invoices/{invoiceId}/mark-paidGET /licensesPOST /licensesGET /licenses/{licenseId}POST /licenses/{licenseId}/cancelPUT /licenses/{licenseId}/product-offering-changeGET /licenses/{licenseId}/product-offering-optionsGET /ordersPOST /ordersGET /orders/{orderId}PUT /orders/{orderId}POST /orders/{orderId}/approvePOST /orders/{orderId}/calculate-pricePOST /orders/{orderId}/cancelPOST /orders/{orderId}/submitGET /product-offeringsGET /product-offerings/{productOfferingId}GET /subscribers/{subscriberId}PUT /subscribers/{subscriberId}GET /subscriptionsPOST /subscriptionsGET /subscriptions/usageGET /subscriptions/{subscriptionId}POST /subscriptions/{subscriptionId}/activateGET /subscriptions/{subscriptionId}/addon-optionsGET /subscriptions/{subscriptionId}/addonsPOST /subscriptions/{subscriptionId}/addonsPOST /subscriptions/{subscriptionId}/addons/cancelPUT /subscriptions/{subscriptionId}/addons/product-offering-changeGET /subscriptions/{subscriptionId}/addons/product-offering-optionsPOST /subscriptions/{subscriptionId}/block-simPOST /subscriptions/{subscriptionId}/cancelPOST /subscriptions/{subscriptionId}/change-simPOST /subscriptions/{subscriptionId}/in-portingPOST /subscriptions/{subscriptionId}/pausePUT /subscriptions/{subscriptionId}/product-offering-changeGET /subscriptions/{subscriptionId}/product-offering-optionsPOST /subscriptions/{subscriptionId}/restorePOST /subscriptions/{subscriptionId}/suspendGET /subscriptions/{subscriptionId}/usage
This affects the following webhook events. The webhook revision of your account decides which shape they carry, and it moves only when you move it.
license.activatedlicense.cancelledlicense.createdlicense.endedlicense.renewedlicense.updatedorder.cancelledorder.createdorder.expiredorder.lineItemStatusChangedorder.statusChangedorder.submittedorder.updatedsubscription.activatedsubscription.cancelledsubscription.createdsubscription.endedsubscription.first_activatedsubscription.pausedsubscription.portIn.completedsubscription.portIn.createdsubscription.portIn.failedsubscription.portIn.updatedsubscription.quotaNotificationsubscription.renewedsubscription.restoredsubscription.subscriber_setsubscription.suspendedsubscription.updated