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.
| Setting | Old API | New API |
|---|---|---|
| Endpoint | /graphql/partner | /graphql/partner-platform |
| Authorization | Bearer <PARTNER_API_TOKEN> | Same token mechanism; use your partner API token |
| Broker header | May already be present | Always send x-partner-id: <BROKER_ID> |
| Offer operation | createOffer(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 field | New field | What to do |
|---|---|---|
customer.newCustomer | LLI.associatedPersons[].person.newCustomer | Move the customer into the persons list. |
customer.customerId | LLI.associatedPersons[].person.existingCustomer.byID.ID | Use this instead when the customer already exists. |
insuranceProductConfiguration.liechtensteinLifeInvest.policyConfiguration | LLI.productConfiguration | Move startDate, ageWhenPolicyEnds, monthlyPremium, and additionalPayment here. |
insuranceProductConfiguration.liechtensteinLifeInvest.investmentStrategy | LLI.productConfiguration.investmentStrategy | Move the investment details here. Apply the sustainability changes below. |
Inside person.newCustomer:
| Old customer field | New customer field | What to do |
|---|---|---|
email, firstName, lastName | Same names | Keep the values. |
dateOfBirth, gender, maritalStatus, nationality, address | Same names | Keep the values. |
taxIdentification | taxIdentification | Required for a new policyholder. |
profession.profession | profession | Send a string. This is now required. |
profession.occupation | occupation | Send a string if available. |
phoneNumber.value | mobilePhone | Send the international phone number as a string. |
locale | LLI.productConfiguration.language | Move this outside the customer. Map DE to DE_DE or EN to EN_US. |
genderAtBirth, consumerAppConfiguration | No matching fields | Remove 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 field | New field | What to do |
|---|---|---|
email, firstName, lastName, address, taxIdentification | Same names under person | Move the customer details here. |
personalDetails.dateOfBirth, personalDetails.gender, personalDetails.maritalStatus, personalDetails.nationality | person.dateOfBirth, person.gender, person.maritalStatus, person.nationality | Remove the personalDetails wrapper. |
professionV2.profession, professionV2.occupation | person.profession, person.occupation | Send strings. profession is required. |
phoneNumber.value | person.mobilePhone | Send the international phone number as a string. |
policyConfigurationV2 | LLI.productConfiguration | Move the existing policy settings here. |
investmentStrategy | LLI.productConfiguration.investmentStrategy | Move the investment details here. |
income | LLI.customerFinancialStatus | Move the financial details. Income and expenses are now required. |
paymentMethod | LLI.customerFinancialStatus.paymentMethod | Move the payment choice here. For direct debit, also send accountHolder. |
health | LLI.insuredPersonsHealthStatus | Move the health answers here. |
lifeBenefit, deathBenefit | LLI.beneficiaries.lifeBeneficiary, LLI.beneficiaries.deathBeneficiary | Rebuild beneficiary details using the new input types. |
locale | LLI.productConfiguration.language | Map DE to DE_DE or EN to EN_US. |
acceptedTermsAt, verifiedEmailAt, externalIdentityVerification, personalDetails.genderAtBirth | No matching fields | Remove 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 field | New field | What to do |
|---|---|---|
userKnowledgeStatus | customerKnowledgeStatus | Rename the field. |
productConfigurationV2.percentage | percentage | Remove the productConfigurationV2 wrapper. |
productConfigurationV2.topicsToInclude | topicsToInclude | Remove the wrapper. |
productConfigurationV2.topicsToExclude | topicsToExclude | Remove the wrapper. |
productConfigurationV2.environmentalAndSocialInvestmentFocusLevel | environmentalAndSocialInvestmentFocusLevel | Remove 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 field | What to send |
|---|---|
associatedPersons[].role | Assign 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, address | Required for a new customer. The old createUser request could omit these details. |
associatedPersons[].person.newCustomer.profession | The customer's profession. Required when creating a new customer. |
associatedPersons[].person.newCustomer.taxIdentification | Tax information for a new policyholder. The policyholder also needs an email address. |
customerFinancialStatus.policyReason | The reason for the contract, such as PRIVATE_PENSION. |
customerFinancialStatus.moneyOrigin | The source of the premiums, such as EARNED_INCOME. |
customerFinancialStatus.totalMonthlyNetIncome | Monthly net income in EUR cents. |
customerFinancialStatus.totalMonthlyExpenses | Monthly expenses in EUR cents. |
customerFinancialStatus.paymentMethod | Either wireTransfer: true or directDebit: { iban, accountHolder }. |
insuredPersonsHealthStatus.hasCriticalIllness | The insured person's actual answer: true or false. |
productConfiguration.deathCoveragePercentage | The death coverage percentage selected for the application. |
productConfiguration | Supply startDate, ageWhenPolicyEnds, monthlyPremium, additionalPayment, and investmentStrategy. These details can no longer be omitted. |
productConfiguration.investmentStrategy | Supply 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:
10000means EUR 100.00. Values from the oldpolicyConfigurationV2already use cents. - If you still use the deprecated
policyConfigurationinput oncreateUser, 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
rebalancingTypeexplicitly to preserve your current choice. Without a partner-specific default, the oldcreateOfferusesNONEand the new API usesNORMALwhen the field is omitted.
4. Update the response handling
| Old API | New API |
|---|---|
createOffer returns OfferResponse.offerId and customer | createOffer returns CreatedOffer.contractID |
createUser can return a customer magicLinkUrl | Offer creation does not return a customer login link |
createUser creates the customer online account during onboarding | For 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 API | Field in the new customer response | Meaning |
|---|---|---|
createUser.id or user.id | consumerID | The customer online account ID. This can be null when no customer online account is linked yet. |
createOffer.customer.id or customer.id | ID | The 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
- Create the offer through the new API.
- Keep the existing wait until the offer is available in Partner Life.
- Open Partner Life using your existing login and offer link.
- 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.