This version, 2021-01-01, is deprecated. The latest is 2026-04-01: open the 2026-04-01 introduction.
Migration Guide
Migrating to 2026-04-01
Summary
This migration covers four version jumps (2021-01-01 -> 2023-03-15 -> 2024-06-01 -> 2025-01-01 -> 2026-04-01) and includes significant restructuring of the API. The collection endpoints have been reorganized under 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 dedicated Holder object, monetary integer fields have been replaced with MonetaryAmount objects, and the premium fields have been collected in the Premium object.
Breaking Changes
Endpoint paths restructured
All /insurance-collection/* and /insurance-company/* endpoints have been removed. Collections are now a shared, top-level /collections resource, with the insurance data read from a product sub-path.
Action: Update all endpoint URLs in your integration according to the mapping below.
| 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/get-parameters | Removed |
GET /insurance-collection/parameters/{country} | Removed |
GET /insurance-company/status | GET /companies/availability |
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) |
// 2021-01-01
{
"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" }
]
}Action: Rename insuranceCompany to company and convert each input key, consent and session identifier into a typed entry in parameters. See the 2025-01-01 migration guide for the full per-login-method mapping.
Policyholder fields moved to Holder object
The insuranceHolder* fields and otherInsuranceHolder have moved from individual insurance objects into a new Holder object, accessible via the holder field on each insurance type:
insuranceHolderName→holder.nameinsuranceHolderEmail→holder.emailinsuranceHolderPhoneNumber→holder.phoneNumberinsuranceHolderStreetAddress→holder.streetAddressinsuranceHolderPostalCode→holder.postalCodeinsuranceHolderCity→holder.cityotherInsuranceHolder→holder.otherInsuranceHolder
Action: Replace all reads of insuranceHolder* fields with the equivalent fields on the holder object. For example, change insurance.insuranceHolderName to insurance.holder.name and insurance.otherInsuranceHolder to insurance.holder.otherInsuranceHolder.
Removed fields from Insurance base object
The following fields have been removed from Insurance and all insurance type objects:
externalId: the same value is now returned asidon each item in the data response, next toinsurance(see FullInsuranceWrapper)premiumAmountYearRoundedpremiumFrequency
The premium fields premiumAmountYearRounded, premiumFrequency and paymentMethod have moved into the premium object (see Premium fields moved into premium below).
Action: Read id on the data response item instead of insurance.externalId, and use the premium object instead of premiumAmountYearRounded and premiumFrequency.
Integer monetary fields changed to MonetaryAmount
Multiple fields across insurance types that were previously plain integer values are now MonetaryAmount objects with amount and currency fields. This affects:
discountAmounton all insurance typesanimalPurchasePrice,veterinaryCareAmount,veterinaryCareAmountRemainingon InsuranceAnimalinsuredMovablesAmounton InsuranceCottage, InsuranceFarm, InsuranceHome, InsuranceVillainsuredAmountandinsuredMonthlyAmounton InsuranceIncomeinsuredAmountBaseEconomicalDisability,insuredAmountBaseMedicalDisability,insuredAmountLife,insuredAmountMaxMedicalDisabilityon InsuranceAccident, InsuranceChildinsuredAmountLifeon InsuranceLifeinsuredAmountBaseMedicalDisabilityon InsurancePregnancy
Action: Update all reads of these fields from field (integer) to field.amount (number) and field.currency (string).
Premium fields moved into premium
premiumAmountYearRounded, premiumFrequency and paymentMethod have been removed from the insurance object. Use the premium object (Premium) instead:
2021-01-01 | 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 2021-01-01. Its fields are renamed, and the MonetaryAmount object in premium.amount is restructured:
2021-01-01 | 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.
Removed fields on specific insurance types
usedForWorkremoved from InsuranceCarinsuranceLevelremoved from InsuranceCarveterinaryCareCoveredremoved from InsuranceAnimalnumberOfToiletsremoved from InsuranceVilla
Action: Remove any references to these fields in your code.
CompanyAvailability field renames
insuranceCompanyrenamed tocompanyinsuranceCompanyDisplayNamerenamed tocompanyDisplayName- New field
companyGroupadded - New
statusvalueDEGRADED_PERFORMANCE: the company is experiencing intermittent issues; collections can still be attempted but may fail or return incomplete data
Action: Update field references from insuranceCompany to company and insuranceCompanyDisplayName to companyDisplayName. Handle the DEGRADED_PERFORMANCE status.
CollectionStatus information map changes
In the CollectionStatusInformationMap (extraInformation on the status response):
AUTOSTART_TOKEN, the precompiledbankid:///app link, has been removed. Build the link fromSWEDISH_MOBILE_BANKID_AUTOSTART_TOKEN, which is unchanged.INSTRUCTIONSnow holds the instructions object that2021-01-01returned asINSTRUCTIONS_V2, andINSTRUCTIONS_V2has been removed. This only affects theSWEDISH_MOBILE_BANKID_SAME_DEVICE_CLIENT_SIDE_AUTHENTICATIONlogin method.
Action: Stop reading AUTOSTART_TOKEN and INSTRUCTIONS_V2. If you use client-side BankID authentication, read the instructions from INSTRUCTIONS.
Supplement-info
POST /insurance-collection/supplement-info is replaced by POST /collections/{collectionId}/supplement-info. In 2026-04-01 you may need it in these cases:
| 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": ["…"] } } |
Action: When you get CONTACT_FORM_PENDING, or if you use client-side BankID authentication, send the matching body to POST /collections/{collectionId}/supplement-info.
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. coverage also holds the insurance's documents.
Action: Read coverage.parameters instead of parameters.
Collection status values renamed and split
In 2021-01-01, status values were space-separated (for example COMPLETED PARTIAL), and LOGIN, USER INPUT, WAITING FOR AUTHENTICATION and FAILED each covered several different situations. In 2026-04-01 every value uses underscores, and each of those situations has its own status. WAITING FOR AUTHENTICATION itself is renamed to AUTHENTICATION_TIMEOUT:
2021-01-01 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 | |
USER INPUT | KYC_FORM | The company asks the user to fill in a KYC form before data can be collected |
USER INPUT | CUSTOMER_ENROLLMENT_REQUIRED | The user needs to sign up as a customer with the company before data can be collected |
USER INPUT | CONTACT_FORM | The company asks the user to fill in their contact details before data can be collected |
USER INPUT | CONTACT_FORM_PENDING | The company asks for contact details, and you can supply them through the supplement-info endpoint |
WAITING FOR AUTHENTICATION | AUTHENTICATION_TIMEOUT | The user did not authenticate in time |
WAITING FOR AUTHENTICATION | AUTHENTICATION_CANCELLED | The user cancelled the authentication |
WAITING FOR AUTHENTICATION | AUTHENTICATION_CONFLICT | Authentication was cancelled because of multiple ongoing authentication sessions |
WAITING FOR AUTHENTICATION | AUTHENTICATION_MISMATCH | The person who authenticated is not the person who started the collection |
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.
New Features
New collection endpoints
DELETE /collections/{collectionId}— delete a collection and its associated dataGET /collections/{collectionId}/insurance/policy/{policyId}/document/{documentId}— download policy documents
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 - Replace
/insurance-company/statuswith/companies/availability, and remove calls to/insurance-collection/get-parametersand/insurance-collection/parameters/{country} - Update
insuranceCompanytocompanyandinsuranceCompanyDisplayNametocompanyDisplayNamein company availability responses - Migrate all
insuranceHolder*field reads to the newholderobject - Read
idon the data response item instead ofinsurance.externalId - Read
coverage.parametersinstead ofparameters - Update all integer monetary fields to read from
MonetaryAmountobjects (.amountand.currency) - 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 - Build the BankID app link from
SWEDISH_MOBILE_BANKID_AUTOSTART_TOKENinstead ofAUTOSTART_TOKEN - Answer
CONTACT_FORM_PENDING, and send client-side BankID responses, through/collections/{collectionId}/supplement-info - Update status handling to the
2026-04-01status names, including the values thatUSER INPUT,WAITING FOR AUTHENTICATION,FAILEDandLOGINare split into - Remove references to
usedForWorkandinsuranceLevel(car),veterinaryCareCovered(animal) andnumberOfToilets(villa)
Field Mapping Table
| Object | Old | New | Change |
|---|---|---|---|
| Insurance | insuranceHolderName (string) | holder.name (string) | Moved to Holder |
| Insurance | insuranceHolderEmail (string) | holder.email (string) | Moved to Holder |
| Insurance | insuranceHolderPhoneNumber (string) | holder.phoneNumber (string) | Moved to Holder |
| Insurance | insuranceHolderStreetAddress (string) | holder.streetAddress (string) | Moved to Holder |
| Insurance | insuranceHolderCity (string) | holder.city (string) | Moved to Holder |
| Insurance | insuranceHolderPostalCode (string) | holder.postalCode (string) | Moved to Holder |
| Insurance | otherInsuranceHolder (boolean) | holder.otherInsuranceHolder (boolean) | Moved to Holder |
| Insurance | externalId (string) | id on FullInsuranceWrapper (string) | Moved |
| Insurance | paymentMethod (string) | premium.paymentMethod (string) | Moved into premium |
| Insurance | premiumAmountYearRounded (integer) | -- | Removed (use premium.amount and premium.period) |
| Insurance | premiumFrequency (integer) | premium.paymentFrequency (integer) | Moved into premium |
| MonetaryAmount | currencyCode (string enum) | currency (string) | Renamed |
| MonetaryAmount | minorUnitAmount (long, minor units) | amount (decimal, major units) | Replaced — semantic change |
| 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 |
| InsuranceCar | usedForWork (boolean) | -- | Removed |
| InsuranceCar | insuranceLevel (string) | -- | Removed |
| CompanyAvailability | insuranceCompany (string) | company (string) | Renamed |
| CompanyAvailability | insuranceCompanyDisplayName (string) | companyDisplayName (string) | Renamed |
| FullInsuranceWrapper | parameters (array) | coverage.parameters (array) | Moved into coverage |