You're reading version 2023-03-15, which is not the latest. The latest is 2026-04-01: open the 2026-04-01 introduction.
Migration Guide
Migrating to 2026-04-01
Summary
This guide covers migrating from Insurance API version 2023-03-15 to 2026-04-01, spanning three version jumps (2023-03-15 to 2024-06-01 to 2025-01-01 to 2026-04-01). The major changes are: all collection endpoints have moved from /insurance-collection/ to a shared, top-level /collections resource, the collection request body has moved from an untyped input map to a typed parameters array, policyholder fields have been consolidated into a new Holder object, the premium fields have been collected in the Premium object, several monetary fields have changed from plain integers to MonetaryAmount objects, and collection status values now use underscores instead of spaces.
Breaking Changes
Endpoint paths restructured
All collection-related endpoints have moved from /insurance-collection/ to a shared, top-level /collections resource, with the insurance data read from a product sub-path. The company availability endpoint has also moved.
| Old Endpoint | New Endpoint |
|---|---|
POST /insurance-collection/collect-info | POST /collections |
GET /insurance-collection/get-data/{collectionId} | GET /collections/{collectionId}/insurance/data |
GET /insurance-collection/status/{collectionId} | GET /collections/{collectionId}/status |
POST /insurance-collection/supplement-info | POST /collections/{collectionId}/supplement-info |
GET /insurance-collection/collection/{collectionId}/policy/{policyId}/document/{documentId} | GET /collections/{collectionId}/insurance/policy/{policyId}/document/{documentId} |
GET /insurance-company/status | GET /companies/availability |
GET /insurance-collection/get-parameters | Removed |
GET /insurance-collection/parameters/{country} | Removed |
Action: Update all API endpoint URLs, and remove calls to /insurance-collection/get-parameters and /insurance-collection/parameters/{country}.
Collection request body uses typed parameters
POST /collections takes an InitiateCollectionRequest. The insuranceCompany field is renamed to company, and the untyped input map and the separate consents field are replaced by a single typed parameters array. loginMethod must still be sent as a top-level field (a LOGIN_METHOD entry in parameters is ignored), and the Swedish values are unchanged.
| Old request | New parameter |
|---|---|
input.SWEDISH_PERSONAL_NUMBER (BankID login methods) | SwedishBankIdParameter: { "type": "SWEDISH_BANKID", "personalNumber": "…" } |
input.USERNAME (EMAIL login method) | EmailParameter: { "type": "EMAIL", "email": "…" } |
consents: [{ "type": "TRADE_UNION_MEMBERSHIP" }] | TradeUnionConsentParameter: { "type": "TRADE_UNION_CONSENT", "value": true } |
input.SESSION_ID / ADVISOR_HANDLE / EXTERNAL_REFERENCE | attributes.sessionId / advisorHandle / externalReference on a SessionMetadataParameter (type: SESSION_METADATA) |
// 2023-03-15
{
"insuranceCompany": "se-lansforsakringar",
"loginMethod": "SWEDISH_MOBILE_BANKID_OTHER_DEVICE",
"input": { "SWEDISH_PERSONAL_NUMBER": "199001011234" }
}
// 2026-04-01
{
"company": "se-lansforsakringar",
"loginMethod": "SWEDISH_MOBILE_BANKID_OTHER_DEVICE",
"parameters": [
{ "type": "SWEDISH_BANKID", "personalNumber": "199001011234" }
]
}All Swedish BankID login methods, including the _TEST and _MOCK variants, use the same SWEDISH_BANKID parameter.
The trade-union consent only matters if your integration is set up to require consent for sensitive data; it then decides whether policy documents are collected. A leftover consents array is ignored rather than rejected, so without a TRADE_UNION_CONSENT parameter the consent counts as not given.
Action: Rename insuranceCompany to company and convert each input key, consent and session identifier into a typed entry in parameters.
Policyholder fields moved to Holder object
Across all insurance types (InsuranceCar, InsuranceHome, InsuranceVilla, InsuranceIncome, InsuranceOtherVehicle, and others), the following flat fields have been removed and consolidated into a new holder field of type Holder:
insuranceHolderName→holder.nameinsuranceHolderEmail→holder.emailinsuranceHolderPhoneNumber→holder.phoneNumberinsuranceHolderStreetAddress→holder.streetAddressinsuranceHolderPostalCode→holder.postalCodeinsuranceHolderCity→holder.cityotherInsuranceHolder→holder.otherInsuranceHolder
Action: Replace all reads of insurance.insuranceHolderName, insurance.insuranceHolderEmail, etc. with the corresponding fields on insurance.holder.
Premium fields moved into premium
premiumAmountYearRounded, premiumFrequency and paymentMethod have been removed from the insurance object. Use the premium object (Premium) instead:
2023-03-15 | 2026-04-01 |
|---|---|
premiumAmountYearRounded (integer) | Removed. Use premium.amount, a MonetaryAmount object, together with premium.period, which says what period the amount covers. When premium.period is YEARLY_PREMIUM_PERIOD, premium.amount is the yearly premium |
premiumFrequency | premium.paymentFrequency (same values: 1, 2, 4, 12, 0 or -1) |
paymentMethod | premium.paymentMethod |
A Swedish premium in 2026-04-01 looks like this:
"premium": {
"@market": "se",
"amount": { "amount": 2355, "currency": "SEK" },
"period": "YEARLY_PREMIUM_PERIOD",
"paymentFrequency": 12,
"paymentMethod": "AUTOGIRO"
}Action: Read the premium amount from premium.amount instead of premiumAmountYearRounded, and check premium.period to see what period it covers. Read the payment frequency from premium.paymentFrequency and the payment method from premium.paymentMethod.
Changes inside the existing premium object
Only relevant if you already read the premium object in 2023-03-15. Its fields are renamed, and the MonetaryAmount object in premium.amount is restructured:
2023-03-15 | 2026-04-01 |
|---|---|
premium.amount.minorUnitAmount (integer, öre) | premium.amount.amount (number, kronor). The value is 100 times smaller, so remove any division by 100 |
premium.amount.currencyCode (enum) | premium.amount.currency (string, ISO 4217) |
premium.frequency | premium.period (YEARLY_PREMIUM_FREQUENCY → YEARLY_PREMIUM_PERIOD, UNKNOWN_PREMIUM_FREQUENCY → UNKNOWN_PREMIUM_PERIOD) |
premium.taxation | Removed |
Action: Update your reads of these fields to the new names.
Fields changed from integer to MonetaryAmount
Several fields that were previously plain integers are now MonetaryAmount objects:
discountAmounton all insurance typesanimalPurchasePrice,veterinaryCareAmount,veterinaryCareAmountRemainingon InsuranceAnimalinsuredMovablesAmounton InsuranceCottage, InsuranceFarm, InsuranceHome, InsuranceVillainsuredMonthlyAmount,insuredAmounton InsuranceIncomeinsuredAmountBaseEconomicalDisability,insuredAmountBaseMedicalDisability,insuredAmountLife,insuredAmountMaxMedicalDisabilityon InsuranceAccident, InsuranceChildinsuredAmountLifeon InsuranceLifeinsuredAmountBaseMedicalDisabilityon InsurancePregnancy
The values themselves are unchanged and still in kronor: discountAmount: 500 becomes discountAmount: { "amount": 500, "currency": "SEK" }.
Action: Update your code to read field.amount and field.currency instead of using the integer value directly.
Removed fields
The following fields have been removed from all insurance types that previously had them:
externalId: the same value is now returned asidon each item in the data response, next toinsurance(see FullInsuranceWrapper)premiumAmountYearRoundedpremiumFrequencyveterinaryCareCoveredon InsuranceAnimalnumberOfToiletson InsuranceVilla
The premium fields premiumAmountYearRounded, premiumFrequency and paymentMethod have moved into the premium object (see Premium fields moved into premium above).
Action: Read id on the data response item instead of insurance.externalId. Use the premium object instead of premiumAmountYearRounded and premiumFrequency. Remove any usage of veterinaryCareCovered and numberOfToilets.
CollectionStatus field renames
On CollectionStatusResponse, returned by GET /collections/{collectionId}/status:
insuranceCompanyrenamed tocompanystatusvalues are renamed and split (see Collection status values renamed and split below)
On CollectionStatusInformationMap:
requiredInputTypesrenamed toREQUIRED_INPUT_TYPESAUTOSTART_TOKEN, the precompiledbankid:///app link, has been removed. Build the link fromSWEDISH_MOBILE_BANKID_AUTOSTART_TOKEN, which is unchanged
Action: Rename collectionStatus.insuranceCompany to collectionStatus.company. Rename informationMap.requiredInputTypes to informationMap.REQUIRED_INPUT_TYPES. Stop reading AUTOSTART_TOKEN.
Supplement-info request changed
POST /insurance-collection/supplement-info is replaced by POST /collections/{collectionId}/supplement-info. The collection ID moves from the request body into the path, and the body is the object you previously sent in supplementalInformation, without the wrapper.
The body types that apply to Swedish insurance collections:
| When | Body |
|---|---|
The status is CONTACT_FORM_PENDING: send the values listed under REQUIRED_INPUT_TYPES in extraInformation | CollectionInput: { "type": "COLLECTION_INPUT", "items": [{ "type": "EMAIL", "value": "…" }, { "type": "MOBILE_PHONE_NUMBER", "value": "…" }] } |
You use the SWEDISH_MOBILE_BANKID_SAME_DEVICE_CLIENT_SIDE_AUTHENTICATION login method: send the response to the INSTRUCTIONS request | ResponseObject: { "type": "RESPONSE_OBJECT", "response": …, "headers": { "Set-Cookie": ["…"] } } |
In RESPONSE_OBJECT, each header value is now a list of strings instead of a single string, because some headers (such as Set-Cookie) can repeat.
Action: Move the collection ID into the path and send one of the typed bodies above.
parameters moved into coverage
The parameters list on each item in the data response has moved into a new coverage object: read coverage.parameters instead of parameters. The parameter entries themselves are unchanged.
Action: Read coverage.parameters instead of parameters.
Collection status values renamed and split
In 2023-03-15, status values were space-separated (for example COMPLETED PARTIAL). In 2026-04-01 every value uses underscores, WAITING FOR AUTHENTICATION is renamed to AUTHENTICATION_TIMEOUT, and FAILED, LOGIN and CONTACT FORM are split into more specific statuses:
2023-03-15 status | 2026-04-01 status | When |
|---|---|---|
RUNNING | RUNNING | |
LOGIN | LOGIN | |
LOGIN | WAITING_FOR_USER_ACTION | The user needs to sign in BankID for authentication to continue |
COLLECTING | COLLECTING | |
COMPLETED | COMPLETED | |
COMPLETED PARTIAL | COMPLETED_PARTIAL | |
COMPLETED EMPTY | COMPLETED_EMPTY | |
INCORRECT CREDENTIALS | INCORRECT_CREDENTIALS | |
KYC FORM | KYC_FORM | |
CUSTOMER ENROLLMENT REQUIRED | CUSTOMER_ENROLLMENT_REQUIRED | |
CONTACT FORM | CONTACT_FORM | |
CONTACT FORM | CONTACT_FORM_PENDING | The company asks for the user's contact details. Send them through supplement-info (see Supplement-info request changed) and the collection continues |
WAITING FOR AUTHENTICATION | AUTHENTICATION_TIMEOUT | |
AUTHENTICATION CONFLICT | AUTHENTICATION_CONFLICT | |
AUTHENTICATION CANCELLED | AUTHENTICATION_CANCELLED | |
AUTHENTICATION MISMATCH | AUTHENTICATION_MISMATCH | |
FAILED | FAILED | |
FAILED | THIRD_PARTY_ERROR | The collection failed due to an error on the company's end |
FAILED | AUTHENTICATION_ERROR | Sign-in failed for a reason that doesn't match a more specific status, for example when the chosen login method can't be used at the company |
See Collection statuses for what each 2026-04-01 status means and how to act on it.
Action: Update every comparison against a status value to the 2026-04-01 name, and handle each of the values a single old status is now split into.
CompanyAvailability field renames
insuranceCompanyrenamed tocompanyinsuranceCompanyDisplayNamerenamed tocompanyDisplayName- New field:
companyGroup - New
statusvalueDEGRADED_PERFORMANCE: the company is experiencing intermittent issues; collections can still be attempted but may fail or return incomplete data
Action: Rename insuranceCompany to company and insuranceCompanyDisplayName to companyDisplayName. Handle the DEGRADED_PERFORMANCE status.
InsuranceCar fields removed
The usedForWork and insuranceLevel fields have been removed from InsuranceCar.
Action: Remove usage of usedForWork and insuranceLevel.
New Features
New collection endpoints
DELETE /collections/{collectionId}— delete a collection and its associated data
New field on InsuranceChild
insuredPersonDateOfBirth (the insured child's date of birth, YYYY-MM-DD) has been added to InsuranceChild. It is only available for some companies and is absent when it could not be determined.
Migration Checklist
- Update
Insurely-Versionheader to2026-04-01 - Update all endpoint URLs from
/insurance-collection/to/collections/, and read data from/collections/{collectionId}/insurance/data - Rename
insuranceCompanytocompanyin the collection request, and moveinput,consentsand session identifiers into the typedparametersarray - Update company availability endpoint from
/insurance-company/statusto/companies/availability - Replace all
insuranceHolder*field reads with the newholderobject - Read the premium from the
premiumobject:premium.amounttogether withpremium.period(replacespremiumAmountYearRounded),premium.paymentFrequency(waspremiumFrequency) andpremium.paymentMethod(waspaymentMethod) - If you read the
premiumobject before: use the renamed fieldspremium.amount.amount,premium.amount.currencyandpremium.period - Update all integer monetary fields to read from
MonetaryAmountobjects (e.g.,discountAmount.amount) - Read
idon the data response item instead ofinsurance.externalId - Read
coverage.parametersinstead ofparameters - Send supplement-info to
/collections/{collectionId}/supplement-infowith the typed body directly - Build the BankID app link from
SWEDISH_MOBILE_BANKID_AUTOSTART_TOKENinstead ofAUTOSTART_TOKEN - Rename
insuranceCompanytocompanyon the status response andCompanyAvailability - Rename
insuranceCompanyDisplayNametocompanyDisplayNameonCompanyAvailability - Rename
requiredInputTypestoREQUIRED_INPUT_TYPESonCollectionStatusInformationMap - Handle the
DEGRADED_PERFORMANCEcompany availability status - Update status handling to the
2026-04-01status names (includingWAITING FOR AUTHENTICATION→AUTHENTICATION_TIMEOUT), and the values thatFAILED,LOGINandCONTACT FORMare split into - Remove usage of deleted fields:
usedForWork,insuranceLevel,veterinaryCareCovered,numberOfToilets - Test end-to-end collection flow with new endpoints and response shapes
Field Mapping Table
| Object | Old | New | Change |
|---|---|---|---|
| All insurance types | insuranceHolderName (string) | holder.name (Holder) | Moved to Holder |
| All insurance types | insuranceHolderEmail (string) | holder.email (Holder) | Moved to Holder |
| All insurance types | insuranceHolderPhoneNumber (string) | holder.phoneNumber (Holder) | Moved to Holder |
| All insurance types | insuranceHolderStreetAddress (string) | holder.streetAddress (Holder) | Moved to Holder |
| All insurance types | insuranceHolderPostalCode (string) | holder.postalCode (Holder) | Moved to Holder |
| All insurance types | insuranceHolderCity (string) | holder.city (Holder) | Moved to Holder |
| All insurance types | externalId (string) | id on FullInsuranceWrapper (string) | Moved |
| All insurance types | premiumAmountYearRounded (integer) | -- | Removed (use premium.amount and premium.period) |
| All insurance types | premiumFrequency (integer) | premium.paymentFrequency (integer) | Moved into premium |
| All insurance types | paymentMethod (string) | premium.paymentMethod (string) | Moved into premium |
| MonetaryAmount | minorUnitAmount (long, minor units) | amount (decimal, major units) | Replaced — semantic change |
| MonetaryAmount | currencyCode (enum) | currency (string) | Renamed, type relaxed |
| Premium | frequency (string enum) | period (string enum) | Renamed |
| Premium | taxation (string enum) | -- | Removed |
| All insurance types | discountAmount (integer) | discountAmount (MonetaryAmount) | Type changed |
| InsuranceAnimal | animalPurchasePrice (integer) | animalPurchasePrice (MonetaryAmount) | Type changed |
| InsuranceAnimal | veterinaryCareAmount (integer) | veterinaryCareAmount (MonetaryAmount) | Type changed |
| InsuranceAnimal | veterinaryCareAmountRemaining (integer) | veterinaryCareAmountRemaining (MonetaryAmount) | Type changed |
| InsuranceCottage | insuredMovablesAmount (integer) | insuredMovablesAmount (MonetaryAmount) | Type changed |
| InsuranceFarm | insuredMovablesAmount (integer) | insuredMovablesAmount (MonetaryAmount) | Type changed |
| InsuranceHome | insuredMovablesAmount (integer) | insuredMovablesAmount (MonetaryAmount) | Type changed |
| InsuranceVilla | insuredMovablesAmount (integer) | insuredMovablesAmount (MonetaryAmount) | Type changed |
| InsuranceIncome | insuredAmount (integer) | insuredAmount (MonetaryAmount) | Type changed |
| InsuranceIncome | insuredMonthlyAmount (integer) | insuredMonthlyAmount (MonetaryAmount) | Type changed |
| InsuranceAccident | insuredAmountBaseEconomicalDisability (integer) | insuredAmountBaseEconomicalDisability (MonetaryAmount) | Type changed |
| InsuranceAccident | insuredAmountBaseMedicalDisability (integer) | insuredAmountBaseMedicalDisability (MonetaryAmount) | Type changed |
| InsuranceAccident | insuredAmountLife (integer) | insuredAmountLife (MonetaryAmount) | Type changed |
| InsuranceAccident | insuredAmountMaxMedicalDisability (integer) | insuredAmountMaxMedicalDisability (MonetaryAmount) | Type changed |
| InsuranceChild | insuredAmountBaseEconomicalDisability (integer) | insuredAmountBaseEconomicalDisability (MonetaryAmount) | Type changed |
| InsuranceChild | insuredAmountBaseMedicalDisability (integer) | insuredAmountBaseMedicalDisability (MonetaryAmount) | Type changed |
| InsuranceChild | insuredAmountLife (integer) | insuredAmountLife (MonetaryAmount) | Type changed |
| InsuranceChild | insuredAmountMaxMedicalDisability (integer) | insuredAmountMaxMedicalDisability (MonetaryAmount) | Type changed |
| InsuranceLife | insuredAmountLife (integer) | insuredAmountLife (MonetaryAmount) | Type changed |
| InsurancePregnancy | insuredAmountBaseMedicalDisability (integer) | insuredAmountBaseMedicalDisability (MonetaryAmount) | Type changed |
| InsuranceAnimal | veterinaryCareCovered (integer) | -- | Removed |
| InsuranceVilla | numberOfToilets (integer) | -- | Removed |
| CollectionStatusResponse | insuranceCompany (string) | company (string) | Renamed |
| CollectionStatusInformationMap | requiredInputTypes | REQUIRED_INPUT_TYPES | Renamed |
| CompanyAvailability | insuranceCompany (string) | company (string) | Renamed |
| CompanyAvailability | insuranceCompanyDisplayName (string) | companyDisplayName (string) | Renamed |
| InsuranceCar | usedForWork (boolean) | -- | Removed |
| InsuranceCar | insuranceLevel (string) | -- | Removed |
| FullInsuranceWrapper | parameters (array) | coverage.parameters (array) | Moved into coverage |