Skip to main content

Migrating from Digital Onboarding

This guide covers Liechtenstein Life Invest. Move offer creation from /graphql/partner to /graphql/partner-platform. Keep your existing Partner Life link. Continue completing and submitting the application in Partner Life.

1. Change the endpoint​

Use the same API base URL as your existing integration. For testing, use Stable.

SettingOld APINew API
Endpoint/graphql/partner/graphql/partner-platform
AuthorizationBearer <PARTNER_API_TOKEN>Same token mechanism; use your partner API token
Broker headerMay already be presentAlways send x-partner-id: <BROKER_ID>
Offer operationcreateOffer(input:) or createUser(user:)createOffer(input:)

2. Move the fields​

Use the table for the operation you call today. The new operation is always createOffer(input:).

If you currently use createOffer​

All paths below start inside the mutation's input argument. For the new API, LLI means liechtensteinLifeInvest.

Old fieldNew fieldWhat to do
customer.newCustomerLLI.associatedPersons[].person.newCustomerMove the customer into the persons list.
customer.customerIdLLI.associatedPersons[].person.existingCustomer.byID.IDUse this instead when the customer already exists.
insuranceProductConfiguration.liechtensteinLifeInvest.policyConfigurationLLI.productConfigurationMove startDate, ageWhenPolicyEnds, monthlyPremium, and additionalPayment here.
insuranceProductConfiguration.liechtensteinLifeInvest.investmentStrategyLLI.productConfiguration.investmentStrategyMove the investment details here. Apply the sustainability changes below.

Inside person.newCustomer:

Old customer fieldNew customer fieldWhat to do
email, firstName, lastNameSame namesKeep the values.
dateOfBirth, gender, maritalStatus, nationality, addressSame namesKeep the values.
taxIdentificationtaxIdentificationRequired for a new policyholder.
profession.professionprofessionSend a string. This is now required.
profession.occupationoccupationSend a string if available.
phoneNumber.valuemobilePhoneSend the international phone number as a string.
localeLLI.productConfiguration.languageMove this outside the customer. Map DE to DE_DE or EN to EN_US.
genderAtBirth, consumerAppConfigurationNo matching fieldsRemove these from the offer request.

If you currently use createUser​

Old paths below start inside user. New paths start inside input. For the new API, LLI means liechtensteinLifeInvest, and person means LLI.associatedPersons[].person.newCustomer.

Old fieldNew fieldWhat to do
email, firstName, lastName, address, taxIdentificationSame names under personMove the customer details here.
personalDetails.dateOfBirth, personalDetails.gender, personalDetails.maritalStatus, personalDetails.nationalityperson.dateOfBirth, person.gender, person.maritalStatus, person.nationalityRemove the personalDetails wrapper.
professionV2.profession, professionV2.occupationperson.profession, person.occupationSend strings. profession is required.
phoneNumber.valueperson.mobilePhoneSend the international phone number as a string.
policyConfigurationV2LLI.productConfigurationMove the existing policy settings here.
investmentStrategyLLI.productConfiguration.investmentStrategyMove the investment details here.
incomeLLI.customerFinancialStatusMove the financial details. Income and expenses are now required.
paymentMethodLLI.customerFinancialStatus.paymentMethodMove the payment choice here. For direct debit, also send accountHolder.
healthLLI.insuredPersonsHealthStatusMove the health answers here.
lifeBenefit, deathBenefitLLI.beneficiaries.lifeBeneficiary, LLI.beneficiaries.deathBeneficiaryRebuild beneficiary details using the new input types.
localeLLI.productConfiguration.languageMap DE to DE_DE or EN to EN_US.
acceptedTermsAt, verifiedEmailAt, externalIdentityVerification, personalDetails.genderAtBirthNo matching fieldsRemove these from the offer request.

The LLI contract language accepts DE_DE, EN_US, or DE_CH. Old FR and IT locale values have no matching contract language. Agree the document language before switching those customers.

Sustainability fields​

These paths are relative to investmentStrategy.sustainabilityDetails.

Old fieldNew fieldWhat to do
userKnowledgeStatuscustomerKnowledgeStatusRename the field.
productConfigurationV2.percentagepercentageRemove the productConfigurationV2 wrapper.
productConfigurationV2.topicsToIncludetopicsToIncludeRemove the wrapper.
productConfigurationV2.topicsToExcludetopicsToExcludeRemove the wrapper.
productConfigurationV2.environmentalAndSocialInvestmentFocusLevelenvironmentalAndSocialInvestmentFocusLevelRemove the wrapper.

If you still use the older productConfiguration.aims input, contact us for the mapping before switching.

3. Add the required fields​

All paths below start inside input.liechtensteinLifeInvest. Some fields are new. Others were optional in the old API and are now required. If you already collect a value, move the actual value into the new field.

Required fieldWhat to send
associatedPersons[].roleAssign all five roles: POLICY_HOLDER, INSURED_PERSON, PAYER, MAILING, and ECONOMIC_INTEREST. One person can hold all five when that matches the application.
associatedPersons[].person.newCustomer.dateOfBirth, gender, maritalStatus, nationality, addressRequired for a new customer. The old createUser request could omit these details.
associatedPersons[].person.newCustomer.professionThe customer's profession. Required when creating a new customer.
associatedPersons[].person.newCustomer.taxIdentificationTax information for a new policyholder. The policyholder also needs an email address.
customerFinancialStatus.policyReasonThe reason for the contract, such as PRIVATE_PENSION.
customerFinancialStatus.moneyOriginThe source of the premiums, such as EARNED_INCOME.
customerFinancialStatus.totalMonthlyNetIncomeMonthly net income in EUR cents.
customerFinancialStatus.totalMonthlyExpensesMonthly expenses in EUR cents.
customerFinancialStatus.paymentMethodEither wireTransfer: true or directDebit: { iban, accountHolder }.
insuredPersonsHealthStatus.hasCriticalIllnessThe insured person's actual answer: true or false.
productConfiguration.deathCoveragePercentageThe death coverage percentage selected for the application.
productConfigurationSupply startDate, ageWhenPolicyEnds, monthlyPremium, additionalPayment, and investmentStrategy. These details can no longer be omitted.
productConfiguration.investmentStrategySupply goals, riskLevel, sustainabilityDetails, and fundSelection. Include customerKnowledgeStatus and percentage in the sustainability details.

If hasCriticalIllness is true, also send criticalIllnessDetails. If policyReason or moneyOrigin is OTHER, send the corresponding policyReasonOtherText or moneyOriginOtherText.

Send these required values when creating the offer, before opening Partner Life. Do not use placeholder answers for customer declarations.

Keep the units correct​

  • Money uses EUR cents: 10000 means EUR 100.00. Values from the old policyConfigurationV2 already use cents.
  • If you still use the deprecated policyConfiguration input on createUser, its amounts use euros. Convert those amounts to cents once.
  • Dates use YYYY-MM-DD.
  • Fund percentages must total 100, with no duplicate funds and at most 10 funds.
  • Send rebalancingType explicitly to preserve your current choice. Without a partner-specific default, the old createOffer uses NONE and the new API uses NORMAL when the field is omitted.

4. Update the response handling​

Old APINew API
createOffer returns OfferResponse.offerId and customercreateOffer returns CreatedOffer.contractID
createUser can return a customer magicLinkUrlOffer creation does not return a customer login link
createUser creates the customer online account during onboardingFor new customers in this flow, the customer online account is created during policy pickup

A customer record on an offer is separate from the customer online account. Keep the Partner Life login link for the broker. Remove any step that expects a customer login link from offer creation.

Match existing customer IDs​

ID from the old APIField in the new customer responseMeaning
createUser.id or user.idconsumerIDThe customer online account ID. This can be null when no customer online account is linked yet.
createOffer.customer.id or customer.idIDThe person ID. Use this for Platform API customer lookups and existing-customer offer requests.

Look up the customer by email to read both IDs:

query CustomerIDs($email: Email!) {
customer(input: { email: $email }) {
__typename
... on CustomerInterface {
ID
consumerID
}
... on ErrorInterface {
message
}
}
}

Match consumerID against the consumer ID you already store. Store ID for new Platform API requests. Do not replace one with the other.

Read the creation result​

Use this mutation for the new API:

mutation CreateLLIOffer($input: CreateOfferInput!) {
createOffer(input: $input) {
__typename
... on CreatedOffer {
contractID
}
... on ErrorInterface {
message
}
... on InputValidationError {
invalidInput
}
}
}

Store contractID on success. Handle error results using __typename and message. Check top-level GraphQL errors as well.

5. Keep the Partner Life handoff​

  1. Create the offer through the new API.
  2. Keep the existing wait until the offer is available in Partner Life.
  3. Open Partner Life using your existing login and offer link.
  4. Complete and submit the application in Partner Life as you do today.

Check which identifier your existing offer link needs. The new creation result is contractID; the old offerId field is not returned. Do not assume these values are interchangeable.

The customer online account is created during policy pickup. No customer login step is needed when you create the offer.